簡體   English   中英

Sklearn PCA解釋方差和解釋方差比差

[英]Sklearn PCA explained variance and explained variance ratio difference

我正在嘗試從特征向量中獲取方差。

PCA中的explained_variance_ratio_explained_variance_有什么區別?

不幸的是,@seralouk 使用的示例已經只有 2 個組件。 因此,對pca.explained_variance_ratio_的解釋是不完整的。

分母應該是應用 PCA 之前原始特征集的pca.explained_variance_ratio_的總和,其中分量的數量可以大於 PCA 中使用的分量的數量。

這是使用 iris 數據集對此數量的解釋。

import numpy as np
from sklearn import datasets
from sklearn.decomposition import PCA

iris=datasets.load_iris()

X = iris.data     
#y = iris.target   

pca_2c_model=PCA(n_components=2)
x_pca_2c=pca_2c_model.fit_transform(X) 

print('Explained variance:\n', pca_2c_model.explained_variance_)

print('Explained variance ratio:\n', pca_2c_model.explained_variance_ratio_)

回報

Explained variance: 
 [4.22824171 0.24267075]
Explained variance ratio:
 [0.92461872 0.05306648]

數量pca_2c_model.explained_variance_包含兩個主成分協方差的對角線元素。 對於主成分,根據定義,協方差矩陣應該是對角線的。

var=np.cov(x_pca_2c.T)
explained_var=var.diagonal()
print('Explained variance calculated manually is\n',explained_var)

回報

Explained variance calculated manually is
 [4.22824171 0.24267075]

要計算比率,必須在 PCA 之前為原始特征集計算分母(即在所有組件上)。 因此,我們可以只使用完整特征集的協方差的跡來找到比率。 在這里,我們使用了矩陣的跡不變性的思想。

all_var=np.cov(X.T)
sum_all_var=np.sum(all_var.diagonal()) # same as np.trace(all_var)
explained_var_ratio=explained_var/sum_all_var
print('Explained variance ratio calculated manually is\n',explained_var_ratio)

回報

Explained variance ratio calculated manually is
 [0.92461872 0.05306648]

進一步,

print(sum(explained_var_ratio))

回報

0.9776852063187955

因此, explained_variance_ratio_的總和不會加到 1.0,這意味着與 1.0 的小偏差包含在原始特征空間的其他分量中。

解釋方差的百分比為:

explained_variance_ratio_

方差,即協方差矩陣的特征值是:

explained_variance_

公式: explained_variance_ratio_ = explained_variance_ / np.sum(explained_variance_)

例:

import numpy as np
from sklearn.decomposition import PCA
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components=2)
pca.fit(X)  
pca.explained_variance_
array([7.93954312, 0.06045688]) # the actual eigenvalues (variance)

pca.explained_variance_ratio_ # the percentage of the variance
array([0.99244289, 0.00755711])

同樣基於以上公式:

7.93954312 / (7.93954312+ 0.06045688) = 0.99244289

從文檔中:

解釋型變量_:數組,形狀(n_components,)由每個選定的分量說明的方差量。

等於X的協方差矩陣的n_components個最大特征值。

版本0.18中的新功能。

解釋的差異變量:數組,形狀(n_components,)每個選定分量解釋的方差百分比。

如果未設置n_components,則將存儲所有分量,並且比率之和等於1.0。

只是標准化,以了解每個主要組成部分的重要性。 您可以說: explained_variance_ratio_ = explained_variance_/np.sum(explained_variance_)

暫無
暫無

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

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