gpt4 book ai didi

python - python中的最小特征值

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:35 28 4
gpt4 key购买 nike

我想知道 numpy 是否有有效的实现来计算对称矩阵的最大或最小特征值,如果可能的话没有全谱分解。我发现以下模块实现了特征分解:

  1. scipy.linalg;
  2. numpy linalg;
  3. scipy sparse linalg.

scipy/sparse/linalg/eigsh可以输出k个最小(最大)的特征值和特征向量;scipy/linalg/eigh 还提供了选择特征值子集的选项;numpy/linalg/eigvalsh 输出所有特征值。但是,如果我只想要一个特定的特征值,它们似乎都没有效率。

我运行了一些玩具示例来比较寻找最大特征值所花费的时间。所有的方法都给出了足够接近的解,numpy.linalg 中的特征分解函数似乎是最有效的,认为它需要全谱分解。有没有更好的方法来完成这项工作?

这里是测试代码和解决方案

import numpy as np
import scipy.linalg
import scipy.sparse.linalg
import time


def test_scipy_eig(a):
p = a.shape[0]
w = scipy.linalg.eigh(a, eigvals=[p-1, p-1], eigvals_only=True)
return w


def test_scipy_sparse_eig(a):
p = a.shape[0]
w = scipy.sparse.linalg.eigsh(a, k=1, which='LA', return_eigenvectors=False)
return w


def test_numpy_eig(a):
w = np.linalg.eigvalsh(a)
return w


p = 2000
a = np.random.normal(0,1,(p,p))
b = a.dot(a.T)

start = time.time()
w1 = test_scipy_eig(b)
t1 = time.time() - start


start = time.time()
w2 = test_numpy_eig(b)
t2 = time.time() - start


start = time.time()
w3 = test_scipy_sparse_eig(b)
t3 = time.time() - start
print "time expense:\n scipy:%f numpy:%f scipy_sparse:%f " % (t1, t2, t3)

print "largest eigenvalue:\n scipy:%f numpy:%f scipy_sparse:%f " % (w1[0], w2[-1], w3[0])

输出

time expense:
scipy:1.427211 numpy:1.395954 scipy_sparse:4.520002
largest eigenvalue:
scipy:7949.429984 numpy:7949.429984 scipy_sparse:7949.429984

最佳答案

您的玩具问题恰好是通过迭代方法找到最大特征值的困难案例,因为您有几个特征值聚集在最大的特征值周围。

如果你更换

a = np.random.normal(0,1,(p,p))

通过

a = np.random.rand(p, p)

您从 scipy.sparse 求解器中获得非常不同的性能。

您正在寻找的答案是:正确的使用方法取决于您手头的问题,并且不能通过使用玩具示例来确定,除非玩具示例的特征值和稀疏结构以及大小与实际相似您正在尝试解决的问题。

关于python - python中的最小特征值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24418534/

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