我有一个矩阵100x100,我发现它是最大的特征值.现在我需要找到对应于这个特征值的特征向量.我怎样才能做到这一点?
到目前为止,我使用 numpy.linalg.eigvals 来计算具有至少 1000 行/列的二次矩阵的特征值,并且在大多数情况下,其条目的大约五分之一非零(我不知道这是否应该被视为稀疏矩阵)。我发现另一个主题表明 scipy 可能会做得更好。
但是,由于我必须计算数十万个大小不断增加的大型矩阵的特征值(可能高达 20000 行/列,是的,我需要它们的所有特征值),因此这总是需要很长时间。如果我能加快速度,即使是最微小的一点,那很可能是值得的。
所以我的问题是:在不限制自己使用 python 的情况下,是否有更快的方法来计算特征值?
python performance eigenvalue sparse-matrix adjacency-matrix
GCN后的CIFAR数据集代码如下:
xtx = np.dot(dataset.train_data[i].transpose(), dataset.train_data[i])
e, q = np.linalg.eigh(xtx)
print(np.max(e), np.min(e))
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
2.65138e+07 -0.00247511
Run Code Online (Sandbox Code Playgroud)
这是不一致的,因为它xtx是对称正半定的。我的猜测是,这可能是由于较早地应用了 GCN,但最小特征值仍然不接近 0?
更新:所以我的矩阵的条件数是 8.89952e+09。实际上我之前忘记取出平均值,所以现在最大特征值是~573,而最小值是-7.14630133e-08。我的问题是我正在尝试做 ZCA。在这种情况下,我应该如何进行?向xtx或向特征值添加对角线 petrubtion ?
我正在计算协方差矩阵的特征值,该矩阵是实数且对称正半定的。因此,特征值和特征向量应该都是实数,但是numpy.linalg.eig()返回具有(几乎)零虚部的复数值。
协方差矩阵太大,无法在此处发布,但特征值如下
[1.38174e01+00j, 9.00153e00+00j, ....]
Run Code Online (Sandbox Code Playgroud)
向量中最大的虚部在 处可以忽略不计-9.7557e-16j。
我认为这里存在一些机器精度问题,因为显然虚部可以忽略不计(并且考虑到我的协方差矩阵是实数正半定义)。
有没有办法抑制使用 numpy eig (或 scipy)返回虚部?我试图避免使用 if 语句来检查特征值对象是否复杂,然后仅将其设置为真实组件(如果可能)。
如何找出与特定特征值对应的特征向量?
我有一个随机矩阵(P),其中一个特征值是1.我需要找到对应于特征值1的特征向量.
scipy函数scipy.linalg.eig返回特征值和特征向量的数组.
D, V = scipy.linalg.eig(P)
Run Code Online (Sandbox Code Playgroud)
这里D(值的数组)和V(矢量的数组)都是矢量.
一种方法是在D中进行搜索并在V中提取相应的特征向量.有更简单的方法吗?
我一直在做一些几何数据分析(GDA),例如主成分分析(PCA)。我想绘制一个相关圆......这些看起来有点像这样:
![1]](https://i.stack.imgur.com/2pjd8.png)
基本上,它允许测量变量的特征值/特征向量与数据集的主成分(维度)相关的扩展。
任何人都知道是否有绘制此类数据可视化的python包?
我正在尝试解决 python 中的多项式特征值问题,并且我需要像 matlab 中的 polyeig 这样的函数,是否有任何库能够执行此操作?
我试图解决的问题是这样的
c0+c1*alpha+c2*alpha**2+c3*alpha**3=0
其中 c 是矩阵,alpha 是给定问题的特征值。
假设我们对依赖于参数 t 的厄密矩阵 h(t) 的特征值和特征向量感兴趣。我的矩阵又大又稀疏,因此需要进行数值处理。
一种简单的方法是在离散化参数值 t_k 处评估矩阵 h(t_k)。是否可以根据“特征向量的特征”对特征向量和特征值进行排序?
让我用下面的简单例子来说明我所说的“特征向量的特征”是什么意思(i 表示虚数单位)。
h(t) = {{1, i t}, {-i t, 1}}
特征值为 1-t 和 1+t,具有相应的特征向量 {-i, 1} 和 {i, 1}。因此,根据“特征向量特征”进行排序,特征值应该在 t = 0 处交叉。然而,大多数特征求解器通过增加特征值来对它们进行排序,将特征向量从负交换为正 t(参见代码和输出图)。
import numpy as np
import scipy.sparse.linalg as sla
import matplotlib.pyplot as plt
def h(t):
# parametrized hermitian matrix
return np.array([[1, t*1j], [-t*1j, 1]])
def eigenvalues(t):
# convert to tuple for np.vectorize to work
return tuple(sla.eigsh(h(t), k=2, return_eigenvectors=False))
eigenvalues = np.vectorize(eigenvalues)
t = np.linspace(-1, 1, num=200) …Run Code Online (Sandbox Code Playgroud) 我在 Tensorflow 中使用特征分解,发现它非常慢。下面的代码显示了 Tensorflow 的速度与 numpy 和 scipy 的比较:
import numpy as np
import scipy as sp
import tensorflow as tf
from time import time
A = np.random.randn(400, 400)
A_tf = tf.constant(A)
cur = time()
d, v = sp.linalg.eig(A)
print(f'sp: {time() - cur:4.2f} s')
cur = time()
d, v = np.linalg.eig(A)
print(f'np: {time() - cur:4.2f} s')
cur = time()
d, v = tf.linalg.eig(A_tf)
print(f'tf: {time() - cur:4.2f} s')
Run Code Online (Sandbox Code Playgroud)
这给出了以下输出:
sp: 0.09 s
np: 0.08 s
tf: 5.04 s
Run Code Online (Sandbox Code Playgroud)
对这里有什么想法吗?
我正在寻找在 Matlab 中解决广义特征向量和特征值问题。为此,我测试了2种方法。
然后,我们可以在每一边乘以 B^(-1),例如:
所以,从理论角度来看,这是一个简单而经典的特征值问题。
最后,在 Matlab 中,我简单地使用A=FISH_sp和进行了操作B=FISH_xc:
[Phi, Lambda] = eig(inv(FISH_xc)*FISH_sp);
Run Code Online (Sandbox Code Playgroud)
但是,当我在简单的费舍尔综合之后得到的结果不正确(约束太糟糕,而且还出现了nan值。我不知道为什么我没有得到与下面第二个相同的结果。
总而言之,所使用的算法在第 7 页进行了描述。我已经遵循了该算法的所有步骤,当我进行 Fisher 综合时,它似乎给出了更好的结果。
这里是感兴趣的部分(抱歉,我认为 Stakoverflow 上没有 Latex):
这是我的这个方法的小 Matlab 脚本:
% Diagonalize A = FISH_sp and B = Fish_xc
[V1,D1] = eig(FISH_sp);
[V2,D2] = eig(FISH_xc);
% Applying each step of algorithm 1 on page 7
phiB_bar = V2*(D2.^(0.5)+1e-10*eye(7))^(-1);
barA = inv(phiB_bar)*FISH_sp*phiB_bar;
[phiA, vA] = eig(barA);
Phi = phiB_bar*phiA;
Run Code Online (Sandbox Code Playgroud)
所以最后,我找到了 phi 特征向量矩阵 (phi) 和 lambda …
eigenvalue ×10
python ×7
eigenvector ×5
numpy ×3
matlab ×2
scipy ×2
correlation ×1
diagonal ×1
lapack ×1
pca ×1
performance ×1
r ×1
tensorflow ×1