numpy 为什么这两个计算特征值的方法中的一个比另一个快?

slwdgvem  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(194)

我想求一个方阵的特征值。我尝试了两种不同的方法。

import numpy as np 
D = np.random.random((500,500))
eigenvalues, eigenvectors = np.linalg.eig(D)
%timeit np.linalg.eigvals(D)
129 ms ± 7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit eigenvectors@D@np.linalg.inv(eigenvectors)
42.2 ms ± 4.54 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

为什么第二种方法更快?eigvals算法不是应该更快吗?因为它优化得很好。我错过了什么?同样假设我们知道特征向量,并且我们不需要计算它。

pxiryf3j

pxiryf3j1#

但这两种代码做的是完全不同的事情。
第一个(你第一次计时)只计算特征值,而不使用你之前已经计算过的事实。
第二个并不真正计算特征值,而是计算对角矩阵(但无法这样做,因为您颠倒了计算顺序。np.linalg.inv(eigenvectors) @ D @ eigenvectors是对角矩阵(其对角线实际上由特征值组成)。你可能在一个例子中看到过这段代码,其中D是对角矩阵(顾名思义),然后你的代码计算出原始矩阵。这个计算假设特征向量是已知的。
因此,即使第二种方法是计算特征值的方法(我认为,计算整个对角矩阵以获得值的卷积方法),它也是一种要求您首先计算特征向量的方法(要做到这一点,您可能也需要计算特征值;至少我不知道一个有效的算法,可以计算特征向量而不计算特征值。这就是为什么numpy有一个只计算特征值的eigvals方法,和一个计算特征值和向量的eig方法,但没有只计算特征向量的eigvec方法:那是毫无意义;为什么有一个方法,做得更少,成本高达eig
所以,另一种说法是,如果你想比较时间,你应该加上第二个时间,你计算eigenvectors的成本。在我的PC上(显然比你的慢两倍),我需要277毫秒来计算eigvals,120毫秒来计算eigenvectors的对角矩阵,你必须加上我首先计算eigenvectors所需的360毫秒。
因此,eigvals的总时间为277 ms,而eig + P@D@P⁻¹为480 ms

相关问题