Примечание
Перейти к концу для загрузки полного примера кода. или для запуска этого примера в вашем браузере через JupyterLite или Binder
Выбор модели с помощью вероятностного PCA и факторного анализа (FA)
Вероятностный PCA и факторный анализ — это вероятностные модели. Следствием этого является то, что вероятность новых данных может быть использована для выбора модели и оценки ковариации. Здесь мы сравниваем PCA и FA с перекрестной проверкой на данных малой размерности, искаженных гомоскедастичным шумом (дисперсия шума одинакова для каждого признака) или гетероскедастичным шумом (дисперсия шума различна для каждого признака). На втором шаге мы сравниваем вероятность модели с вероятностями, полученными от оценок ковариации сжатия.
Можно наблюдать, что при гомоскедастичном шуме как FA, так и PCA успешно восстанавливают размер подпространства малой размерности. Вероятность с PCA в этом случае выше, чем с FA. Однако PCA терпит неудачу и переоценивает ранг при наличии гетероскедастичного шума. При соответствующих условиях (выбор числа компонент) вероятность данных, оставленных вне выборки, выше для моделей малой размерности, чем для моделей сжатия.
Также сравнивается автоматическая оценка из Автоматического выбора размерности для PCA. NIPS 2000: 598-604 Томаса П. Минки.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Создать данные
import numpy as np from scipy import linalg n_samples, n_features, rank = 500, 25, 5 sigma = 1.0 rng = np.random.RandomState(42) U, _, _ = linalg.svd(rng.randn(n_features, n_features)) X = np.dot(rng.randn(n_samples, rank), U[:, :rank].T) # Adding homoscedastic noise X_homo = X + sigma * rng.randn(n_samples, n_features) # Adding heteroscedastic noise sigmas = sigma * rng.rand(n_features) + sigma / 2.0 X_hetero = X + rng.randn(n_samples, n_features) * sigmas
Подогнать модели
import matplotlib.pyplot as plt
from sklearn.covariance import LedoitWolf, ShrunkCovariance
from sklearn.decomposition import PCA, FactorAnalysis
from sklearn.model_selection import GridSearchCV, cross_val_score
n_components = np.arange(0, n_features, 5) # options for n_components
def compute_scores(X):
pca = PCA(svd_solver="full")
fa = FactorAnalysis()
pca_scores, fa_scores = [], []
for n in n_components:
pca.n_components = n
fa.n_components = n
pca_scores.append(np.mean(cross_val_score(pca, X)))
fa_scores.append(np.mean(cross_val_score(fa, X)))
return pca_scores, fa_scores
def shrunk_cov_score(X):
shrinkages = np.logspace(-2, 0, 30)
cv = GridSearchCV(ShrunkCovariance(), {"shrinkage": shrinkages})
return np.mean(cross_val_score(cv.fit(X).best_estimator_, X))
def lw_score(X):
return np.mean(cross_val_score(LedoitWolf(), X))
for X, title in [(X_homo, "Homoscedastic Noise"), (X_hetero, "Heteroscedastic Noise")]:
pca_scores, fa_scores = compute_scores(X)
n_components_pca = n_components[np.argmax(pca_scores)]
n_components_fa = n_components[np.argmax(fa_scores)]
pca = PCA(svd_solver="full", n_components="mle")
pca.fit(X)
n_components_pca_mle = pca.n_components_
print("best n_components by PCA CV = %d" % n_components_pca)
print("best n_components by FactorAnalysis CV = %d" % n_components_fa)
print("best n_components by PCA MLE = %d" % n_components_pca_mle)
plt.figure()
plt.plot(n_components, pca_scores, "b", label="PCA scores")
plt.plot(n_components, fa_scores, "r", label="FA scores")
plt.axvline(rank, color="g", label="TRUTH: %d" % rank, linestyle="-")
plt.axvline(
n_components_pca,
color="b",
label="PCA CV: %d" % n_components_pca,
linestyle="--",
)
plt.axvline(
n_components_fa,
color="r",
label="FactorAnalysis CV: %d" % n_components_fa,
linestyle="--",
)
plt.axvline(
n_components_pca_mle,
color="k",
label="PCA MLE: %d" % n_components_pca_mle,
linestyle="--",
)
# compare with other covariance estimators
plt.axhline(
shrunk_cov_score(X),
color="violet",
label="Shrunk Covariance MLE",
linestyle="-.",
)
plt.axhline(
lw_score(X),
color="orange",
label="LedoitWolf MLE" % n_components_pca_mle,
linestyle="-.",
)
plt.xlabel("nb of components")
plt.ylabel("CV scores")
plt.legend(loc="lower right")
plt.title(title)
plt.show()
best n_components by PCA CV = 5 best n_components by FactorAnalysis CV = 5 best n_components by PCA MLE = 5 best n_components by PCA CV = 20 best n_components by FactorAnalysis CV = 5 best n_components by PCA MLE = 18
Общее время выполнения скрипта: (0 минут 3.148 секунды)
Связанные примеры
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/decomposition/plot_pca_vs_fa_model_selection.html

