matlab中的主成分分析?

时间:2019-05-11 17:16:39

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

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

  • 122是功能数量
  • 125937是样本大小。

根据我的一点理解,当您希望缩小功能部件的尺寸时,PCA很有用。意思是,我应该将122减少为较小的数字。

但是当我在matlab中使用时:

X_new = pca(X_Training)

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

有帮助吗?我对结果有不好的解释吗?我只想减少功能的数量。

1 个答案:

答案 0 :(得分:3)

首先,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;