【问题标题】:scikit-learn TruncatedSVD's explained variance ratio not in descending order [duplicate]scikit-learn TruncatedSVD的解释方差比不是降序[重复]
【发布时间】:2016-05-19 20:26:59
【问题描述】:

与 sklearn 的 PCA 不同,TruncatedSVD 的解释方差比不是按降序排列的。我查看了源代码,似乎他们使用不同的方式来计算解释方差比:

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

PCA

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 直接计算explained_variance,由于sigma 是降序的,所以explain_variance 也是降序的。另一方面,TruncatedSVD 使用变换矩阵列的方差来计算解释方差,因此方差不一定按降序排列。

这是否意味着我需要先从TruncatedSVD 中对explained_variance_ratio 进行排序才能找到前k 个主成分?

【问题讨论】:

    标签: python scikit-learn pca svd


    【解决方案1】:

    您不必对explianed_variance_ratio 进行排序,输出本身将被排序并且仅包含n_component 的值数量。
    来自Documentation

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

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

    example 会给你一个想法

    >>> 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...]
    

    【讨论】:

    • 我认为他们可能已经解决了 random_svd 中的问题,我将挖掘出我在 2 年前使用的导致问题的数据集并再次测试。
    • 对我来说,比率也不是按降序排列的,也不总和为 1,这不是我对比率的理解!我使用 sklearn 版本 0.21.3
    猜你喜欢
    • 2020-08-27
    • 2014-01-01
    • 2015-06-19
    • 2016-07-15
    • 2021-10-15
    • 2019-12-09
    • 1970-01-01
    • 2019-06-22
    • 2016-12-18
    相关资源
    最近更新 更多