与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
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直接计算explain_variance,由于sigma按降序排列,explain_variance也按降序排列。另一方面,TruncatedSVD
使用变换矩阵的列的方差来计算explain_variance,因此方差不一定按降序排列。
这是否意味着我需要首先从explained_variance_ratio
对TruncatedSVD
进行排序才能找到前k个主要组件?
答案 0 :(得分:0)
您不必对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...]