Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.

Выбор модели с помощью вероятностного PCA и факторного анализа (FA)

Вероятностный PCA и факторный анализ — это вероятностные модели. Поэтому правдоподобие новых данных можно использовать для выбора модели и оценки ковариации. Здесь мы сравниваем PCA и FA с помощью перекрёстной проверки на данных низкого ранга, зашумлённых гомоскедастичным шумом (дисперсия шума одинакова для каждого признака) или гетероскедастичным шумом (дисперсия шума различается для каждого признака). На втором этапе мы сравниваем правдоподобие модели с правдоподобиями, полученными с помощью оценок ковариации со сжатием.

Можно заметить, что при гомоскедастичном шуме и FA, и PCA успешно восстанавливают размерность подпространства низкого ранга. В этом случае правдоподобие для PCA выше, чем для FA. Однако при наличии гетероскедастичного шума PCA не справляется и завышает ранг. При подходящих условиях (выборе числа компонент) отложенные данные имеют более высокое правдоподобие для моделей низкого ранга, чем для моделей со сжатием.

Также сравнивается автоматическая оценка из работы Thomas P. Minka «Automatic Choice of Dimensionality for 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.491 секунды)

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 и максимальное правдоподобие

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

Линейный дискриминантный анализ для классификации: обычный, Ledoit–Wolf и OAS

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/decomposition/plot_pca_vs_fa_model_selection.html

Spec-Zone.ru

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