scipy linalg确定性/非确定性代码

时间:2015-05-17 10:43:39

标签: python random scipy

我使用以下代码从scipy运行此SVD解算器:

import numpy as np
from scipy.sparse.linalg import svds

features = np.arange(9,dtype=np.float64).reshape((3,3))
for i in range(10):
    _,_,V = svds(features,2)
    print i,np.mean(V)

我预计每次打印的平均值都是相同的,但它会发生变化,并且似乎会循环显示几个最喜欢的值。我很高兴接受这种行为是低水平优化/随机播种的结果。

我不太了解的原因是每次运行该脚本时它会以相同的顺序输出相同的值。对我而言,它似乎是半确定的,半非确定性的。

这个问题正在影响一些更复杂的处理,理解它会很好,所以我至少可以做一些hacky解决方法。

1 个答案:

答案 0 :(得分:1)

没有测试我自己(现在没有Python shell的平板电脑),我相信这是由于与近似的本征解析器ARPACK使用的初始化起点相关的一些奇怪的行为,这是{{1最终调用。

如果您遵循svds中的Python代码,则svds(相关起点)仅处理in _ArpackParams,其中它设置为零和v0如果info,参数设置为0;否则,v0 is None保留为其值,v0info。然后我们进入 Fortran的领域,调用(如果矩阵是双精度的)函数dsaupd,我没有完全检查但是我假设最终调用{{3当请求随机起始点时。第一次调用时,此函数显示为cgetv0

所以,如果你没有对ARPACK进行任何其他调用(或者可能是其他LAPACK事情,不确定它们如何相互作用),那么每次都使用相同的种子启动RNG,从而获得相同的结果每次初始化点;因此,假设这是算法中唯一的随机源,每次都会得到相同的答案序列。

你可以通过在代码开头随机抽取一个小矩阵1来解决这个问题。