我想在Python中找到稀疏矩阵的N个最小特征值.我尝试过使用该scipy.sparse.linalg.eigen.arpack软件包,但计算最小的特征值时速度非常慢.我在某处看到有一个移位反转模式,但是当我尝试使用它时,我收到一条错误消息,告诉我还没有支持shift-invert模式.关于我应该如何进行的任何想法?
我试图计算矩阵的PCA.
有时,得到的特征值/向量是复数值,因此当试图通过将特征向量矩阵与点坐标相乘来将点投影到较低维度平面时,得到以下警告
ComplexWarning: Casting complex values to real discards the imaginary part
Run Code Online (Sandbox Code Playgroud)
在那行代码中 np.dot(self.u[0:components,:],vector)
我用来计算PCA的整个代码
import numpy as np
import numpy.linalg as la
class PCA:
def __init__(self,inputData):
data = inputData.copy()
#m = no of points
#n = no of features per point
self.m = data.shape[0]
self.n = data.shape[1]
#mean center the data
data -= np.mean(data,axis=0)
# calculate the covariance matrix
c = np.cov(data, rowvar=0)
# get the eigenvalues/eigenvectors of c
eval, evec = la.eig(c)
# u = eigen vectors (transposed) …Run Code Online (Sandbox Code Playgroud) 我有一个矩阵100x100,我发现它是最大的特征值.现在我需要找到对应于这个特征值的特征向量.我怎样才能做到这一点?
要运行Canonical对应分析(cca包ade4),我需要一个正定方差矩阵.(理论上总是如此)但是:
matrix(c(2,59,4,7,10,0,7,0,0,0,475,18714,4070,97,298,0,1,0,17,7,4,1,4,18,36),nrow=5)
> a
[,1] [,2] [,3] [,4] [,5]
[1,] 2 0 475 0 4
[2,] 59 7 18714 1 1
[3,] 4 0 4070 0 4
[4,] 7 0 97 17 18
[5,] 10 0 298 7 36
> eigen(var(a))
$values
[1] 6.380066e+07 1.973658e+02 3.551492e+01 1.033096e+01
[5] -1.377693e-09
Run Code Online (Sandbox Code Playgroud)
最后本征值是-1.377693e-09,其是<0但理论框架值为> 0
如果本征值中的一个是我不能运行功能<0
我真的不知道如何解决这个问题而不改变函数cca()的代码
感谢帮助
到目前为止,我使用 numpy.linalg.eigvals 来计算具有至少 1000 行/列的二次矩阵的特征值,并且在大多数情况下,其条目的大约五分之一非零(我不知道这是否应该被视为稀疏矩阵)。我发现另一个主题表明 scipy 可能会做得更好。
但是,由于我必须计算数十万个大小不断增加的大型矩阵的特征值(可能高达 20000 行/列,是的,我需要它们的所有特征值),因此这总是需要很长时间。如果我能加快速度,即使是最微小的一点,那很可能是值得的。
所以我的问题是:在不限制自己使用 python 的情况下,是否有更快的方法来计算特征值?
python performance eigenvalue sparse-matrix adjacency-matrix
当使用带有OpenCV(OSX)的Python 2.7.5时,我在一系列图像上运行PCA(cols是像素,行是按照这个答案的帧.
如何获得与特征向量对应的特征值?看起来它是C++中PCA对象的属性,但Python等价物PCACompute()是一个简单的函数.
省略PCA这样一个关键部分似乎很奇怪.
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 ?
在我的例子中,我正在编写代码来计算非常大的矩阵的经典多维缩放(缩写为MDS). nnn = 500,000
在MDS一步,我需要计算创3个特征值及其对应的特征向量的n通过n矩阵.该矩阵称为B矩阵.我只需要这三个特征向量和特征值.计算大矩阵的特征向量和特征值的常用方法需要很长时间,而且我不需要非常准确的答案,因此我正在寻找特征向量和特征值的估计.
一些参数:
我的问题:是否有快速估算这种大B矩阵的三个特征向量和特征值的方法?
我的进展:我找到了一种近似矩阵最高特征值的方法,但我不知道是否可以将其推广到最高的三个.我也发现这篇论文写于1996年,但它非常技术性,对我来说很难阅读.
我正在计算协方差矩阵的特征值,该矩阵是实数且对称正半定的。因此,特征值和特征向量应该都是实数,但是numpy.linalg.eig()返回具有(几乎)零虚部的复数值。
协方差矩阵太大,无法在此处发布,但特征值如下
[1.38174e01+00j, 9.00153e00+00j, ....]
Run Code Online (Sandbox Code Playgroud)
向量中最大的虚部在 处可以忽略不计-9.7557e-16j。
我认为这里存在一些机器精度问题,因为显然虚部可以忽略不计(并且考虑到我的协方差矩阵是实数正半定义)。
有没有办法抑制使用 numpy eig (或 scipy)返回虚部?我试图避免使用 if 语句来检查特征值对象是否复杂,然后仅将其设置为真实组件(如果可能)。
我有两个矩阵,其中一个矩阵的特征谱的一部分与另一个矩阵的特征谱非常相似,但我(目前)能够验证这一点的唯一方法是非常不优雅的。
我对任何解决方案都持开放态度,但为了在此处展示我所寻求的示例,我发现使用 MATLAB 语法最简单:在第一个示例中,我将定义矩阵,A并且B在B中也可以找到 的两个特征值A,以及相应的两个特征向量ofB也是A具有相同特征值的特征向量,但是如果不取其特征B值共享的特征向量A并“搜索”以查看这些相同的特征向量在 中是否具有相同的特征值,则这并不明显A。
下面是两个这样的矩阵A和的示例B:
A = diag([1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1]);
B = diag([19.9385 7.6177 17.2969 9.6177 11.3208 -1 8.6792 1 11.3208 -1 8.6792 1 19.9385 7.6177 17.2969 9.6177]);
B(2,1) = 9.2832; B(4,3)=B(2,1); B(14,13)=-B(2,1); B(16,15)=-B(2,1);
B = tril(B,-1)'+B; % Make it …Run Code Online (Sandbox Code Playgroud) eigenvalue ×10
python ×6
eigenvector ×3
matrix ×3
numpy ×3
pca ×2
r ×2
algorithm ×1
c++ ×1
matlab ×1
opencv ×1
performance ×1
scipy ×1
statistics ×1