1

我正在嘗試使用PCA提取功能。現在我得到了來自StackExchange的MATLAB代碼,如下所示,它選擇PCA之後最相關的前100個功能。現在,當我執行代碼時,我發現特徵值已經在第一條語句中排序。爲什麼我們需要再次按降序排序?PCA後提取哪些特徵?

[eigenvectors, projected_data, eigenvalues] = princomp(proteingene); 
[foo, feature_idx] = sort(eigenvalues, 'descend'); 
selected_projected_data = projected_data(:, feature_idx(1:100)); 

的另一個問題是,根據我的功能集,projected_data變量顯示列(功能),它具有值爲0。這意味着,這些功能沒有太大的意義。我對嗎?

最後一個問題是,我怎麼知道哪些是在PCA中提取的功能?

+0

@beaker已添加指向代碼的鏈接 – girl101

回答

2

我發現特徵值已經在第一個 聲明中排序。爲什麼我們需要再次按降序排序?

您不需要再次排序,因爲princomp默認情況下會這樣做。但princomp現在已被棄用,因此您應該使用內置函數PCA

我只能推測,代碼的作者包括調用排序的完整性,所以他很清楚自己在做什麼(如排序返回feature_idx)。 下面的代碼片段,例如,達到相同的結果,但不清晰讀者:

[eigenvectors, projected_data, eigenvalues] = princomp(proteingene); 
selected_projected_data = projected_data(:, 1:100); 

對於別人學習PCA,什麼是1:100是什麼意思?

的另一個問題是,根據我的功能集,projected_data 變量顯示列(功能),它具有的值爲0。這意味着 這些功能沒有太大的意義。我對嗎?

我認爲一個非常保險的回答是說,你的功能沒有太大的意義,如果相應的特徵值已經接近0的值。你可以通過查看eigenvalue(feature_idx)檢查,在代碼的情況下,你發佈。條目爲0的列(特徵)僅表示它們不涵蓋空間的某個維度。你可以把它們想象成一個標準的實矢量空間中的向量。

最後一個問題是,我怎麼知道在PCA中提取的是哪些功能是 ?

這些在projected_data中給出!該變量包含沿着您的特徵向量投影的數據。 您會發現,特徵提取實際上是PCA分解之上的一種解釋。 PCA不會「提取」任何功能,只會更改描述數據的矢量基數(可以看到一個可視解釋here)。該基礎由proteingene的特徵向量組成。 要「提取」功能,您必須決定投影數據的哪些列與您相關。在代碼示例中,100個特徵被任意「提取」,沒有任何標準判斷它們對於特定給定問題的意義。

selected_projected_data = projected_data(:, feature_idx(1:100)); 

事實上,如果你的數據proteingene具有小於100米的尺寸,你甚至可以嘗試從它採用PCA提取100種功能的錯誤。