【问题标题】:scipy linalg deterministic/non-deterministic codescipy linalg 确定性/非确定性代码
【发布时间】:2015-05-17 10:43:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 非常有趣和有用的问题。在底层 SVD(或以下)中想不出任何完全随机的东西。
  • 奇怪的是,TruncatedSVD 默认有algorithm=random。可能是SVD的界面bug?
  • @Ami svds 使用默认随机初始化的迭代方法 (ARPACK)。为什么会是一致的,我不知道。
  • @Dougal 谢谢!我想我得重新考虑一下(目前想不出它是随机的理由)。
  • 也许归结为numpy.random 究竟是如何工作的问题,尤其是。 seed 未明确调用。也许您可以看看在调用之前立即调用它(使用一些固定值)是否可以使其再次具有确定性。

标签: python random scipy


【解决方案1】:

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

如果您从svds 开始执行Python 代码,则v0(有问题的起点)仅处理in _ArpackParams,其中它设置为零并且info 参数设置为0 if @ 987654332@;否则,v0 保留其值,info1。然后我们进入 dragons Fortran 的领域,调用(如果矩阵是双精度的)函数 dsaupd,我没有完全检查,但我假设最终调用 cgetv0 当一个要求随机起点。这个函数在第一次被调用时出现在initialize the LAPACK RNG seed to 1357

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

您可以绕过这个问题,例如,在代码开始时在一个小矩阵上随机调用 eigs

【讨论】:

  • 因为我知道我想要哪些平均值,所以我最终放入了一个 while 循环以等待求解器给我一个合理的值。
猜你喜欢
  • 2016-05-14
  • 2013-12-13
  • 2011-02-16
  • 2018-07-14
  • 1970-01-01
  • 2011-12-14
  • 2015-05-05
  • 1970-01-01
  • 2012-10-20
相关资源
最近更新 更多