【问题标题】:Principal component analysis in matlab?matlab中的主成分分析?
【发布时间】:2019-09-29 05:58:44
【问题描述】:

我有一个大小为 (size(X_Training)=122 x 125937) 的训练集。

  • 122 是特征的数量
  • 125937 是样本大小。

据我所知,当您想要降低特征的维度时,PCA 很有用。意思是,我应该将 122 减少到一个更小的数字。

但是当我在matlab中使用时:

X_new = pca(X_Training)

我得到一个大小为125973x121 的矩阵,我真的很困惑,因为这不仅改变了特征,而且改变了样本大小?这对我来说是个大问题,因为我仍然有目标向量 Y_Training 想要用于我的神经网络。

有什么帮助吗?我是否错误地解释了结果?我只想减少特征的数量。

【问题讨论】:

    标签: matlab machine-learning neural-network pca dimensionality-reduction


    【解决方案1】:

    首先,PCA 函数的文档很有用:https://www.mathworks.com/help/stats/pca.html。它提到行是样本,而列是特征。这意味着您需要先转置矩阵。

    其次,您需要指定要减少到先验的维数。 PCA 功能不会自动为您执行此操作。因此,除了提取每个分量的主系数外,您还需要提取分数。一旦你有了这个,你只需对分数进行子集化并重新投影到缩小的空间中。

    换句话说:

    n_components = 10; % Change to however you see fit.
    [coeff, score] = pca(X_training.');
    X_reduce = score(:, 1:n_components);
    

    X_reduce 将是降维特征集,总列数是降维特征的总数。另请注意,训练示例的数量并没有像我们预期的那样发生变化。如果您想在我们减少特征数量后确保特征数量沿行而不是沿列,请在继续之前转置此输出矩阵。

    最后,如果您想自动确定要减少到的特征数量,一种方法是计算每个特征的解释方差,然后将第一个特征的值累加到超过某个值的点临界点。通常使用 95%。

    因此,您需要提供额外的输出变量来捕获这些:

    [coeff, score, latent, tsquared, explained, mu] = pca(X_training.');
    

    我会让您通过文档了解其他变量,但您正在查看的是explained 变量。您应该做的是找到解释的总方差超过 95% 的点:

    [~,n_components] = max(cumsum(explained) >= 95);
    

    最后,如果你想进行重建,看看从减少的特征到原始特征空间的重建效果如何,你需要重新投影到原始空间:

    X_reconstruct = bsxfun(@plus, score(:, 1:n_components) * coeff(:, 1:n_components).', mu);
    

    mu 是每个特征作为行向量的均值。因此,您需要在所有示例中添加此向量,因此需要广播,这就是使用 bsxfun 的原因。如果您使用的是 MATLAB R2018b,那么现在在您使用加法运算时会隐式执行此操作。

    X_reconstruct = score(:, 1:n_components) * coeff(:, 1:n_components).' + mu;
    

    【讨论】:

    • 亲爱的@rayryeng,我知道看到人们在没有做足够研究的情况下提出问题通常令人沮丧,但由于很多情况我别无选择。感谢您的理解,感谢您对我的详细说明和解释,感谢您抽出宝贵的时间!!
    • @U.User 不客气。有时,如果有人直接告诉您应该做什么,而不是查阅文档,我会发现它会更容易。老实说,MATLAB 中有关 PCA 函数的文档非常冗长,而且肯定会在翻译中迷失方向。这就是为什么我最终决定详细说明如何使用该功能。祝你好运,如果您需要更多帮助,请告诉我!
    • 谢谢。实际上,当我使用您键入的命令来自动确定要减少到的特征数量时。它会打印一条橙色消息,说明某些列是线性相关的,并且系统将使用前 8 个组件来计算 TSQUARED。X_reduce 的新大小为 125973x2(实际上非​​常低)。但是当我在 X_Training 上应用 mapstd() 以进行特征缩放和归一化时,我确实得到了相同的橙色错误但它说这次会使用前117列,最终输出是size(X_reduce)= 125973 x 89。我应该应用mapstd()吗?
    • @U.User 这是您的训练矩阵的问题......但是当它计算 PCA 时,它会计算协方差矩阵,该矩阵本质上会为您进行特征缩放,所以我很困惑。但是,是的,似乎 mapstd 更可靠。
    • 大声笑对不起,是的,我也这么认为。在预处理阶段,我的 X_training 有 3 个分类特征,其中一个有很多值,所以当我对分类特征进行 one-hot 编码时,我从 42 个特征移到了 122 个特征。所以,我的矩阵充满了 0 和 1,这就是我想到使用 mapstd() 的原因。
    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2015-07-03
    • 2015-12-09
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多