我有一个由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,值之间的增量应始终相等
这可以通过应用基本代数来解决。算术序列定义为
元素0到n的序列之和为
换句话说,第一个和列表项的总和乘以项数的一半
因为您知道
S
和n
,所以只需再决定一个“扩展”因子即可生成序列。平均元素必须是1/n
这就是您的算法错误的地方,因为它在计算n
的偶数值时出错您的代码在这种语句耦合中失败:
如果
rng
是偶数,则将平均值指定给位置rng/2
,这样可以得到4个元素的列表:这意味着有两个元素比期望的平均值大,只有一个元素比期望的平均值小,迫使总和超过1.0。相反,当你有一个偶数的元素时,你必须使均值成为一个“幻影”中间元素,并绕着它走半步。让我们看看分数:你已经有了
你的差距是1/12
1 / (n * (n-1))
。。。你需要将这些值降低半步。相反,您选择的排列(1/12)的解决方案是开始向一侧移动半步:从每个元素中减去1/24你也可以用一个简单的线性因子来改变你的步长。确定元素的简单整数比率,例如
5:4:3:2
,然后从5+4+3+2的明显和生成权重:请注意,这适用于任何整数算术序列,这是选择“排列”的另一种方式。如果您使用
4:3:2:1
,您将得到或者,您可以使用
13:12:11:10
将它们更紧密地聚集在一起所以。。。选择您想要的排列,并简化代码以利用这一点
相关问题 更多 >
编程相关推荐