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

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом практическом занятии мы будем использовать библиотеку scikit-learn для генерации датасета с гауссовскими смесями. Затем мы подберем модель смеси гауссов (Gaussian Mixture Model, GMM) для этого датасета и построим график оценки плотности смеси гауссов. GMM можно использовать для моделирования и оценки распределения вероятностей датасета.

Советы по использованию ВМ

После запуска виртуальной машины (VM) нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импорт библиотек

Начнем с импорта необходимых библиотек: NumPy для численных вычислений и Matplotlib для визуализации. Также импортируем класс GaussianMixture из библиотеки scikit-learn, чтобы подобрать GMM для нашего датасета.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import mixture

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

Далее мы сгенерируем датасет с гауссовскими смесями, состоящий из двух компонентов. Создадим сдвинутый гауссовский датасет, центрированный вокруг точки (20, 20), и гауссовский датасет с нулевым центром, растянутый по осям. Затем объединим эти два датасета в обучающий набор.

n_samples = 300

## генерируем случайную выборку, две компоненты
np.random.seed(0)

## генерируем сферические данные, центрированные вокруг (20, 20)
shifted_gaussian = np.random.randn(n_samples, 2) + np.array([20, 20])

## генерируем гауссовские данные с нулевым центром, растянутые по осям
C = np.array([[0.0, -0.7], [3.5, 0.7]])
stretched_gaussian = np.dot(np.random.randn(n_samples, 2), C)

## объединяем два датасета в обучающий набор
X_train = np.vstack([shifted_gaussian, stretched_gaussian])

Подгонка модели смеси гауссов

Теперь мы подгоним GMM к датасету с использованием класса GaussianMixture из scikit-learn. Зададим количество компонентов равным 2 и тип ковариации "full".

## подгоняем модель смеси гауссов с двумя компонентами
clf = mixture.GaussianMixture(n_components=2, covariance_type="full")
clf.fit(X_train)

Построение графика оценки плотности

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

## отображаем предсказанные оценки модели в виде контурной диаграммы
x = np.linspace(-20.0, 30.0)
y = np.linspace(-20.0, 40.0)
X, Y = np.meshgrid(x, y)
XX = np.array([X.ravel(), Y.ravel()]).T
Z = -clf.score_samples(XX)
Z = Z.reshape(X.shape)

CS = plt.contour(
    X, Y, Z, norm=LogNorm(vmin=1.0, vmax=1000.0), levels=np.logspace(0, 3, 10)
)
CB = plt.colorbar(CS, shrink=0.8, extend="both")
plt.scatter(X_train[:, 0], X_train[:, 1], 0.8)

plt.title("Density Estimation with Gaussian Mixture Models")
plt.axis("tight")
plt.show()

Резюме

В этом практическом занятии мы узнали, как использовать scikit-learn для генерации датасета с гауссовскими смесями и подгонки GMM к этому датасету. Также построили график оценки плотности смеси гауссов с использованием контурной диаграммы.