我有一个训练集,其大小为(size(X_Training)=122 x 125937
。
122
是功能数量125937
是样本大小。根据我的一点理解,当您希望缩小功能部件的尺寸时,PCA很有用。意思是,我应该将122减少为较小的数字。
但是当我在matlab中使用时:
X_new = pca(X_Training)
我得到一个125973x121
大小的矩阵,我真的很困惑,因为这不仅会改变特征,还会改变样本大小?这对我来说是个大问题,因为我仍然有要用于神经网络的目标向量Y_Training
。
有帮助吗?我对结果有不好的解释吗?我只想减少功能的数量。
答案 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;