matlab中的主成分分析?

Principal component analysis in matlab?

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

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

但是当我在matlab中使用时:

X_new = pca(X_Training)

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

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

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

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

换句话说:

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

最后,如果您想执行重建并查看从减少的特征重建到原始特征 space 的效果如何,您需要对原始特征 space 执行重投影:

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;