python中的最小特征值

问题描述 投票:4回答:1

我想知道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 
python numpy scipy eigenvalue
1个回答
0
投票

您的玩具问题碰巧是通过迭代方法找到最大特征值的困难情况,因为您有多个围绕最大特征值聚集的特征值。

如果您替换

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

作者

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

scipy.sparse求解器的性能大不相同。

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

© www.soinside.com 2019 - 2024. All rights reserved.