我正在尝试使用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中提取的功能?
答案 0 :(得分:2)
我发现特征值已经在第一个中排序了 声明。为什么我们需要再次按降序对其进行排序?
您不需要再次排序,因为princomp
默认情况下会这样做。但是,princomp
现在是不推荐使用的函数,因此您应该使用内置函数PCA
。
我只能推测代码的作者包含了对完整性进行排序的调用,因此很清楚他在做什么(作为sort返回feature_idx
)。
例如,以下代码段实现了相同的结果,但对于读者来说并不清楚:
[eigenvectors, projected_data, eigenvalues] = princomp(proteingene);
selected_projected_data = projected_data(:, 1:100);
对于学习PCA的人来说,1:100是什么意思?
根据我的功能集,另一个问题是projected_data 变量显示值为0的列(要素)。这意味着 这些功能没有多大意义。我是对的吗?
我认为一个安全的答案是,如果相应的特征值的值接近于0,那么您的特征就不具有重要意义。您可以通过查看eigenvalue(feature_idx)
来检查该特征,如果是你发布的代码。条目为0的列(要素)仅表示它们不跨越您空间的某个维度。您可以将它们视为标准实数向量空间中的向量。
最后一个问题是,我怎么知道哪些是功能 在PCA中提取?
这些是projected_data
给出的!该变量包含沿特征向量方向投影的数据。
你看,特征提取实际上是对PCA分解的解释。 PCA没有"提取"任何功能,它只是更改描述您的数据的矢量基础(您可以看到视觉解释here)。基数由proteingene
的特征向量组成。
提取"提取"功能您必须决定您的投影数据的哪一列与您相关。在代码示例中,提取了100个功能"任意地,没有任何标准判断它们对特定问题的重要性。
selected_projected_data = projected_data(:, feature_idx(1:100));
事实上,如果您的数据proteingene
的维度少于100个,那么您甚至会尝试使用PCA从中提取100个要素时出错。