python – scipy linalg确定性/非确定性代码
我使用以下代码从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解决方法. 解决方法
没有测试我自己(现在没有Python shell的平板电脑),我相信这是由于与近似的本征解析器ARPACK使用的初始化起点相关的一些奇怪的行为,这是svds最终调用的.
如果你遵循 所以,如果你没有对ARPACK进行任何其他调用(或者可能是其他LAPACK事情,不确定它们如何相互交互),那么每次都会使用相同的种子启动RNG,从而每次获得相同的初始化点时间;因此,假设这是算法中随机性的唯一来源,每次都会得到相同的答案序列. 你可以通过在代码开头随机调用一个小矩阵上的eigs来解决这个问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |