我有一个训练集,大小为size(X_Training)=122 x 125937
。
122
是特征的数量- 而
125937
是样本的数量。
根据我的初步理解,PCA在你想要减少特征维度时非常有用。这意味着,我应该将122减少到一个更小的数字。
但当我在MATLAB中使用:
X_new = pca(X_Training)
我得到一个大小为125973x121
的矩阵,我真的很困惑,因为这不仅改变了特征,还改变了样本大小?这对我来说是个大问题,因为我还有一个目标向量Y_Training
,我想用它来训练我的神经网络。
有什么帮助吗?我是否严重误解了结果?我只想减少特征的数量。
回答:
首先,PCA函数的文档很有用:https://www.mathworks.com/help/stats/pca.html。文档中提到行是样本而列是特征。这意味着你需要先转置你的矩阵。
其次,你需要提前指定要减少到的维数。PCA函数不会自动为你做这件事。因此,除了提取每个成分的主成分系数外,你还需要提取分数。一旦你有了这些,你只需选择分数并进行重投影到减少的空间中。
换句话说:
n_components = 10; % 按需调整[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;