加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:49:52 所属栏目:Python 来源:网络整理
导读:我使用以下代码从scipy运行这个 SVD求解器: import numpy as npfrom scipy.sparse.linalg import svdsfeatures = np.arange(9,dtype=np.float64).reshape((3,3))for i in range(10): _,_,V = svds(features,2) print i,np.mean(V) 我希望每次打印的平均值都
我使用以下代码从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最终调用的.

如果你遵循svds的Python代码,v0(有问题的起点)只处理in _ArpackParams,它被设置为零,如果v0是None,则info参数设置为0;否则,v0保持为其值,信息为1.然后我们进入龙Fortran的领域,调用(如果矩阵是双倍的)函数dsaupd,我没有完全检查,但我假设最终调用cgetv0当请求随机起始点时.该功能在第一次调用时显示在initialize the LAPACK RNG seed to 1357.

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

你可以通过在代码开头随机调用一个小矩阵上的eigs来解决这个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读