Scikit-learn TruncatedSVD объяснил коэффициент отклонения не в порядке убывания
Объясненный коэффициент дисперсии TruncatedSVD не в порядке убывания, в отличие от склеарна 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
использует сигму для непосредственного вычисления объясненной переменной, и поскольку сигма находится в порядке убывания, объясненная переменная также находится в порядке убывания. С другой стороны, TruncatedSVD
использует дисперсию столбцов преобразованной матрицы для вычисления объясненной_вариантности, и, следовательно, дисперсии не обязательно находятся в порядке убывания.
Означает ли это, что мне нужно сначала отсортировать explained_variance_ratio
из TruncatedSVD
, чтобы найти основные компоненты принципа k?
Ответы
Ответ 1
Вам не нужно сортировать 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...]
Ответ 2
Извините за неровный ответ, но у меня точно такой же вопрос, и я не могу найти удовлетворительного объяснения. Почему explained_variance_ratio_
от TruncatedSVD
не в порядке убывания, как это было бы от PCA
? По моему опыту кажется, что первый элемент списка всегда самый низкий, а затем у второго элемента значение скачет вверх, а затем идет в порядке убывания оттуда. Почему explained_variance_ratio_[0]
< explained_variance_ratio_[1]
(> explained_variance_ratio_[2]
> explained_variance_ratio_[3]
...)? Означает ли это, что второй "компонент" на самом деле объясняет наибольшую дисперсию (не первый)?