2012-05-30 60 views
5

我必須寫一個分類器(高斯混合模型),我用它來進行人類動作識別。 我有4個視頻數據集。我選擇其中3個作爲訓練集,其中1個作爲測試集。 在我將gm模型應用到訓練集之前,我在其上運行pca。主成分分析

pca_coeff=princomp(trainig_data); 
score = training_data * pca_coeff; 
training_data = score(:,1:min(size(score,2),numDimension)); 

在測試步驟中,我應該怎麼做?我應該執行的測試數據

new_pca_coeff=princomp(testing_data); 
score = testing_data * new_pca_coeff; 
testing_data = score(:,1:min(size(score,2),numDimension)); 

或者我應該用我計算訓練數據的pca_coeff新princomp?

score = testing_data * pca_coeff; 
testing_data = score(:,1:min(size(score,2),numDimension)); 

回答

7

該分類器正在訓練由訓練數據的主要部分定義的空間中的數據。在不同的空間評估它是沒有意義的 - 因此,您應該將相同的轉換應用於測試數據,就像您對訓練數據所做的那樣,所以不要計算不同的pca_coef。令人驚訝的是,如果您的測試數據與訓練數據的分佈獨立,那麼對於足夠大的訓練和測試集,主要組件應該大致相同。

一種用於選擇使用多少個主要組件的方法涉及檢查來自PCA分解的特徵值。可以從這樣的princomp函數得到這些:然後

​​

eigenvalues變量將是其中每個元素描述方差由相應的主成分佔量的陣列。如果你這樣做:

plot(eigenvalues); 

你應該看到的是,第一特徵值將是最大的,他們會迅速減少(這就是所謂的「碎石圖」,而應該是這樣的:http://www.ats.ucla.edu/stat/SPSS/output/spss_output_pca_5.gif,雖然你的一個可能有多達800點而不是12點)。

具有小對應特徵值的主成分不可能有用,因爲這些維數據的方差非常小。許多人選擇一個閾值,然後選擇特徵值高於該閾值的所有主成分。選擇閾值的一種非正式方法是查看Scree圖並選擇閾值緊跟在「平穩」之後 - 在前面鏈接的圖像中,好的值可能是〜0.8,選擇3或4個主成分。

IIRC,你可以這樣做:

proportion_of_variance = sum(eigenvalues(1:k)) ./ sum(eigenvalues); 

計算「由低維數據描述方差的比例」。

但是,由於您正在使用分類任務的主要組件,因此您無法真正確定任何特定數量的PC是否是最佳的;特徵的方差並不一定告訴你任何關於分類的有用程度。使用Scree圖選擇PC的另一種方法就是嘗試使用各種主要組件進行分類,並根據經驗確定最佳數字。

+0

謝謝Richante,你的回答很明確和有用。我有另一個疑問。我必須使用多少個組件?對於每個觀察,我計算800個特徵,這些是原始數據的維度。 numDimension的最佳選擇是什麼?是否有我可以使用的公式,或者是否應該通過實驗結果選擇它? –

+0

我在原始答案中添加了一些信息來描述如何選擇主要組件的數量。簡單的答案是:沒有一個好的公式,通過實驗選擇可能沒問題。 – Richante

+0

關於最後一行代碼'proportion_of_variance = ...',Matlab docs計算如下:'proportion_of_variance = cumsum(eigenvalues)./ sum(eigenvalues)',減輕對'k'變量的需求,而不是你得到一個向量,並可以做一個查找來找到達到閾值的位置。 – Unapiedra