你推荐哪个java包来计算特征向量/特征值?我知道JMathTools和JAMA ; 你有这些包的赞成还是缺点?其他建议?
我想在MATLAB中实现用于确定矩阵的主导特征值和特征向量的幂方法。
到目前为止,这是我写的内容:
%function to implement power method to compute dominant
%eigenvalue/eigenevctor
function [m,y_final]=power_method(A,x);
m=0;
n=length(x);
y_final=zeros(n,1);
y_final=x;
tol=1e-3;
while(1)
mold=m;
y_final=A*y_final;
m=max(y_final);
y_final=y_final/m;
if (m-mold)<tol
break;
end
end
end
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,这是一个数字示例:
A=[1 1 -2;-1 2 1; 0 1 -1]
A =
1 1 -2
-1 2 1
0 1 -1
>> x=[1 1 1];
>> x=x';
>> [m,y_final]=power_method(A,x);
>> A*x
ans =
0
2
0
Run Code Online (Sandbox Code Playgroud)
与MATLAB中上述矩阵的特征值和特征向量进行比较时,我做到了:
[V,D]=eig(A)
V =
0.3015 -0.8018 0.7071
0.9045 -0.5345 0.0000
0.3015 -0.2673 0.7071
D …Run Code Online (Sandbox Code Playgroud) 当我试图在Matlab中找到具有重复特征值但没有缺陷的矩阵的特征分解时,它没有返回eignevectors的标准正交矩阵.例如:
k = 5;
repeats = 1;
% First generate a random matrix of eignevectors that is orthonormal
V = orth(rand(k));
% Now generate a vector of eigenvalues with the given number of repeats
D = rand(k,1);
for i = 1:repeats
% Put one random value into another (note this sometimes will result in
% less than the given number of repeats if we ever input the same
% number)
D(ceil(k*rand())) = D(ceil(k*rand()));
end
A = V'*diag(D)*V;
% Now test …Run Code Online (Sandbox Code Playgroud) 我注意到在多次运行eigs()函数后,每次它给出不同但近似的结果.
有没有办法每次都返回相同的结果?输出有时带有"+"符号或" - "符号.
M的内容:
[2, 1] = 1.0
[3, 1] = 0.5
[1, 2] = 1.0
[3, 2] = 2.5
[1, 3] = 0.5
[2, 3] = 2.5
M = M+M'
(d, v) = eigs(M, nev=1, which=:LR)
Run Code Online (Sandbox Code Playgroud)
我尝试在Python中的相同稀疏矩阵上运行相同的函数,尽管矩阵看起来有点不同,我认为它是相同的.左边的值从0开始编号.在朱莉亚,它们从1开始编号.我不知道这是否有很大差异.Julia和Python中的值大致相同,但在Python中,每次评估后它们总是相同的.此外返回蟒蛇值是复数,在朱莉娅真实.
Python代码:
MT的内容:
from scipy.sparse import linalg
(1, 0) 1.0
(2, 0) 0.5
(0, 1) 1.0
(2, 1) 2.5
(0, 2) 0.5
(1, 2) 2.5
eigenvalue, eigenvector = linalg.eigs(M.T, k=1, which='LR')
Run Code Online (Sandbox Code Playgroud)
知道为什么会发生这种行为吗?
编辑:
这些是对四次评估的结果 …
我有列矢量形式的N个特征值.因此,存在与这些特征值对应的N个本征向量,形成特征向量矩阵.
现在,我正在处理的问题要求我按降序对特征值列向量进行排序.如何按照与特征值相同的顺序对特征向量矩阵进行排序以保持对应?
我想通过有限差分方法解决PDE的特征值问题.因此我的问题被简化为矩阵特征值问题.问题是这个矩阵的大小会非常大,如果我使用该函数,eig它会搜索所有特征值和特征向量,这在我看来是浪费时间.
在找到第一个k特征值后,是否有可能使特征值算法停止?(其中k是一个小的正整数)
不确定这是否是包中的错误或由于其他原因,但我们继续.
我正在使用以下包在相似度得分的对称矩阵(大小为10x10)上找到最大的特征值及其对应的特征向量:
scipy.sparse.linalg.eigen.arpack.eigsh
Run Code Online (Sandbox Code Playgroud)
,像这样:
scipy.sparse.linalg.eigen.arpack.eigsh(mymatrix, 1, which='LM')
Run Code Online (Sandbox Code Playgroud)
现在的问题是,当我运行它几次(使用相同的矩阵,设置等)时,有时特征向量中的值是正的,有时是负的(参见运行3).
有谁知道为什么会这样,或者它是一个错误?似乎没有一种模式,但它只发生在每次迭代后运行代码而不关闭Python时(即每次运行后点击F5).
### Run 1: ###
[[-0.31056873]
[-0.31913092]
[-0.3149287 ]
[-0.32262921]
[-0.32190688]
[-0.31292658]
[-0.32424732]
[-0.31885208]
[-0.31808024]
[-0.298174 ]]
### Run 2: ###
[[-0.31056873]
[-0.31913092]
[-0.3149287 ]
[-0.32262921]
[-0.32190688]
[-0.31292658]
[-0.32424732]
[-0.31885208]
[-0.31808024]
[-0.298174 ]]
### Run 3:###
[[ 0.31056873]
[ 0.31913092]
[ 0.3149287 ]
[ 0.32262921]
[ 0.32190688]
[ 0.31292658]
[ 0.32424732]
[ 0.31885208]
[ 0.31808024]
[ 0.298174 ]]
### Run 4: ###
[[-0.31056873]
[-0.31913092]
[-0.3149287 ]
[-0.32262921]
[-0.32190688]
[-0.31292658]
[-0.32424732] …Run Code Online (Sandbox Code Playgroud) 我试图理解Matlab中的主成分分析,
似乎至少有3种不同的功能可以做到这一点.
我在下面的代码中有一些问题:
我x是否正确使用一个特征向量(对应于最大特征值的特征向量)创建近似值?我认同??
为什么PC和V哪些都是(x'x)表示不同的载荷?列顺序是相反的,因为eig不会首先排序具有最大值的特征值,但为什么它们彼此为负?
为什么这些eig值不是与特征向量一致的,与第一列中最大的特征值相对应?
使用下面的代码,我回到输入矩阵x使用时svd和eig,但是从princomp的结果似乎是完全不同的?我需要做些什么来使princomp与其他两个函数相匹配?
码:
x=[1 2;3 4;5 6;7 8 ]
econFlag=0;
[U,sigma,V] = svd(x,econFlag);%[U,sigma,coeff] = svd(z,econFlag);
U1=U(:,1);
V1=V(:,1);
sigma_partial=sigma(1,1);
score1=U*sigma;
test1=score1*V';
score_partial=U1*sigma_partial;
test1_partial=score_partial*V1';
[PC, D] = eig(x'*x)
score2=x*PC;
test2=score2*PC';
PC1=PC(:,2);
score2_partial=x*PC1;
test2_partial=score2_partial*PC1';
[o1 o2 o3]=princomp(x);
Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要在iOS平台上使用向量和矩阵的库.我决定研究OpenGLES,因为我计划进行的矩阵和矢量操作(主要是转置,矩阵乘法和特征分解)肯定会受益于GPU加速.
问题是我不熟悉OpenGLES,老实说可能不是最好的选择.如果我要使用OpenGLES,我是否必须手动编写执行矩阵转置,乘法和特征分解的算法?或者是否有另一个Apple或第三方框架可以帮助我完成这些任务.
然而,主要的分歧是我希望这些操作是GPU加速的.
埃尔米特矩阵是一个复方矩阵,等于其共轭转置。其矩阵元素满足以下条件:
每次,我使用 Python 计算 Hermitian 矩阵的特征向量时,特征向量的第一个系数都是纯实数。这是 Hermitian 矩阵的属性吗?
我附加了一个代码片段来生成埃尔米特矩阵,计算其特征向量并打印与最低特征值相对应的特征向量。
import numpy as np
from numpy import linalg as LA
N = 5 # Set size of a matrix
# Generate real part of the matrix at first
real_matrix = np.random.uniform(-1.0, 1.0, size=(N,N))
real_matrix = (real_matrix + real_matrix.T)/2
# Generate imaginary part of the matrix
imaginary_matrix = np.random.uniform(-1.0, 1.0, size=(N,N))
imaginary_matrix = (imaginary_matrix + imaginary_matrix.T)/2
imaginary_matrix = imaginary_matrix.astype(complex) * 1j
for row in range(N):
for column in range(row,N):
if row == …Run Code Online (Sandbox Code Playgroud)