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