如何确定给定N个元素列表的成比例递减权重?

2024-04-28 23:54:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由N个元素组成的列表。就上下文而言,我正在做一个时间序列预测,一旦做出了预测,我想对开始时做出的预测进行加权,因为它比以后的预测更重要。这很有用,因为当我计算性能错误分数(MAPE)时,该分数将代表每个项目的预测值,以及基于我想要识别好模型和坏模型的方式

我应该如何更新现有函数以获取任何元素列表(N)以生成这些稳步下降的权重?

这是我自己提出的函数。它适用于compute_equal_perc(5)等示例,但不适用于其他组合

def compute_equal_perc(rng):
    perc_allocation = []
    equal_perc = 1 / rng
    half_rng = rng / 2
    step_val = equal_perc / (rng - 1)
    print(step_val)

    for x in [v for v in range(0, rng)]:
        if x == int(half_rng):
            perc_allocation.append(equal_perc)
        elif x < int(half_rng):
            diff_plus = ((abs(int(half_rng) - x) * step_val)) + equal_perc
            perc_allocation.append(round(float(diff_plus), 3))
        elif x >= int(half_rng):
            diff_minus = equal_perc - ((abs(int(half_rng) - x) * step_val))
            perc_allocation.append(round(float(diff_minus), 3))
    return perc_allocation

对于compute_equal_perc(5),我得到的输出是:

[0.3, 0.25, 0.2, 0.15, 0.1]

此序列的sum应始终等于1,值之间的增量应始终相等


Tags: 元素列表stepdiff序列valequal分数
1条回答
网友
1楼 · 发布于 2024-04-28 23:54:31

这可以通过应用基本代数来解决。算术序列定义为

A[i] = a + b*i, for i = 0, 1, 2, 3, ... where a is the initial term

元素0到n的序列之和为

S = (A[0] + A[n]) * (n+1) / 2

换句话说,第一个和列表项的总和乘以项数的一半

因为您知道Sn,所以只需再决定一个“扩展”因子即可生成序列。平均元素必须是1/n这就是您的算法错误的地方,因为它在计算n的偶数值时出错


您的代码在这种语句耦合中失败:

half_rng = rng / 2
step_val = equal_perc / (rng - 1)
# comparing x to int(half_rng)

如果rng是偶数,则将平均值指定给位置rng/2,这样可以得到4个元素的列表:

[0.417, 0.333, 0.25, 0.167]

这意味着有两个元素比期望的平均值大,只有一个元素比期望的平均值小,迫使总和超过1.0。相反,当你有一个偶数的元素时,你必须使均值成为一个“幻影”中间元素,并绕着它走半步。让我们看看分数:你已经有了

[5/12, 4/12, 3/12, 2/12]

你的差距是1/121 / (n * (n-1))。。。你需要将这些值降低半步。相反,您选择的排列(1/12)的解决方案是开始向一侧移动半步:从每个元素中减去1/24

[9/24, 7/24, 5/24, 3/24]

你也可以用一个简单的线性因子来改变你的步长。确定元素的简单整数比率,例如5:4:3:2,然后从5+4+3+2的明显和生成权重:

[5/14, 4/14, 3/14, 2/14]

请注意,这适用于任何整数算术序列,这是选择“排列”的另一种方式。如果您使用4:3:2:1,您将得到

[4/10, 3/10, 2/10, 1/10]

或者,您可以使用13:12:11:10将它们更紧密地聚集在一起

[13/46, 12/46, 11/46, 10/46]

所以。。。选择您想要的排列,并简化代码以利用这一点

相关问题 更多 >