Введение
В этом лабораторном занятии мы будем использовать алгоритм смеси Гауссовых распределений для подгонки набора данных, который следит за шумной синусоидой. Мы будем использовать два разных типа смесей Гауссовых распределений, а именно алгоритм Expectation-Maximization и смесь Гауссовых распределений с априорным распределением Дирихле.
Советы по использованию ВМ
После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Загрузка необходимых библиотек
Начнем с загрузки необходимых библиотек для этой лабораторной работы.
import itertools
import numpy as np
from scipy import linalg
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import mixture
Генерация набора данных
Далее мы сгенерируем набор данных, который следит за шумной синусоидой.
## 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))
Подгонка смеси Гауссовых распределений с использованием EM
Мы подгоним классическую смесь Гауссовых распределений с 10 компонентами с использованием алгоритма Expectation-Maximization.
## Fit a Gaussian mixture with EM using ten components
gmm = mixture.GaussianMixture(
n_components=10, covariance_type="full", max_iter=100
).fit(X)
Построение результатов алгоритма EM
Мы построим результаты алгоритма Expectation-Maximization.
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])
## поскольку DP не будет использовать каждую доступную компоненту,
## если это не нужно, мы не должны рисовать лишние
## компоненты.
if not np.any(Y == i):
continue
plt.scatter(X[Y == i, 0], X[Y == i, 1], 0.8, color=color)
## Построить эллипс, чтобы показать гауссовскую компоненту
angle = np.arctan(u[1] / u[0])
angle = 180.0 * angle / np.pi ## преобразовать в градусы
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(())
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.",
)
Резюме
В этом практическом занятии мы использовали алгоритм смеси Гауссовых распределений для подгонки набора данных, который следуют за шумной синусоидой. Мы использовали два различных типа смеси Гауссовых распределений, а именно алгоритм Expectation-Maximization и смесь Гауссовых распределений с априорным распределением Дирихле. Мы построили графики результатов и получили выборки из обоих моделей для сравнения их производительности. Выбор наилучшей модели субъективен и зависит от того, хотим ли мы сосредоточиться на целом представлении или тщательно следить за высокой плотностью областей сигнала.