TruncatedSVD的解释方差比并不像sklearn的PCA那样按降序排列。我查看了源代码,发现它们使用了不同的计算解释方差比的方法:
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
使用转换矩阵的列的方差来计算解释的方差,因此这些方差不一定按降序排列。
这是否意味着我需要首先对来自TruncatedSVD
的explained_variance_ratio
进行排序,以找到前k个主成分?