Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу для скачивания полного примера кода. или для запуска этого примера в вашем браузере через JupyterLite или Binder

Выбор модели гауссовой смеси

В этом примере показано, что выбор модели можно выполнить с помощью моделей гауссовой смеси (GMM) с использованием критериев теории информации. Выбор модели касается как типа ковариации, так и числа компонентов в модели.

В данном случае и критерий Акаике (AIC), и критерий Байеса-Шварца (BIC) дают правильный результат, но мы демонстрируем только последний, так как BIC лучше подходит для определения истинной модели среди набора кандидатов. В отличие от байесовских процедур, такие выводы не зависят от априорных знаний.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Генерация данных

Мы генерируем два компонента (каждый из которых содержит n_samples) путем случайного отбора из стандартного нормального распределения, возвращаемого numpy.random.randn. Один компонент остается сферическим, но смещенным и перемасштабированным. Другой компонент деформирован, чтобы иметь более общую ковариационную матрицу.

import numpy as np

n_samples = 500
np.random.seed(0)
C = np.array([[0.0, -0.1], [1.7, 0.4]])
component_1 = np.dot(np.random.randn(n_samples, 2), C)  # general
component_2 = 0.7 * np.random.randn(n_samples, 2) + np.array([-4, 1])  # spherical

X = np.concatenate([component_1, component_2])

Мы можем визуализировать различные компоненты:

import matplotlib.pyplot as plt

plt.scatter(component_1[:, 0], component_1[:, 1], s=0.8)
plt.scatter(component_2[:, 0], component_2[:, 1], s=0.8)
plt.title("Gaussian Mixture components")
plt.axis("equal")
plt.show()
Gaussian Mixture components

Обучение и выбор модели

Мы изменяем количество компонентов от 1 до 6 и тип используемых параметров ковариации:

  • "full": каждый компонент имеет свою общую ковариационную матрицу.
  • "tied": все компоненты имеют одинаковую общую ковариационную матрицу.
  • "diag": каждый компонент имеет свою диагональную ковариационную матрицу.
  • "spherical": каждый компонент имеет свою собственную дисперсию.

Мы оцениваем различные модели и сохраняем лучшую модель (с наименьшим BIC). Это делается с помощью GridSearchCV и пользовательской функции оценки, которая возвращает отрицательный балл BIC, так как GridSearchCV предназначена для максимизации оценки (максимизация отрицательного BIC эквивалентна минимизации BIC).

Лучший набор параметров и оценщик хранятся в best_parameters_ и best_estimator_, соответственно.

from sklearn.mixture import GaussianMixture
from sklearn.model_selection import GridSearchCV


def gmm_bic_score(estimator, X):
    """Callable to pass to GridSearchCV that will use the BIC score."""
    # Make it negative since GridSearchCV expects a score to maximize
    return -estimator.bic(X)


param_grid = {
    "n_components": range(1, 7),
    "covariance_type": ["spherical", "tied", "diag", "full"],
}
grid_search = GridSearchCV(
    GaussianMixture(), param_grid=param_grid, scoring=gmm_bic_score
)
grid_search.fit(X)
GridSearchCV(estimator=GaussianMixture(),
             param_grid={'covariance_type': ['spherical', 'tied', 'diag',
                                             'full'],
                         'n_components': range(1, 7)},
             scoring=<function gmm_bic_score at 0x7656b7f06c10>)
В среде Jupyter, пожалуйста, перезапустите эту ячейку, чтобы отобразить HTML-представление, или доверьтесь блокноту.
На GitHub HTML-представление не может быть отображено, пожалуйста, попробуйте загрузить эту страницу с nbviewer.org.
GridSearchCV(estimator=GaussianMixture(),
             param_grid={'covariance_type': ['spherical', 'tied', 'diag',
                                             'full'],
                         'n_components': range(1, 7)},
             scoring=<function gmm_bic_score at 0x7656b7f06c10>)
GaussianMixture(n_components=2)
GaussianMixture(n_components=2)


Построение графиков баллов BIC

Для упрощения построения графиков мы можем создать pandas.DataFrame из результатов кросс-валидации, выполненной с помощью поиска по сетке. Мы повторно меняем знак значения BIC, чтобы показать эффект его минимизации.

import pandas as pd

df = pd.DataFrame(grid_search.cv_results_)[
    ["param_n_components", "param_covariance_type", "mean_test_score"]
]
df["mean_test_score"] = -df["mean_test_score"]
df = df.rename(
    columns={
        "param_n_components": "Number of components",
        "param_covariance_type": "Type of covariance",
        "mean_test_score": "BIC score",
    }
)
df.sort_values(by="BIC score").head()
Число компонентов Тип ковариации Оценка BIC
19 2 full 1046.829429
20 3 full 1084.038689
21 4 full 1114.517272
22 5 full 1148.512281
23 6 full 1179.977890


import seaborn as sns

sns.catplot(
    data=df,
    kind="bar",
    x="Number of components",
    y="BIC score",
    hue="Type of covariance",
)
plt.show()
plot gmm selection

В данном случае модель с 2 компонентами и полной ковариацией (что соответствует истинной модели генерации) имеет наименьшее значение BIC и поэтому выбрана поиском по сетке.

Построение графика лучшей модели

Мы строим эллипс, чтобы показать каждый гауссов компонент выбранной модели. Для этого необходимо найти собственные значения ковариационных матриц, возвращаемых covariances_ атрибутом. Форма этих матриц зависит от covariance_type,

  • "full": (n_components, n_features, n_features)
  • "tied": (n_features, n_features)
  • "diag": (n_components, n_features)
  • "spherical": (n_components,)
from matplotlib.patches import Ellipse
from scipy import linalg

color_iter = sns.color_palette("tab10", 2)[::-1]
Y_ = grid_search.predict(X)

fig, ax = plt.subplots()

for i, (mean, cov, color) in enumerate(
    zip(
        grid_search.best_estimator_.means_,
        grid_search.best_estimator_.covariances_,
        color_iter,
    )
):
    v, w = linalg.eigh(cov)
    if not np.any(Y_ == i):
        continue
    plt.scatter(X[Y_ == i, 0], X[Y_ == i, 1], 0.8, color=color)

    angle = np.arctan2(w[0][1], w[0][0])
    angle = 180.0 * angle / np.pi  # convert to degrees
    v = 2.0 * np.sqrt(2.0) * np.sqrt(v)
    ellipse = Ellipse(mean, v[0], v[1], angle=180.0 + angle, color=color)
    ellipse.set_clip_box(fig.bbox)
    ellipse.set_alpha(0.5)
    ax.add_artist(ellipse)

plt.title(
    f"Selected GMM: {grid_search.best_params_['covariance_type']} model, "
    f"{grid_search.best_params_['n_components']} components"
)
plt.axis("equal")
plt.show()
Selected GMM: full model, 2 components

Полное время выполнения скрипта: (0 минут 1.709 секунд)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_gmm_selection.ipynb

Download Python source code: plot_gmm_selection.py

Download zipped: plot_gmm_selection.zip

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

Гауссовые модели смешения Эллипсоиды

Выбор модели Lasso с помощью критериев информации

Линейный и квадратичный дискриминантный анализ с эллипсоидом ковариации

Гауссовы модели смешения Кривая синуса

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/mixture/plot_gmm_selection.html

Spec-Zone.ru

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