scikit-learn中TruncatedSVD的解释方差比率未按降序排列

12

TruncatedSVD的解释方差比并不像sklearn的PCA那样按降序排列。我查看了源代码,发现它们使用了不同的计算解释方差比的方法:

TruncatedSVD

U, Sigma, VT = randomized_svd(X, self.n_components,
                              n_iter=self.n_iter,
                              random_state=random_state)
X_transformed = np.dot(U, np.diag(Sigma))
self.explained_variance_ = exp_var = np.var(X_transformed, axis=0)
if sp.issparse(X):
    _, full_var = mean_variance_axis(X, axis=0)
    full_var = full_var.sum()
else:
    full_var = np.var(X, axis=0).sum()
self.explained_variance_ratio_ = exp_var / full_var

主成分分析:


U, S, V = linalg.svd(X, full_matrices=False)
explained_variance_ = (S ** 2) / n_samples
explained_variance_ratio_ = (explained_variance_ /
                             explained_variance_.sum())
PCA使用sigma直接计算解释的方差,由于sigma是按降序排列的,所以解释的方差也是按降序排列的。另一方面,TruncatedSVD使用转换矩阵的列的方差来计算解释的方差,因此这些方差不一定按降序排列。

这是否意味着我需要首先对来自TruncatedSVDexplained_variance_ratio进行排序,以找到前k个主成分?

1个回答

0

你不需要对 explianed_variance_ratio 进行排序,它本身的输出已经是排序后的结果,并且只包含了 n_component 个值。
参考 文档

TruncatedSVD 实现了一种奇异值分解(SVD)的变体,它仅计算最大的奇异值,其中 k 是用户指定的参数。

X_transformed 包含仅使用 k 个组件的分解。

示例 将帮助您了解此概念。

>>> from sklearn.decomposition import TruncatedSVD
>>> from sklearn.random_projection import sparse_random_matrix
>>> X = sparse_random_matrix(100, 100, density=0.01, random_state=42)
>>> svd = TruncatedSVD(n_components=5, n_iter=7, random_state=42)
>>> svd.fit(X)  
TruncatedSVD(algorithm='randomized', n_components=5, n_iter=7,
        random_state=42, tol=0.0)
>>> print(svd.explained_variance_ratio_)  
[0.0606... 0.0584... 0.0497... 0.0434... 0.0372...]
>>> print(svd.explained_variance_ratio_.sum())  
0.249...
>>> print(svd.singular_values_)  
[2.5841... 2.5245... 2.3201... 2.1753... 2.0443...]

1
我认为他们可能已经在随机SVD中修复了这个问题,我将挖出2年前导致问题的数据集并再次进行测试。 - Xiangyu
对我来说,比率也没有按降序排序,并且总和不为1,这不符合我的比率理解!我使用的是sklearn版本0.21.3。 - Timomo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接