我在python中使用基本的快捷方法得到一个非常奇怪的错误.似乎,除非我非常愚蠢,否则我得到A = A + B和A + = B的不同值.这是我的代码:
def variance(phi,sigma,numberOfIterations):
variance = sigma
for k in range(1,numberOfIterations):
phik = np.linalg.matrix_power(phi,k)
variance = variance + phik*sigma*phik.T
return variance
Run Code Online (Sandbox Code Playgroud)
这基本上只计算向量自回归的协方差.因此对于:
phi = np.matrix('0.7 0.2 -0.1; 0.001 0.8 0.1; 0.001 0.002 0.9')
sigma = np.matrix('0.07 0.01 0.001; 0.01 0.05 0.004; 0.001 0.004 0.01')
Run Code Online (Sandbox Code Playgroud)
我明白了:
variance(phi,sigma,10) =
[[ 0.1825225 0.07054728 0.00430524]
[ 0.07054728 0.14837229 0.02659357]
[ 0.00430524 0.02659357 0.04657858]]
Run Code Online (Sandbox Code Playgroud)
这是正确的我相信(与Matlab一致).现在,如果我将上面的行更改为
variance += phik*sigma*(phik.T)
Run Code Online (Sandbox Code Playgroud)
我明白了:
variance(phi,sigma,10) =
[[ 0.34537165 0.20258329 0.04365378]
[ 0.20258329 0.33471052 0.1529369 ]
[ 0.04365378 0.1529369 0.19684553]]
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
非常感谢
担
罪魁祸首是:
variance = sigma
Run Code Online (Sandbox Code Playgroud)
如果您将其更改为:
variance = sigma.copy()
Run Code Online (Sandbox Code Playgroud)
你会看到正确的结果.
这是因为+=实际进行(更有效)就地另外...既然都variance和sigma引用相同的阵列,都将被更新.例如:
>>> sigma = np.array([1])
>>> variance = sigma
>>> variance += 3
>>> sigma
array([4])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |