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

chr*_*ris 5 python random scipy

我正在使用以下代码运行此SVD求解器scipy

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)
Run Code Online (Sandbox Code Playgroud)

我希望每次打印的平均值都相同,但是它会发生变化,并且似乎会循环显示一些最喜欢的值。由于低级优化/随机播种,我很高兴接受这种行为。

我不太明白的是为什么每次运行该脚本时它都会以相同的顺序输出相同的值。对我来说,这似乎是半确定性和半非确定性的。

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

Dou*_*gal 2

在没有测试我自己的情况下(现在在没有 Python shell 的平板电脑上),我相信这是由于与近似特征求解器库 ARPACK 使用的初始化起点相关的一些奇怪的行为,这就是最终调用的内容svds

如果您按照 中的 Python 代码进行操作svdsv0(有问题的起点)仅在 中_ArpackParams处理,其中它被设置为零并且info参数设置为0if v0 is None;否则,v0保持其值并且info1然后我们进入 Fortran 的龙领域,调用(如果矩阵是双精度)函数dsaupd,我没有完全检查该函数,但我假设最终会cgetv0在请求随机起点时调用。该函数似乎在第一次调用时将 LAPACK RNG 种子初始化为 1357 。

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

例如,您可以通过eigs在代码开头随机调用一个小矩阵来解决这个问题。