Matlab主成分分析(特征值阶数)
我想使用Matlab的“princomp”函数,但该函数给出排序数组中的特征值。这样我就无法找出哪个列对应哪个特征值。 对于MatlabMatlab主成分分析(特征值阶数),matlab,linear-algebra,pca,eigenvalue,Matlab,Linear Algebra,Pca,Eigenvalue,我想使用Matlab的“princomp”函数,但该函数给出排序数组中的特征值。这样我就无法找出哪个列对应哪个特征值。 对于Matlab m = [1,2,3;4,5,6;7,8,9]; [pc,score,latent] = princomp(m); 与 m = [2,1,3;5,4,6;8,7,9]; [pc,score,latent] = princomp(m); 也就是说,交换前两列不会改变任何东西。潜在的结果(特征值)为:(27,0,0) 信息(哪个特征值对应于哪个原始(输入)列)
m = [1,2,3;4,5,6;7,8,9];
[pc,score,latent] = princomp(m);
与
m = [2,1,3;5,4,6;8,7,9];
[pc,score,latent] = princomp(m);
也就是说,交换前两列不会改变任何东西。潜在的结果(特征值)为:(27,0,0)
信息(哪个特征值对应于哪个原始(输入)列)丢失。
有没有办法告诉matlab不要对特征值进行排序?使用PCA,返回的每个主分量将是原始列/维度的线性组合。也许举个例子可以消除你的误解
让我们考虑Fisher虹膜数据集,包括150个实例和4个维度,并将PCA应用于数据。为了让事情更容易理解,在调用PCA函数之前,我首先将数据归零:
load fisheriris
X = bsxfun(@minus, meas, mean(meas)); %# so that mean(X) is the zero vector
[PC score latent] = princomp(X);
让我们看看第一个返回的主成分(矩阵的第一列):
这表示为原始尺寸的线性组合,即:
PC1 = 0.36139*dim1 + -0.084523*dim2 + 0.85667*dim3 + 0.35829*dim4
因此,为了在由主分量构成的新坐标系中表示相同的数据,根据上述公式,新的第一维度应该是原始维度的线性组合
我们可以简单地将其计算为X*PC
,这正是PRINCOMP第二次输出(score
)中返回的值,以确认此尝试:
>> all(all( abs(X*PC - score) < 1e-10 ))
1
协方差矩阵V
的特征向量是主分量(与上面的PC
相同,尽管符号可以反转),相应的特征值E
表示解释的方差量(与潜在的相同)。请注意,通常按其特征值对主分量进行排序。和以前一样,为了用新坐标表示数据,我们只需计算X*V
(如果您确保匹配符号,则应与上面的分数相同)“信息(哪个特征值对应于哪个原始(输入)列)丢失了。”
由于每个主分量都是所有输入变量的线性函数,因此每个主分量(特征向量、特征值)对应于原始输入列的所有。忽略符号的可能变化(在PCA中是任意的),对输入变量重新排序不会改变PCA结果
“有没有办法告诉matlab不要对特征值进行排序?”
我对此表示怀疑:PCA(以及一般的特征分析)通常按方差对结果进行排序,尽管我注意到princomp()从最大方差排序到最小方差,而eig()则按相反方向排序
有关使用MATLAB插图(带或不带princomp())的PCA的更多说明,请参阅:
这个。。。这不是PCA/特征分解的工作原理。这并不意味着,但是一本教科书可能会比这个社区更好地帮助你,因为特征值对应于特征向量,这给了你一个列/城市的线性组合。它们显示了不同城市之间的相互关系,因为特征值与矩阵的特定行/列不对应。特征向量的分量就是这样做的。我认为你对线性代数有基本的误解。也许可以在这里找到更多的帮助。Thanks@Sunny:-1,请不要这样打架,已经有很多有知识的人建议你,你缺乏基本的线性代数。理顺你的线性代数技能,你会发现“主成分分析”实际上是多么简单。谢谢你为什么把数据集中在平均值上?我尝试了以下方法。。。使用pca
获取数据的pca,然后尝试使用data*PC
->重建数据。但是,它与平均居中一起工作。我的问题是,如果MATLABpca
确实意味着在内部(从他们的pca
文档中)对数据进行居中,那么当我们没有明确执行平均居中时,为什么数据重建不起作用?@ParagS.Chandakkar:我可以给出一个示例,但它太长,无法给出评论。你介意提出一个新问题吗?事实上我自己得到了答案。在发表评论之前,我真的应该想一想。谢谢
>> all(all( abs(X*PC - score) < 1e-10 ))
1
[V E] = eig( cov(X) );
[E order] = sort(diag(E), 'descend');
V = V(:,order);