【问题标题】:Matlab Principal Component Analysis (eigenvalues order)Matlab主成分分析(特征值顺序)
【发布时间】:2011-06-26 20:30:57
【问题描述】:

我想使用 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) 信息(哪个特征值对应于哪个原始(输入)列)丢失。 有没有办法告诉matlab不要对特征值进行排序?

【问题讨论】:

  • 这...不是 PCA/特征分解的工作方式。不是刻薄,但是一本教科书可能会比这个社区更好地帮助你。
  • @Sunny 特征值对应于特征向量,它为您提供列/城市的线性组合。它们展示了不同城市之间的相互关系。
  • @Sunny 特征值与矩阵的特定行/列不对应。特征向量的分量就是这样做的。
  • @Sunny。我认为您对线性代数有基本的误解。也许更多帮助可以在这里找到math.stackexchange.com。谢谢
  • @Sunny:-1,请不要这样打,已经有很多知识渊博的人建议你,你缺乏基本的线性代数。提高你的线性代数技能,你会注意到“主成分分析”实际上是多么简单。谢谢

标签: matlab linear-algebra pca eigenvalue


【解决方案1】:

使用 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);

让我们看看第一个返回的主成分(PC 矩阵的第一列):

>> PC(:,1)
      0.36139
    -0.084523
      0.85667
      0.35829

这表示为原始尺寸的线性组合,即:

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

最后,每个主成分的重要性可以通过它解释的数据方差的多少来确定。这由 PRINCOMP 的第三个输出 (latent) 返回。


我们可以在不使用 PRINCOMP 的情况下自己计算数据的 PCA:

[V E] = eig( cov(X) );
[E order] = sort(diag(E), 'descend');
V = V(:,order);

协方差矩阵V的特征向量是主成分(与上面的PC相同,虽然符号可以反转),对应的特征值E表示解释的方差量(与@987654333相同@)。请注意,习惯上按其特征值对主成分进行排序。和以前一样,为了在新坐标中表达数据,我们只需计算X*V(如果你确保匹配符号,应该与上面的score相同)

【讨论】:

  • 为什么将数据集中在 w.r.t.均值?我尝试了以下...使用pca 获取数据的pca,然后尝试使用data*PC 重建它-> 不起作用。但是,它适用于均值居中。我的问题是,如果 MATLAB pca 确实意味着数据在内部居中(来自他们的 pca 文档),那么当我们不明确执行均值居中时,为什么数据重建不起作用?
  • @ParagS.Chandakkar:我可以举个例子,但是评论太长了。您介意创建一个新问题吗?
  • 我自己确实得到了答案。在发表评论之前,我实际上应该考虑一下。谢谢。
【解决方案2】:

“信息(哪个特征值对应于哪个原始(输入)列)丢失了。”

由于每个主成分是所有输入变量的线性函数,每个主成分(特征向量、特征值)对应于原始输入列的所有。忽略可能的符号变化,这在 PCA 中是任意的,重新排序输入变量不会改变 PCA 结果。

“有没有办法告诉matlab不要对特征值进行排序?”

我对此表示怀疑:PCA(以及一般的特征分析)通常按方差对结果进行排序,但我注意到 princomp() 从最大到最小方差排序,而 eig() 则按相反方向排序。

有关使用 MATLAB 插图的 PCA 的更多说明,无论是否使用 princomp(),请参阅:

Principal Components Analysis

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 2016-02-22
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2017-07-14
    • 2013-10-21
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多