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

克里斯

我正在使用以下代码运行此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)

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

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

这个问题正在影响一些更复杂的处理,很高兴了解它,因此我至少可以做一些棘手的解决方法。

djs

我没有进行自我测试(目前在没有Python shell的平板电脑上),我相信这是由于与近似特征生成器库ARPACK所使用的初始化起点有关的某种奇怪行为,最终被svds调用。

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

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

您可以通过eigs在代码开始时随机调用一个小矩阵多次来解决此问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章