gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:55 24 4
gpt4 key购买 nike

我正在运行这个 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)

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

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

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

最佳答案

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

如果您按照 svds 中的 Python 代码进行操作, v0(有问题的起点)仅处理 in _ArpackParams ,如果 v0 为 None,则将其设置为零并将 info 参数设置为 0;否则,v0 保留为它的值,info1。然后我们进入 dragons Fortran 领域,调用(如果矩阵是 double 矩阵)函数 dsaupd ,我没有完全检查,但我假设最终会调用 cgetv0当请求随机起点时。此功能出现在initialize the LAPACK RNG seed to 1357第一次被调用。

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

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

关于python - scipy linalg 确定性/非确定性代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30286014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com