Sun*_*nny -3 matlab linear-algebra eigenvalue pca
我想使用Matlab的"princomp"函数,但是这个函数给出了一个排序数组中的特征值.这样我就无法找出哪个列对应哪个特征值.对于Matlab,
m = [1,2,3;4,5,6;7,8,9];
[pc,score,latent] = princomp(m);
Run Code Online (Sandbox Code Playgroud)
是相同的
m = [2,1,3;5,4,6;8,7,9];
[pc,score,latent] = princomp(m);
Run Code Online (Sandbox Code Playgroud)
也就是说,交换前两列不会改变任何东西.潜在的结果(特征值)将是:(27,0,0)信息(特征值对应于哪个原始(输入)列)丢失.有没有办法告诉matlab不要对特征值进行排序?
Amr*_*mro 16
使用PCA,返回的每个主要组件将是原始列/维度的线性组合.也许一个例子可能会消除你的任何误解.
让我们考虑包含150个实例和4个维度的Fisher-Iris数据集,并对数据应用PCA.为了使事情更容易理解,我首先将数据置于零中心,然后再调用PCA函数:
load fisheriris
X = bsxfun(@minus, meas, mean(meas)); %# so that mean(X) is the zero vector
[PC score latent] = princomp(X);
Run Code Online (Sandbox Code Playgroud)
让我们看看第一个返回的主成分(PC矩阵的第一列):
>> PC(:,1)
0.36139
-0.084523
0.85667
0.35829
Run Code Online (Sandbox Code Playgroud)
这表示为原始尺寸的线性组合,即:
PC1 = 0.36139*dim1 + -0.084523*dim2 + 0.85667*dim3 + 0.35829*dim4
Run Code Online (Sandbox Code Playgroud)
因此,为了在由主成分形成的新坐标系中表达相同的数据,新的第一维应该是根据上述公式的原始维的线性组合.
我们可以简单地计算这个,就像X*PC在PRINCOMP(score)的第二个输出中返回的那样,来确认这个尝试:
>> all(all( abs(X*PC - score) < 1e-10 ))
1
Run Code Online (Sandbox Code Playgroud)
最后,每个主成分的重要性可以通过它解释的数据的方差来确定.这是由PRINCOMP(latent)的第三个输出返回的.
我们可以在不使用PRINCOMP的情况下自行计算数据的PCA:
[V E] = eig( cov(X) );
[E order] = sort(diag(E), 'descend');
V = V(:,order);
Run Code Online (Sandbox Code Playgroud)
协方差矩阵的特征向量V是主成分(与PC上面相同,尽管符号可以反转),相应的特征值E表示解释的方差量(相同latent).注意,习惯上用它们的特征值对主成分进行排序.和以前一样,为了在新坐标中表达数据,我们只需计算X*V(score如果你确保匹配符号,应该与上面相同)