簡體   English   中英

Python scikit 學習 pca.explained_variance_ratio_ cutoff

[英]Python scikit learn pca.explained_variance_ratio_ cutoff

在選擇主成分 (k) 的數量時,我們選擇 k 作為最小值,以便例如保留 99% 的方差。

但是,在 Python Scikit 學習中,我不是 100% 確定pca.explained_variance_ratio_ = 0.99等於“保留了 99% 的方差”? 有誰能開導嗎? 謝謝。

  • Python Scikit 學習 PCA 手冊在這里

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

是的,你幾乎是對的。 pca.explained_variance_ratio_參數返回每個維度解釋的方差向量。 因此pca.explained_variance_ratio_[i]給出了僅由 i+1 維解釋的方差。

你可能想做pca.explained_variance_ratio_.cumsum() 這將返回一個向量x使得x[i]返回由前 i+1 個維度解釋的累積方差。

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% 的方差。

雖然這個問題已經超過 2 年了,但我想提供一個更新。 我想做同樣的事情,看起來 sklearn 現在提供了開箱即用的功能。

文檔中所述

如果 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)

這對我有用,在 PCA 部分打字更少。 為方便起見,添加其余部分。 只有“數據”需要在較早的階段進行定義。

import sklearn as sl
from sklearn.preprocessing import StandardScaler as ss
from sklearn.decomposition import PCA 

st = ss().fit_transform(data)
pca = PCA(0.80)
pc = pca.fit_transform(st) # << to retain the components in an object
pc

#pca.explained_variance_ratio_
print ( "Components = ", pca.n_components_ , ";\nTotal explained variance = ",
      round(pca.explained_variance_ratio_.sum(),5)  )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM