【问题标题】:selection of features using PCA使用 PCA 选择特征
【发布时间】:2012-10-29 20:24:42
【问题描述】:

我正在做无监督分类。为此,我有 8 个特征(绿色的方差、绿色的标准 div、红色的平均值、红色的方差、红色的标准 div、色调的平均值、色调的方差、色调的标准 div)进行分类每张图片,我想使用 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

方差 =

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)。

【问题讨论】:

  • 您是否可以将feature 变量的内容粘贴到网络上的某个位置,例如codepaste.net 并分享链接。

标签: algorithm matlab image-processing pca


【解决方案1】:

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

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

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

%# 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 的建议获得最佳选择。

【讨论】:

  • @petrichor。我有从图像中某些感兴趣区域提取的特征,例如。我有不同血管的图像,在这些血管中的每一个上,我都提取了血管中心线像素的特征。如上所述,您的特征矩阵是图像,而不是来自某个感兴趣区域的特征。我想知道您的方法是否仍然适用于我的情况
  • @Dev 我的例子只是一个玩具无意义的例子,展示了如何在 MATLAB 中实现它。在你的情况下它实际上是有意义的。
【解决方案2】:

来自pcacov docs

COEFF 是一个 p×p 矩阵,每列包含一个主成分的系数。这些列按分量方差递减的顺序排列。

由于explained 表明只有第一个组件对解释方差的贡献很大,您应该查看PC 的第一列以了解它使用了哪些原始特征:

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

事实证明,在您的示例中,第 3 和第 6 个特征(用

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

但是,对于此类按特征分析,PCA 可能不是最合适的;您也可以从原始特征的标准差中得出这些信息。

【讨论】:

  • 谢谢您的回答,但您能否详细说明最后一句话。我不明白如何从标准差中对特征进行排序......提前致谢
【解决方案3】:

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

因此,您获得的向量不能直接转换为您需要选择的特征以获得这种差异 - 它只是根据原始向量创建一个新特征。
在你的情况下,你得到:

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

这个New_Feature 为您提供了 94.9471% 的信息增益,尽管降维了。
(如果你对下一个原则组件也这样做并使用它们,你显然会增加你的信息增益)

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

遗传算法通常非常适合子集选择,如果您的一组特征仅包含 8 个特征 - 您也可以考虑蛮力搜索 - 只有 28=256 个可能的子集。在某些情况下,可能会尝试所有子集,看看什么能提供最佳性能。

【讨论】:

  • @阿米特。感谢你的回复。我正在使用无监督分类,即我没有训练数据集。据我所知,我不能使用遗传算法(GA),因为它需要训练数据集。请。如果我错了,请纠正我。我的意思是,我可以使用 GA 进行无监督分类吗?
  • @Dev:你的意思是集群吗?如果是这样,也许您可​​以使用所有特征找到集群 - 并将其作为基本事实,并使用 GA 或其他子集选择算法来找到足够接近它的子集。或者,您可以坚持使用 PCA - 但请注意您获得的是“新功能”,而不是原始功能的子集。
猜你喜欢
  • 1970-01-01
  • 2018-07-31
  • 2014-02-05
  • 2021-04-06
  • 2013-01-09
  • 2020-11-01
  • 2020-06-06
  • 2020-09-16
  • 2016-05-04
相关资源
最近更新 更多