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。
我正在尝试从特征向量中获取方差。
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。