目前我正在使用numpy来完成这项工作.但是,因为我正在处理具有数千行/列的矩阵,后来这个数字将达到数万,我想知道是否存在可以更快地执行此类计算的包?
计算矩阵的特征值有多贵?
最佳算法的复杂性是什么?
如果我有一个1000 x 1000的矩阵,在实践中需要多长时间?我认为如果矩阵稀疏会有帮助吗?
是否存在特征值计算不会终止的情况?
在R,我可以计算特征值,如下面的玩具示例所示:
m<-matrix( c(13,2, 5,4), ncol=2, nrow=2 )
eigen(m, only.values=1)
$values
[1] 14 3
Run Code Online (Sandbox Code Playgroud)
有谁知道它使用什么算法?
是否还有其他(开源)软件包可以计算特征值?
我有一个非常大的稀疏矩阵,表示马尔可夫链中的过渡马赛克,即矩阵的每一行的总和等于1,我有兴趣找到第一个特征值及其相应的小于1的向量.我知道特征值在[-1,1]部分中有界,它们都是实数(非复数).
我试图使用python scipy.sparse.eigs函数计算值,但是,函数的一个参数是要估计的特征值/向量的数量,每次我增加要估计的参数数量时,特征值的数量就是精确的一个人也成长了.
不用说,我正在使用which带有值的参数'LR'为了得到k个最大的特征值,k是要估计的值的数量.
有没有人知道如何解决这个问题(找到小于1的第一个特征值及其相应的向量)?
我试图找到一个矩阵的特征值乘以它的转置,但我不能用numpy做.
testmatrix = numpy.array([[1,2],[3,4],[5,6],[7,8]])
prod = testmatrix * testmatrix.T
print eig(prod)
Run Code Online (Sandbox Code Playgroud)
我希望得到以下产品结果:
5 11 17 23
11 25 39 53
17 39 61 83
23 53 83 113
Run Code Online (Sandbox Code Playgroud)
和特征值:
0.0000
0.0000
0.3929
203.6071
Run Code Online (Sandbox Code Playgroud)
相反,我ValueError: shape mismatch: objects cannot be broadcast to a single shape在乘以testmatrix它的转置时得到了.
这在MatLab中工作(乘法,而不是代码),但我需要在python应用程序中使用它.
有人能告诉我我做错了什么吗?
我princomp在R中用来执行PCA.我的数据矩阵很大(10K x 10K,每个值最多4个小数点).在Xeon 2.27 GHz处理器上需要大约3.5小时和~6.5 GB的物理内存.
由于我只想要前两个组件,有没有更快的方法呢?
更新:
除了速度之外,还有一种内存有效的方法吗?
用于计算前两个组件需要大约2小时和~6.3 GB的物理内存svd(,2,).
我想在OpenCV中实现快速PLDA(概率线性判别分析).在这个LINK快速PLDA已经实现Matlab和Python.PLDA的一部分是LDA.我编写了以下用于在OpenCV中实现LDA的代码:
int LDA_dim = 120;
// Load data
FileStorage fs("newStorageFile.yml", FileStorage::READ);
// Read data
Mat train_data, train_labels;
fs["train_data"] >> train_data;
fs["train_labels"] >> train_labels;
// LDA
if (LDA_dim > 0)
{
LDA lda(LDA_dim);
lda.compute(train_data, train_labels); // compute eigenvectors
Mat eigenvectors = lda.eigenvectors();
}
Run Code Online (Sandbox Code Playgroud)
我已将上面链接中引入的数据库转换.mat为.yml.结果是newStorageFile.yml我上传到了这里.train_data有650行和600列,train_labels有650行和1列.我不知道为什么特征向量和特征值变为零!! PLZ帮我修复此代码.
最好将转换数据的代码.mat带到.yml:
function matlab2opencv( variable, fileName, flag)
[rows cols] = size(variable);
% Beware of Matlab's linear indexing …Run Code Online (Sandbox Code Playgroud) 我想使用Python 2.6.5计算大型矩阵(约1000x1000)的特征值.我一直无法做到这一点.我还没有发现任何其他线程来解决这个问题.
我跑的时候
a = rand(1000,1000);
tic;
for i =1:10
eig(a);
end
toc;
Run Code Online (Sandbox Code Playgroud)
在MATLAB中大约需要30秒.Python中的类似测试需要216秒.使用RPy通过R运行它并没有明显加快计算速度.Octave的测试耗时93秒.我对速度上的差异感到有点困惑.
我可以在网上找到这样一个问题的唯一例子就是这个,这已经有好几年了.该问题中的海报有一个不同的Python目录结构(我将其归因于帖子的年龄,虽然我可能会弄错),所以我没有足够的信心尝试按照记者发布的说明进行操作.
我的包管理器说我安装了LAPACK,我使用NumPy和SciPy进行Python计算:
from numpy import *
from scipy import *
from numpy.linalg import *
import time
a = randn(1000,1000)
tic = time.clock()
for i in range(0,10):
eig(a)
toc = time.clock()
print "Elapsed time is ", toc-tic
Run Code Online (Sandbox Code Playgroud)
我是Python的新手,所以我可能做了些傻事.如果我需要提供更多信息,请告诉我.
我在Matlab上使用了一个函数:
[V,D] = eig(C);
Run Code Online (Sandbox Code Playgroud)
我看到V和D总是按升序排序.它是否总是那样,或者我应该在获得V和D价值后对它们进行排序?
我已经搜索过很多但是我找不到任何关于两种方法'eig'和'eigs'如何不同的答案.从它们收到的特征值和特征向量之间有什么区别?
我试图用以下运动方程计算阻尼结构的特征值lambda:
(lambda ^ 2*M + lambda*C + K)*x = 0.
其中M,C和K是稀疏矩阵.使用Matlab的polyeig函数可以工作,但我想进入更大的系统并利用我的矩阵的稀疏性.我使用状态空间线性化来获得广义特征值问题,如下所示:
(A - lambda*B)*z = 0,
同
A = [ K,0 ; 0, - M ],
B = [ - C, - M ; - M,0 ],
z = [ x ; lambda*x ]
用Matlab的eigs函数解决这个问题:
lambda = eigs(A,B,10,'sm')
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
lambda =
1.0e+03 *
-0.2518 - 1.3138i
-0.2518 …Run Code Online (Sandbox Code Playgroud) eigenvalue ×10
eigenvector ×4
matlab ×4
python ×4
matrix ×3
numpy ×3
r ×2
scipy ×2
c++ ×1
math ×1
opencv ×1
pca ×1
probability ×1