python - scikit-learn TruncatedSVD 的解释方差比不按降序排列

标签 python scikit-learn pca svd

<分区>

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

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

最佳答案

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

TruncatedSVD implements a variant of singular value decomposition (SVD) that only computes the largest singular values, where k is a user-specified parameter.

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

关于python - scikit-learn TruncatedSVD 的解释方差比不按降序排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35299061/

相关文章:

python - 应用引擎 : parse a csv data in uploaded file

python - SPOJ 下一个回文

python - 从 keras 生成器获取真实标签

r - 在 ggplot 中绘制 RDA(素食主义者)

c++ - opencv 内存不足

python - 如何在sklearn的PCA之后保留行标题

python - 将 "\n"添加到文本中的特定行

python - Django : When is sessionid cookie set ? [默认可用吗? ]

python - Sklearn 管道值错误 : could not convert string to float

python - XGBoost 产生非二进制预测