【发布时间】:2018-09-07 11:49:59
【问题描述】:
我想从here 创建一个指数平滑权重数组,如公式 (7.2) 中所示。我知道递归定义,但需要实际权重。我想出了以下简单的实现:
import numpy as np
def create_weights(n, alpha = 1.0):
wghts = alpha*(1-alpha)**np.arange(n)
return wghts
权重总和应为 1.0,但是,正如该测试所示,较小的 alpha 并非如此,我猜是由于浮点印象:
np.set_printoptions(precision=3)
for alpha in np.arange(1.0, 0.0, -0.1):
print("%.3f, %s, %.3f" % (alpha, create_weights(5, alpha) , create_weights(5, alpha).sum()))
Out:
1.000, [1. 0. 0. 0. 0.], 1.000
0.900, [9.e-01 9.e-02 9.e-03 9.e-04 9.e-05], 1.000
0.800, [0.8 0.16 0.032 0.006 0.001], 1.000
0.700, [0.7 0.21 0.063 0.019 0.006], 0.998
0.600, [0.6 0.24 0.096 0.038 0.015], 0.990
0.500, [0.5 0.25 0.125 0.062 0.031], 0.969
0.400, [0.4 0.24 0.144 0.086 0.052], 0.922
0.300, [0.3 0.21 0.147 0.103 0.072], 0.832
0.200, [0.2 0.16 0.128 0.102 0.082], 0.672
0.100, [0.1 0.09 0.081 0.073 0.066], 0.410
类似于解决方案here,我可以简单地“标准化”它,再次扩大规模:
def create_weights(n, alpha = 1.0):
wghts = alpha*(1-alpha)**np.arange(n)
wghts /= wghts.sum()
return wghts
这会导致:
1.000, [1. 0. 0. 0. 0.], 1.000
0.900, [9.e-01 9.e-02 9.e-03 9.e-04 9.e-05], 1.000
0.800, [0.8 0.16 0.032 0.006 0.001], 1.000
0.700, [0.702 0.211 0.063 0.019 0.006], 1.000
0.600, [0.606 0.242 0.097 0.039 0.016], 1.000
0.500, [0.516 0.258 0.129 0.065 0.032], 1.000
0.400, [0.434 0.26 0.156 0.094 0.056], 1.000
0.300, [0.361 0.252 0.177 0.124 0.087], 1.000
0.200, [0.297 0.238 0.19 0.152 0.122], 1.000
0.100, [0.244 0.22 0.198 0.178 0.16 ], 1.000
虽然现在总和为 1.0,但对于小 alpha,第一个权重与其预期值偏差太大(预期与 alpha 相同)。
是否有另一种方法来实现这一点来满足权重的两个属性,添加到 1.0(+-小误差)和第一个权重是 alpha(+-小误差)?
【问题讨论】:
-
我投票决定将此问题作为题外话结束,因为问题的前提是错误的。
标签: python numpy floating-point precision