使用PCA选择功能

Dev*_*Dev 5 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)
Run Code Online (Sandbox Code Playgroud)

这给了我:

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
Run Code Online (Sandbox Code Playgroud)

方差=

0.0179
0.0008
0.0001
0.0000
0.0000
0.0000
0.0000
0.0000
Run Code Online (Sandbox Code Playgroud)

解释=

94.9471
4.1346
0.6616
0.2358
0.0204
0.0003
0.0002
0.0000
Run Code Online (Sandbox Code Playgroud)

这意味着第一主要成分有94.9%的方差被解释,依此类推...但是这些是从最高到最低的顺序。如何根据以上信息知道要选择的功能(从1到8)。

pet*_*hor 6

您的问题与Mahoney和Drineas在“用于改进数据分析的CUR矩阵分解”中讨论的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);
Run Code Online (Sandbox Code Playgroud)

然后,计算集中数据:

%# Remove the mean
features = features - repmat(mean(features,2), 1, size(features,2));
Run Code Online (Sandbox Code Playgroud)

我使用SVD来计算PCA,因为它既提供了主要成分,又提供了系数。如果样本在列中,则U保留主要成分。检查的第二页本文的关系。

%# Compute the SVD
[U,S,V] = svd(features);
Run Code Online (Sandbox Code Playgroud)

这里的关键思想是我们要获得具有大部分变化的尺寸。并假设数据中存在一些噪声。我们仅选择主要特征向量,例如代表数据的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);
Run Code Online (Sandbox Code Playgroud)

然后使用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
Run Code Online (Sandbox Code Playgroud)

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

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

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

ans =
   6     8     5
Run Code Online (Sandbox Code Playgroud)

您可以检查纸张以获取更多详细信息。

但是,请记住,如果您有很多维度,则基于PCA的技术将是不错的选择。在您的情况下,搜索空间很小。我的建议是在该空间中进行详尽搜索,并按照@amit的建议获得最佳选择。

  • @Dev我的示例只是一个毫无意义的玩具示例,它展示了如何在MATLAB中实现它。这实际上对您而言有意义。 (2认同)