2012-11-09 90 views
3

我正在做無監督分類。爲此,我有8個特徵(綠色的變化,綠色的標準格,紅色的平均值,紅色的變化,紅色的標準格,色調的平均值,色調的變化,色調的標準格),用於分類每個圖像,我想使用PCA選擇3個最重要的功能。我寫了下面的代碼特徵選擇 (其中特徵的尺寸爲:179X8):使用PCA選擇功能

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)被選中。

+0

是否可以將你的'feature'變量的內容粘貼到網上的某個地方,比如http://codepaste.net/並共享鏈接。 – petrichor

回答

4

你的問題是一樣的,通過馬奧尼和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的建議獲得最佳選擇。

+0

@ petrichor。我有一些特徵,這些特徵是從圖像中某些感興趣的區域提取出來的,例如。我用不同的容器形成圖像,並在這些容器的每個容器上提取了中心線像素上的特徵。如上所述,您的特徵矩陣是一個圖像,而不是來自某個感興趣區域的特徵。我想知道你的方法是否仍適用於我的情況 – Dev

+1

@Dev我的例子只是一個玩具毫無意義的例子,展示瞭如何在MATLAB中實現它。它對你的情況實際上是有意義的。 – petrichor

2

PCA實際上是生成一組新功能,每個功能都是從原始元素進行線性轉換。

因此,您獲得的矢量不能直接轉換爲您需要選擇的功能以獲得這種差異 - 它只是基於原件創建新功能。
在你的情況,你會得到:

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

New_Feature爲您提供了94.9471%信息增益,儘管降維。 (如果你對下一個原則相同的人也使用它們,那麼你顯然會增加你的信息增益)

如果你需要得到一個原始的子集,而不是創建新的特徵 - 已經使用其他方法代替PCA。

遺傳算法對於子集選擇通常很不錯,如果你的一組特徵只包含8個特徵 - 你也可以考慮進行蠻力搜索 - 只有2個可能的子集。在某些情況下,可能會嘗試所有子集,並查看哪些能夠提供最佳性能。

+0

@阿米特。謝謝您的回覆。我正在使用無監督分類,即我沒有訓練數據集。根據我的知識,我不能使用遺傳算法(GA),因爲它需要訓練數據集。 PLS。糾正我,如果我錯了。我的意思是,我可以使用GA進行無監督分類嗎? – Dev

+1

@Dev:你的意思是聚類嗎?如果是這樣,也許你可以找到使用所有特徵的集羣 - 並將其作爲基礎事實,並使用GA或其他子集選擇算法來找到一個足夠接近它的子集。或者,您可以堅持使用PCA - 但請注意,您正在獲得「新功能」,而不是原始功能的子集。 – amit

1

pcacov docs

COEFF是p通過 - 對矩陣,用含有係數一個主分量的每一列。這些列按照組件差異遞減的順序排列。

由於explained顯示,僅第一部分確實有助於一個顯著量方差解釋,你應該看看PC第一列看到它使用原有的特色:

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

原來,在你的例子中,第三和第六個特徵(用< - 表示)是第一個主要組件的主要貢獻者。你可以說這些功能是最重要的功能。

類似地,基於第1,第4和第7個特徵僅在PC的最後一列中的一些中得到大權重的事實,可以得出結論,它們相對不重要。

然而,對於這種每個特徵分析,PCA可能不是最合適的;您也可以從原始特徵的標準偏差中推導出這樣的信息。

+0

謝謝你的回答,但你能否詳細說明最後一句話。我沒有詳細說明如何從標準偏差中排序功能....在此先感謝 – Dev