使用PCA选择功能

时间:2012-11-09 13:53:36

标签: algorithm matlab image-processing pca

我正在进行无监督分类。为此我有8个特征(绿色方差,绿色标准,红色平均值,红色方差,红色标准红色,色调平均值,色调方差,色调标准)每个图像,我想使用PCA选择3个最重要的功能。我已经为功能选择编写了以下代码 (特征的维度为:179X8):

for c=1:size(feature,1)
   feature(c,:)=feature(c,:)-mean(feature)
end

DataCov=cov(feature); % covariance matrix
[PC,variance,explained] = pcacov(DataCov)

这给了我:

PC =

0.0038   -0.0114    0.0517    0.0593    0.0039    0.3998    0.9085   -0.0922
0.0755   -0.1275    0.6339    0.6824   -0.3241   -0.0377   -0.0641    0.0052
0.7008    0.7113   -0.0040    0.0496   -0.0207    0.0042    0.0012    0.0002
0.0007   -0.0012    0.0051    0.0101    0.0272    0.0288    0.0873    0.9953
0.0320   -0.0236    0.1521    0.2947    0.9416   -0.0142   -0.0289   -0.0266
0.7065   -0.6907   -0.1282   -0.0851    0.0060    0.0003    0.0010   -0.0001
0.0026   -0.0037    0.0632   -0.0446    0.0053    0.9125   -0.4015    0.0088
0.0543   -0.0006    0.7429   -0.6574    0.0838   -0.0705    0.0311   -0.0001

variance =

0.0179
0.0008
0.0001
0.0000
0.0000
0.0000
0.0000
0.0000

解释=

94.9471
4.1346
0.6616
0.2358
0.0204
0.0003
0.0002
0.0000

这意味着第一个主成分有94.9%的方差解释等等......但这些是按最大到最不重要的顺序。 如何根据以上信息了解要选择的功能(从1到8)。

3 个答案:

答案 0 :(得分:5)

您的问题与Mahoney和Drineas在"CUR matrix decompositions for improved data analysis"中讨论的COLUMNSELECT问题相同。

他们首先计算每个维度的杠杆分数,然后使用杠杆分数作为权重随机选择其中的3个。或者,您可以选择最大的。这是您的问题的脚本:

我首先从网络上获得了一张真实的自然图像并将其调整为您要求的尺寸。图像如下:

img

%# Example data from real image of size 179x8
%# You can skip it for your own data
features = im2double(rgb2gray(imread('img.png')));

%# m samples, n dimensions
[m,n] = size(features);

然后,计算集中数据:

%# Remove the mean
features = features - repmat(mean(features,2), 1, size(features,2));

我使用SVD来计算PCA,因为它为您提供了主要成分和系数。如果样本在列中,则U保存主要组件。检查this paper的第二页是否有关系。

%# Compute the SVD
[U,S,V] = svd(features);

这里的关键思想是我们希望获得具有大部分变化的维度。并且假设数据中存在一些噪声。我们只选择主要的特征向量,例如代表95%的数据。

%# Compute the number of eigenvectors representing
%#  the 95% of the variation
coverage = cumsum(diag(S));
coverage = coverage ./ max(coverage);
[~, nEig] = max(coverage > 0.95);

然后使用主要组件的nEig计算杠杆分数。也就是说,我们采用nEig系数的范数。

%# Compute the norms of each vector in the new space
norms = zeros(n,1);
for i = 1:n
    norms(i) = norm(V(i,1:nEig))^2;
end

然后,我们可以对杠杆分数进行排序:

%# Get the largest 3
[~, idx] = sort(norms);
idx(1:3)'

并获得具有最大杠杆分数的向量的索引:

ans =
   6     8     5

您可以查看论文了解更多详情。

但是,请记住,如果您有许多维度,基于PCA的技术是好的。在您的情况下,搜索空间非常小。我的建议是在空间中详尽地搜索并获得@amit建议的最佳选择。

答案 1 :(得分:3)

PCA实际上是在生成一组新功能,每个功能都是原始元素的线性转换。

因此,您获得的矢量无法直接转换为您需要选择的特征以获得此差异 - 它只是基于原始创建新特征。
在你的情况下,你得到:

New_Feature = 0.038*F1 + 0.0755*F2 + 0.7008*F3 + ... + 0.0543*F8

尽管维数降低,但New_Feature为您提供了94.9471%的信息增益。
(如果你对下一个主要的同事做同样的事情并使用它们,你显然会增加你的信息收益)

如果您需要获取原件的子集,而不是创建新功能 - 我会使用其他方法而不是PCA。

遗传算法通常非常适合子集选择,如果您的特征集只包含8个特征 - 您还可以考虑强力搜索 - 只有2个 8 = 256个可能的子集。在某些情况下,可能会尝试所有子集,看看是什么让您获得最佳性能。

答案 2 :(得分:1)

来自pcacov docs

  

COEFF是一个p-by-p矩阵,每列包含一个主成分的系数。列按顺序减少组件差异。

由于explained表明只有第一个组件确实对解释的方差做出了重大贡献,因此您应该查看PC的第一列,看看它使用了哪些原始功能:

0.0038
0.0755
0.7008 <---
0.0007 
0.0320 
0.7065 <---
0.0026 
0.0543 

事实证明,在你的例子中,第3和第6个特征(用&lt; - 表示)是第一个主要组件的主要贡献者。你可以说这些功能是最重要的功能。

同样地,基于第1,第4和第7个特征仅在PC的某些最后一列中获得较大权重的事实,可以得出结论它们相对不重要。

然而,对于这种每个特征的分析,PCA可能不是最合适的;你也可以从原始特征的标准偏差中得出这样的信息。