1. 程式人生 > >python sklearn PCA原始碼閱讀:引數n_components的設定(設為‘mle’出錯的原因)

python sklearn PCA原始碼閱讀:引數n_components的設定(設為‘mle’出錯的原因)

  按照文章中對於n_components的介紹,我對一個1000x9000的array進行了主成分分析,n_components選擇為"mle“,即自動選擇(因為剛接觸PCA,並不知道咋設定( ˇˍˇ )),嘗試幾次,每次都會報出下面的錯誤.

  百思不得其解,終於通過閱讀原始碼找到了原因。

就是因為svd_solver同樣設定為了自動選擇‘auto’,而它在選擇的過程中,需要比較n_components,1,0.8*min(X.shape)的大小關係,所以會報錯,所以n_components該如何設定?

n_components的設定與引數svd_solver的設定是相關聯的,而它們的設定又都跟輸入資料x的維度相關,通過閱讀原始碼和說明文件總結如下。

  svd_solver的設定有四種情況:'auto','fill','arpack','randomized',自動選擇  'auto'的選擇機制如下: x.shape>500 並且 1<=n_components<0.8*min(x.shape)時,svd_solver=‘randomsize',否則,svd_solver=’full‘。

  n_components是要保留的成分,int 或者 string,預設時預設為None,所有成分被保留,但是這三種設定並不適用於所有情況,下面的表格說明了兩個引數之間的關聯:

表格說明了n_components設定為‘mle’或整數時需要滿足的條件,其中,“No”表示不能設定為該值。所以我們看到,只有輸入資料的樣本數多於特徵數,並且svd_solver設定為‘full'時,才可以將n_components設定為’mle';同時注意當svd_solve設定為‘arpack’時,保留的成分必須少於特徵數,即不能保留所有成分。另外,當n_components預設時,所有成分被保留,最終保留的成分數為min(sample,features),原理在這裡不做說明。