Python scikit learn pca.explained_variance_ratio_ cutoff

Гуру,

При выборе количества главных компонентов (k) мы выбираем k как наименьшее значение, так что, например, сохраняется 99% дисперсии.

Тем не менее, в изучении Python Scikit я не уверен на 100%, что pca.explained_variance_ratio_ = 0.99 равен "99% отклонения сохраняется"? Может ли кто-нибудь просветить? Благодаря.

  • Python Scikit learn PCA руководство здесь

http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA

Ответ 1

Да, ты почти прав. Параметр pca.explained_variance_ratio_ возвращает вектор дисперсии, объясняемый каждым измерением. Таким образом, pca.explained_variance_ratio_[i] дает дисперсию, объясняемую исключительно я + 1-м измерением.

Возможно, вы захотите сделать pca.explained_variance_ratio_.cumsum(). Это вернет вектор x, так что x[i] возвращает кумулятивную дисперсию, объясненную с помощью первых измерений я + 1.

import numpy as np
from sklearn.decomposition import PCA

np.random.seed(0)
my_matrix = np.random.randn(20, 5)

my_model = PCA(n_components=5)
my_model.fit_transform(my_matrix)

print my_model.explained_variance_
print my_model.explained_variance_ratio_
print my_model.explained_variance_ratio_.cumsum()

[ 1.50756565  1.29374452  0.97042041  0.61712667  0.31529082]
[ 0.32047581  0.27502207  0.20629036  0.13118776  0.067024  ]
[ 0.32047581  0.59549787  0.80178824  0.932976    1.        ]

Таким образом, в моих данных случайных игрушек, если бы я выбрал k=4, я бы сохранил 93,3% от дисперсии.

Ответ 2

Хотя этот вопрос старше 2 лет, я хочу предоставить обновленную информацию по этому вопросу. Я хотел сделать то же самое, и похоже, что sklearn теперь предоставляет эту функцию из коробки.

Как указано в документах

если 0 & lt; n_components & lt; 1 и svd_solver == ‘full, выберите количество компонентов таким образом, чтобы количество отклонений, которое необходимо объяснить, превышало процент, указанный в n_components

Таким образом, требуемый код теперь

my_model = PCA(n_components=0.99, svd_solver='full')
my_model.fit_transform(my_matrix)