Spec-Zone.ru › scikit-learn

Примечание

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

Модель Гауссовских Смесей Синусоидальная Кривая

Этот пример демонстрирует поведение моделей гауссовских смесей, подгоняемых к данным, которые не были сгенерированы из смеси гауссовских случайных величин. Набор данных состоит из 100 точек, слабо расположенных вдоль шумной синусоидальной кривой. Следовательно, нет истинных значений для количества гауссовских компонентов.

Первая модель — это классическая модель гауссовских смесей с 10 компонентами, подгоняемая алгоритмом ожидания-максимизации.

Вторая модель — это байесовская модель гауссовских смесей с предшествующим распределением Дирихле, подгоняемая с помощью вариационного вывода. Низкое значение предшествующего параметра концентрации заставляет модель предпочесть меньшее количество активных компонентов. Эта модель «решает» сконцентрировать свои возможности моделирования на общей структуре набора данных: группы точек с чередующимися направлениями, моделируемые недиагональными ковариационными матрицами. Эти чередующиеся направления приблизительно отражают чередующуюся природу исходного синусоидального сигнала.

Третья модель также является байесовской моделью гауссовских смесей с предшествующим распределением Дирихле, но на этот раз значение предшествующего параметра концентрации выше, что дает модели больше свободы для моделирования тонкой структуры данных. Результатом является смесь с большим количеством активных компонентов, похожая на первую модель, где мы произвольно решили зафиксировать количество компонентов в 10.

Лучшая модель — вопрос субъективного суждения: хотим ли мы отдать предпочтение моделям, которые описывают только общую картину, чтобы обобщить и объяснить большую часть структуры данных, игнорируя детали, или предпочитаем модели, которые точно следуют за областями высокой плотности сигнала?

Последние два графика показывают, как мы можем генерировать выборки из двух последних моделей. Полученные распределения выборок не точно соответствуют исходному распределению данных. Различие в первую очередь связано с ошибкой аппроксимации, допущенной нами при использовании модели, которая предполагает, что данные были сгенерированы конечным числом гауссовских компонентов вместо непрерывной шумной синусоидальной кривой.

Expectation-maximization, Bayesian Gaussian mixture models with a Dirichlet process prior for $\gamma_0=0.01$., Gaussian mixture with a Dirichlet process prior for $\gamma_0=0.01$ sampled with $2000$ samples., Bayesian Gaussian mixture models with a Dirichlet process prior for $\gamma_0=100$, Gaussian mixture with a Dirichlet process prior for $\gamma_0=100$ sampled with $2000$ samples.
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

import itertools

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from scipy import linalg

from sklearn import mixture

color_iter = itertools.cycle(["navy", "c", "cornflowerblue", "gold", "darkorange"])


def plot_results(X, Y, means, covariances, index, title):
    splot = plt.subplot(5, 1, 1 + index)
    for i, (mean, covar, color) in enumerate(zip(means, covariances, color_iter)):
        v, w = linalg.eigh(covar)
        v = 2.0 * np.sqrt(2.0) * np.sqrt(v)
        u = w[0] / linalg.norm(w[0])
        # as the DP will not use every component it has access to
        # unless it needs it, we shouldn't plot the redundant
        # components.
        if not np.any(Y == i):
            continue
        plt.scatter(X[Y == i, 0], X[Y == i, 1], 0.8, color=color)

        # Plot an ellipse to show the Gaussian component
        angle = np.arctan(u[1] / u[0])
        angle = 180.0 * angle / np.pi  # convert to degrees
        ell = mpl.patches.Ellipse(mean, v[0], v[1], angle=180.0 + angle, color=color)
        ell.set_clip_box(splot.bbox)
        ell.set_alpha(0.5)
        splot.add_artist(ell)

    plt.xlim(-6.0, 4.0 * np.pi - 6.0)
    plt.ylim(-5.0, 5.0)
    plt.title(title)
    plt.xticks(())
    plt.yticks(())


def plot_samples(X, Y, n_components, index, title):
    plt.subplot(5, 1, 4 + index)
    for i, color in zip(range(n_components), color_iter):
        # as the DP will not use every component it has access to
        # unless it needs it, we shouldn't plot the redundant
        # components.
        if not np.any(Y == i):
            continue
        plt.scatter(X[Y == i, 0], X[Y == i, 1], 0.8, color=color)

    plt.xlim(-6.0, 4.0 * np.pi - 6.0)
    plt.ylim(-5.0, 5.0)
    plt.title(title)
    plt.xticks(())
    plt.yticks(())


# Parameters
n_samples = 100

# Generate random sample following a sine curve
np.random.seed(0)
X = np.zeros((n_samples, 2))
step = 4.0 * np.pi / n_samples

for i in range(X.shape[0]):
    x = i * step - 6.0
    X[i, 0] = x + np.random.normal(0, 0.1)
    X[i, 1] = 3.0 * (np.sin(x) + np.random.normal(0, 0.2))

plt.figure(figsize=(10, 10))
plt.subplots_adjust(
    bottom=0.04, top=0.95, hspace=0.2, wspace=0.05, left=0.03, right=0.97
)

# Fit a Gaussian mixture with EM using ten components
gmm = mixture.GaussianMixture(
    n_components=10, covariance_type="full", max_iter=100
).fit(X)
plot_results(
    X, gmm.predict(X), gmm.means_, gmm.covariances_, 0, "Expectation-maximization"
)

dpgmm = mixture.BayesianGaussianMixture(
    n_components=10,
    covariance_type="full",
    weight_concentration_prior=1e-2,
    weight_concentration_prior_type="dirichlet_process",
    mean_precision_prior=1e-2,
    covariance_prior=1e0 * np.eye(2),
    init_params="random",
    max_iter=100,
    random_state=2,
).fit(X)
plot_results(
    X,
    dpgmm.predict(X),
    dpgmm.means_,
    dpgmm.covariances_,
    1,
    "Bayesian Gaussian mixture models with a Dirichlet process prior "
    r"for $\gamma_0=0.01$.",
)

X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
    X_s,
    y_s,
    dpgmm.n_components,
    0,
    "Gaussian mixture with a Dirichlet process prior "
    r"for $\gamma_0=0.01$ sampled with $2000$ samples.",
)

dpgmm = mixture.BayesianGaussianMixture(
    n_components=10,
    covariance_type="full",
    weight_concentration_prior=1e2,
    weight_concentration_prior_type="dirichlet_process",
    mean_precision_prior=1e-2,
    covariance_prior=1e0 * np.eye(2),
    init_params="kmeans",
    max_iter=100,
    random_state=2,
).fit(X)
plot_results(
    X,
    dpgmm.predict(X),
    dpgmm.means_,
    dpgmm.covariances_,
    2,
    "Bayesian Gaussian mixture models with a Dirichlet process prior "
    r"for $\gamma_0=100$",
)

X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
    X_s,
    y_s,
    dpgmm.n_components,
    1,
    "Gaussian mixture with a Dirichlet process prior "
    r"for $\gamma_0=100$ sampled with $2000$ samples.",
)

plt.show()

Общее время выполнения скрипта: (0 минут 0.524 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_gmm_sin.ipynb

Download Python source code: plot_gmm_sin.py

Download zipped: plot_gmm_sin.zip

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

Эллипсоиды Модели Гауссовских Смесей

Анализ параметра концентрации для вариационной байесовской модели гауссовских смесей

Оценивание плотности для гауссовской смеси

Ковариации модели Гауссовских смесей

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

Spec-Zone.ru

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