Sklearn PCA解释方差和解释方差比差

Sklearn PCA explained variance and explained variance ratio difference

我正在尝试从特征向量中获取方差。

explained_variance_ratio_explained_variance_PCA中有什么区别?

解释方差的百分比是:

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

来自文档:

explained_variance_ : array, shape (n_components,) The amount of variance explained by each of the selected components.

Equal to n_components largest eigenvalues of the covariance matrix of X.

New in version 0.18.

explained_variance_ratio_ : array, shape (n_components,) Percentage of variance explained by each of the selected components.

If n_components is not set then all components are stored and the sum of the ratios is equal to 1.0.

看看每个主成分有多重要,这只是归一化。你可以说: explained_variance_ratio_ = explained_variance_/np.sum(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_)

returns

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)

returns

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)

returns

Explained variance ratio calculated manually is
 [0.92461872 0.05306648]

此外,

print(sum(explained_var_ratio))

returns

0.9776852063187955

因此,explained_variance_ratio_ 的总和不等于 1.0,这意味着与 1.0 的小偏差包含在原始特征的其他成分中 space。