Методы инициализации модели смеси Гаусса

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии мы узнаем о различных методах инициализации для Gaussian Mixture Models (GMM). Мы будем использовать библиотеку scikit-learn для генерации выборочных данных и визуализации результатов кластеризации. Существует четыре различных метода для параметра инициализации init_param: kmeans (по умолчанию), random, random_from_data и k-means++.

Советы по работе с ВМ

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/mixture("Gaussian Mixture Models") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/utils("Utilities") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/mixture -.-> lab-49135{{"Методы инициализации модели смеси Гаусса"}} sklearn/utils -.-> lab-49135{{"Методы инициализации модели смеси Гаусса"}} sklearn/datasets -.-> lab-49135{{"Методы инициализации модели смеси Гаусса"}} ml/sklearn -.-> lab-49135{{"Методы инициализации модели смеси Гаусса"}} end

Импортируем библиотеки и генерируем выборочные данные

Начнем с импорта необходимых библиотек и генерации некоторых выборочных данных с использованием функции make_blobs из scikit-learn.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.mixture import GaussianMixture
from sklearn.utils.extmath import row_norms
from sklearn.datasets._samples_generator import make_blobs
from timeit import default_timer as timer

## Generate some data
X, y_true = make_blobs(n_samples=4000, centers=4, cluster_std=0.60, random_state=0)
X = X[:, ::-1]

n_samples = 4000
n_components = 4
x_squared_norms = row_norms(X, squared=True)

Определим функцию для получения начальных средних значений

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

def get_initial_means(X, init_params, r):
    ## Run a GaussianMixture with max_iter=0 to output the initialization means
    gmm = GaussianMixture(
        n_components=4, init_params=init_params, tol=1e-9, max_iter=0, random_state=r
    ).fit(X)
    return gmm.means_

Построим график выборочных данных и центров инициализации

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

methods = ["kmeans", "random_from_data", "k-means++", "random"]
colors = ["navy", "turquoise", "cornflowerblue", "darkorange"]
times_init = {}
relative_times = {}

plt.figure(figsize=(4 * len(methods) // 2, 6))
plt.subplots_adjust(
    bottom=0.1, top=0.9, hspace=0.15, wspace=0.05, left=0.05, right=0.95
)

for n, method in enumerate(methods):
    r = np.random.RandomState(seed=1234)
    plt.subplot(2, len(methods) // 2, n + 1)

    start = timer()
    ini = get_initial_means(X, method, r)
    end = timer()
    init_time = end - start

    gmm = GaussianMixture(
        n_components=4, means_init=ini, tol=1e-9, max_iter=2000, random_state=r
    ).fit(X)

    times_init[method] = init_time
    for i, color in enumerate(colors):
        data = X[gmm.predict(X) == i]
        plt.scatter(data[:, 0], data[:, 1], color=color, marker="x")

    plt.scatter(
        ini[:, 0], ini[:, 1], s=75, marker="D", c="orange", lw=1.5, edgecolors="black"
    )
    relative_times[method] = times_init[method] / times_init[methods[0]]

    plt.xticks(())
    plt.yticks(())
    plt.title(method, loc="left", fontsize=12)
    plt.title(
        "Iter %i | Init Time %.2fx" % (gmm.n_iter_, relative_times[method]),
        loc="right",
        fontsize=10,
    )
plt.suptitle("GMM iterations and relative time taken to initialize")
plt.show()

Интерпретируем результаты

Из графика мы можем увидеть, что k-means++ хорошо справляется как с низким временем инициализации, так и с малым количеством итераций GaussianMixture для сходимости. При инициализации с использованием random_from_data или random модель требует большего количества итераций для сходимости. Все три альтернативных метода занимают меньше времени на инициализацию по сравнению с kmeans.

Резюме

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