web-dev-qa-db-ja.com

Python scikit learn pca.explained_variance_ratio_ cutoff

達人、

主成分の数(k)を選択するとき、たとえば99%の分散が保持されるように、kを最小値に選択します。

ただし、Python Scikitの学習では、pca.explained_variance_ratio_ = 0.99が「分散の99%が保持されている」と等しいかどうかは100%確信できませんか。

  • Python Scikit learn PCAマニュアルはこちら

http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA

23
Chubaka

はい、あなたはほぼ正しいです。 _pca.explained_variance_ratio__パラメーターは、各次元で説明される分散のベクトルを返します。したがって、_pca.explained_variance_ratio_[i]_は、i + 1番目の次元のみによって説明される分散を与えます。

おそらくpca.explained_variance_ratio_.cumsum()を実行したいでしょう。これは、_x[i]_が最初のi + 1次元で説明される累積分散を返すようなベクトルxを返します。

_import numpy as np
from sklearn.decomposition import PCA

np.random.seed(0)
my_matrix = np.random.randn(20, 5)

my_model = PCA(n_components=5)
my_model.fit_transform(my_matrix)

print my_model.explained_variance_
print my_model.explained_variance_ratio_
print my_model.explained_variance_ratio_.cumsum()
_

_[ 1.50756565  1.29374452  0.97042041  0.61712667  0.31529082]
[ 0.32047581  0.27502207  0.20629036  0.13118776  0.067024  ]
[ 0.32047581  0.59549787  0.80178824  0.932976    1.        ]
_

したがって、ランダムグッズデータでは、_k=4_を選択した場合、分散の93.3%を保持します。

51
Curt F.

この質問は2年以上前ですが、これに関する最新情報を提供したいと思います。同じことをしたかったのですが、sklearnはこの機能をすぐに使えるようになりました。

docs で述べられているように

0 <n_components <1およびsvd_solver == 'full'の場合、説明する必要がある分散の量がn_componentsで指定された割合よりも大きくなるように、コンポーネントの数を選択します

必要なコードは今です

my_model = PCA(n_components=0.99, svd_solver='full')
my_model.fit_transform(my_matrix)
22
Yannic Klem