PCA后提取了哪些特征?

Which features were extracted after PCA?

我正在尝试使用 PCA 提取特征。现在我从 StackExchange 获得了一个 MATLAB 代码,如下所示,它选择了 PCA 之后最相关的前 100 个特征。现在当我执行代码时,我发现特征值已经在第一条语句中排序了。为什么还要降序排列呢?

[eigenvectors, projected_data, eigenvalues] = princomp(proteingene);
[foo, feature_idx] = sort(eigenvalues, 'descend');
selected_projected_data = projected_data(:, feature_idx(1:100));

另一个问题是,根据我的特征集,projected_data变量显示值为0的列(特征)。这意味着这些特征没有太大意义。我对吗?

最后一个问题是,我怎么知道在 PCA 中提取了哪些特征?

I found that the eigenvalues were already sorted in the first statement. Why do we need to again sort it in descending order?

您不需要再次排序,因为 princomp 默认会这样做。但是,princomp 现在已被弃用,因此您应该使用内置函数 PCA

我只能推测代码的作者为了完整性而包含了对 sort 的调用,所以很清楚他在做什么(如 sort returns feature_idx)。 例如,下面的代码片段实现了相同的结果,但对于 reader:

来说不是很清楚
[eigenvectors, projected_data, eigenvalues] = princomp(proteingene);
selected_projected_data = projected_data(:, 1:100);

对于学习 PCA 的人来说,1:100 是什么意思?

Another question is, according to my feature set, the projected_data variable shows columns (features) which have a value of 0. This means that these features do not have much significance. Am I right?

我认为一个安全的答案是,如果相应的特征值的值接近于 0,则您的特征没有多大意义。您可以通过查看 eigenvalue(feature_idx) 来检查,在这种情况下您发布的代码。条目为 0 的列(特征)仅表示它们不跨越 space 的某个维度。您可以将它们视为标准实数向量中的向量 space.

Last question is, how would I know which were the features that were extracted in the PCA?

projected_data中给出了这些!该变量包含沿特征向量方向投影的数据。 你看,特征提取实际上是对 PCA 分解的解释。 PCA 没有 "extract" 任何特征,它只是更改描述数据的向量基(您可以看到直观的解释 here)。底由 proteingene 的特征向量组成。 对于 "extract" 功能,您必须决定 projected_data 的哪些列与您相关。在代码示例中,100 个特征是 "extracted" 任意的,没有任何标准来判断它们对特定给定问题的重要性。

selected_projected_data = projected_data(:, feature_idx(1:100));

事实上,如果您的数据 proteingene 的维度少于 100,您甚至会在尝试使用 PCA 从中提取 100 个特征时遇到错误。