我在Matlab上使用了一个函数:
[V,D] = eig(C);
Run Code Online (Sandbox Code Playgroud)
我看到V和D总是按升序排序.它是否总是那样,或者我应该在获得V和D价值后对它们进行排序?
我有大约1000个维度50000的向量x_i,但它们非常稀疏; 每个只有大约50-100个非零元素.我想在这个数据集上(在MATLAB中)做PCA,以减少数据的不必要的极端维度.
不幸的是,由于需要从所有示例中减去均值,我不知道在没有中间完整矩阵的情况下如何做到这一点.当然,1000x50000矩阵太大而无法放入内存(当我尝试时,它实际上因某些原因而崩溃了我的整台计算机).princomp当我尝试使用它时,Matlab的内置程序会崩溃我的计算机.
所以我的问题是:有没有办法对这些数据进行PCA而不需要大量的非稀疏矩阵作为中间步骤?
我正在使用特征值分解为稀疏数据实现PCA.我知道matlab实现了PCA,但它帮助我理解编写代码时的所有技术细节.我一直在遵循这里的指导,但与内置函数princomp相比,我得到了不同的结果.
任何人都可以看着它并指出我正确的方向.
这是代码:
function [mu, Ev, Val ] = pca(data)
% mu - mean image
% Ev - matrix whose columns are the eigenvectors corresponding to the eigen
% values Val
% Val - eigenvalues
if nargin ~= 1
error ('usage: [mu,E,Values] = pca_q1(data)');
end
mu = mean(data)';
nimages = size(data,2);
for i = 1:nimages
data(:,i) = data(:,i)-mu(i);
end
L = data'*data;
[Ev, Vals] = eig(L);
[Ev,Vals] = sort(Ev,Vals);
% computing eigenvector of the real covariance matrix
Ev …Run Code Online (Sandbox Code Playgroud) 可能重复:
MATLAB内存不足但不应该
我想对一个庞大的数据集进行PCA分析.更具体地讲,我有size(dataPoints) = [329150 132]哪里328150是数据点的数量,132是要素的数量.
我想提取特征向量及其相应的特征值,以便我可以执行PCA重建.
但是,当我使用该princomp功能时(即[eigenVectors projectedData eigenValues] = princomp(dataPoints);我获得以下错误:
>> [eigenVectors projectedData eigenValues] = princomp(pointsData);
Error using svd
Out of memory. Type HELP MEMORY for your options.
Error in princomp (line 86)
[U,sigma,coeff] = svd(x0,econFlag); % put in 1/sqrt(n-1) later
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用较小的数据集,我没有问题.
如何在Matlab中对我的整个数据集执行PCA?有人遇到过这个问题吗?
编辑:
我已经修改了princomp函数并尝试使用svds而不是svd,但是,我得到了几乎相同的错误.我已经删除了错误:
Error using horzcat
Out of memory. Type HELP MEMORY for your options.
Error in svds (line …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个获取A任意大小矩阵的程序,并且SVD将其分解:
A = U * S * V'
Run Code Online (Sandbox Code Playgroud)
A用户输入的矩阵在哪里,U正交矩阵由特征值的特征向量组成A * A',S是奇异值的对角矩阵,并且V是特征向量的正交矩阵A' * A.
问题是:MATLAB函数eig有时会返回错误的特征向量.
这是我的代码:
function [U,S,V]=badsvd(A)
W=A*A';
[U,S]=eig(W);
max=0;
for i=1:size(W,1) %%sort
for j=i:size(W,1)
if(S(j,j)>max)
max=S(j,j);
temp_index=j;
end
end
max=0;
temp=S(temp_index,temp_index);
S(temp_index,temp_index)=S(i,i);
S(i,i)=temp;
temp=U(:,temp_index);
U(:,temp_index)=U(:,i);
U(:,i)=temp;
end
W=A'*A;
[V,s]=eig(W);
max=0;
for i=1:size(W,1) %%sort
for j=i:size(W,1)
if(s(j,j)>max)
max=s(j,j);
temp_index=j;
end
end
max=0;
temp=s(temp_index,temp_index);
s(temp_index,temp_index)=s(i,i);
s(i,i)=temp;
temp=V(:,temp_index);
V(:,temp_index)=V(:,i);
V(:,i)=temp;
end
s=sqrt(s);
end
Run Code Online (Sandbox Code Playgroud)
我的代码返回正确的s矩阵,也"几乎"正确U …
我试图理解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) 我的目的是找到矩阵的特征向量.在Matlab中,有一个[V,D] = eig(M)用于得到矩阵的特征向量:[V,D] = eig(M).或者,我使用WolframAlpha网站来仔细检查我的结果.
我们有一个10X10矩阵叫M:
0.736538062307847 -0.638137874226607 -0.409041107160722 -0.221115060391256 -0.947102932298308 0.0307937582853794 1.23891356582639 1.23213871779652 0.763885436104244 -0.805948245321096
-1.00495215920171 -0.563583317483057 -0.250162608745252 0.0837145788064272 -0.201241986127792 -0.0351472158148094 -1.36303599752928 0.00983020375259212 -0.627205458137858 0.415060573134481
0.372470672825535 -0.356014310976260 -0.331871925811400 0.151334279460039 0.0983275066581362 -0.0189726910991071 0.0261595600177302 -0.752014960080128 -0.00643718050231003 0.802097123260581
1.26898635468390 -0.444779390923673 0.524988731629985 0.908008064819586 -1.66569084499144 -0.197045800083481 1.04250295411159 -0.826891197039745 2.22636770820512 0.226979917020922
-0.307384714237346 0.00930402052877782 0.213893752473805 -1.05326116146192 -0.487883985126739 0.0237598951768898 -0.224080566774865 0.153775526014521 -1.93899137944122 -0.300158630162419
7.04441299430365 -1.34338456640793 -0.461083493351887 5.30708311554706 -3.82919170270243 -2.18976040860706 6.38272280044908 2.33331906669527 9.21369926457948 -2.11599193328696
1 0 0 0 …Run Code Online (Sandbox Code Playgroud) 我们有以下命令来分析Iris数据
load fisheriris
gscatter(meas(:,1), meas(:,2), species,'rgb'); hold on
gscatter(meas(:,3), meas(:,4), species,'rgb');hold on
xlabel('Sepal length');
ylabel('Sepal width');
[pc,score,latent,tsquare] = princomp(meas);
pc,latent
cumsum(latent)./sum(latent)
Run Code Online (Sandbox Code Playgroud)
我们得到了结果
pc =
0.3614 0.6566 -0.5820 0.3155
-0.0845 0.7302 0.5979 -0.3197
0.8567 -0.1734 0.0762 -0.4798
0.3583 -0.0755 0.5458 0.7537
latent =
4.2282
0.2427
0.0782
0.0238
ans =
0.9246
0.9777
0.9948
1.0000
Run Code Online (Sandbox Code Playgroud)
我们也有数字

我们的任务是
请通过绘制关于三个类别的三种颜色的前两个主要成分的计划中的数据的投影来显示.
我们可以通过调用前两个组件
x=pc(:,1);
y=pc(:,2);
Run Code Online (Sandbox Code Playgroud)
但是如何策划?请帮助我
matlab ×8
pca ×5
eigenvector ×4
eigenvalue ×2
matrix ×2
svd ×2
octave ×1
plot ×1
wolframalpha ×1