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

我有一个由 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,并且值之间的增量应始终相等。


胡说叔叔
浏览 84回答 1
1回答

qq_花开花谢_0

这可以通过应用基本代数来解决。算术序列定义为A[i]&nbsp;=&nbsp;a&nbsp;+&nbsp;b*i,&nbsp;for&nbsp;i&nbsp;=&nbsp;0,&nbsp;1,&nbsp;2,&nbsp;3,&nbsp;...&nbsp;where&nbsp;a&nbsp;is&nbsp;the&nbsp;initial&nbsp;term元素序列 0 到 n 的总和是S&nbsp;=&nbsp;(A[0]&nbsp;+&nbsp;A[n])&nbsp;*&nbsp;(n+1)&nbsp;/&nbsp;2换句话说,第一个和列表项的总和乘以一半的项数。既然你知道S和n,你只需要再决定一个“传播”因子来生成你的序列。平均元素必须是1/n- 这是您的算法错误的地方,因为它会为偶数的n.您的代码在这组语句中失败:half_rng&nbsp;=&nbsp;rng&nbsp;/&nbsp;2 step_val&nbsp;=&nbsp;equal_perc&nbsp;/&nbsp;(rng&nbsp;-&nbsp;1) #&nbsp;comparing&nbsp;x&nbsp;to&nbsp;int(half_rng)如果rng是偶数,则将平均值分配给 position&nbsp;rng/2,从而为您提供诸如 4 个元素的列表:[0.417,&nbsp;0.333,&nbsp;0.25,&nbsp;0.167]这意味着您有两个大于所需平均值的元素,只有一个小于所需的平均值,这迫使总和超过 1.0。相反,当你有偶数个元素时,你必须让均值成为一个“幻影”中间元素,并在它周围采取半步。让我们用分数来看看:你已经有了[5/12,&nbsp;4/12,&nbsp;3/12,&nbsp;2/12]您的差异是 1/12 ...&nbsp;1 / (n * (n-1))...您需要将这些值降低半步。相反,您选择的散布 (1/12) 的解决方案将开始半步:从每个元素中减去 1/24。[9/24,&nbsp;7/24,&nbsp;5/24,&nbsp;3/24]你也可以用一个简单的线性因子来改变你的步数。用简单的整数决定你想要的元素的比率,例如5:4:3:2,然后从 5+4+3+2 的明显总和生成你的权重:[5/14,&nbsp;4/14,&nbsp;3/14,&nbsp;2/14]请注意,这适用于任何整数的算术序列,这是选择“传播”的另一种方式。如果你使用4:3:2:1你会得到[4/10,&nbsp;3/10,&nbsp;2/10,&nbsp;1/10]或者您可以将它们更紧密地聚集在一起,例如,13:12:11:10[13/46,&nbsp;12/46,&nbsp;11/46,&nbsp;10/46]所以......选择你想要的传播并简化你的代码以利用它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python