Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу для загрузки полного примера кода. или для запуска этого примера в вашем браузере через 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()
  • Homoscedastic Noise
  • Heteroscedastic Noise
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 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_pca_vs_fa_model_selection.ipynb

Download Python source code: plot_pca_vs_fa_model_selection.py

Download zipped: plot_pca_vs_fa_model_selection.zip

Связанные примеры

Факторный анализ (с вращением) для визуализации закономерностей

Оценки ковариации сжатия: LedoitWolf против OAS и максимального правдоподобия

Робастная оценка ковариации и значимость расстояний Махаланобиса

Регрессия с гауссовскими процессами: базовый вводный пример

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API