Сообщество Engee

Гауссова смесь

Автор
avatar-artpgchartpgch
Notebook

Модель Гауссовой смеси

Введение

Моделирование вероятностных распределений сложной, многомодальной формы является фундаментальной задачей в статистическом анализе и машинном обучении. Одним из наиболее мощных и математически элегантных инструментов для её решения выступает модель Гауссовой смеси.

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

Исходные данные

Импортируем и присоединим необходимые библиотеки.

In [ ]:
import Pkg
Pkg.add("Distributions")
Pkg.add("PlotlyBase")
using Distributions
plotly()

Определим средние значения компонентов, ковариационные матрицы и пропорции для двухкомпонентной смеси двумерного Гауссовского распределения.

In [ ]:
mu = [[1.0, 2.0], [-3.0, -5.0]] # средние значения
sigma = [[2.0 0.0; 0.0 0.5], [1.0 0.0; 0.0 1.0]] # ковариационные матрицы
p = [0.5, 0.5] # пропорции

Строки матрицы mu соответствуют векторам средних значений каждого компонента, трёхмерный массив sigma содержит ковариационные матрицы каждого компонента.

Создание модели

Создадим модель Гауссовой смеси с помощью функции MixtureModel.

In [ ]:
gm = MixtureModel([MvNormal(μ, Σ) for (μ, Σ) in zip(mu, sigma)], p)
Out[0]:
MixtureModel{FullNormal}(K = 2)
components[1] (prior = 0.5000): FullNormal(
dim: 2
μ: [1.0, 2.0]
Σ: [2.0 0.0; 0.0 0.5]
)

components[2] (prior = 0.5000): FullNormal(
dim: 2
μ: [-3.0, -5.0]
Σ: [1.0 0.0; 0.0 1.0]
)

Отобразим свойства созданной модели.

In [ ]:
println("Количество компонент: ", length(gm.components))
println("Размерность: ", length(gm.components[1]))
println("Веса: ", gm.prior.p)
println("Типы компонент: ", typeof(gm.components[1]))
for (i, к) in enumerate(gm.components)
     println("\n  Компонента $i:")
     println("    Среднее: ", mean(к))
     println("    Ковариация: ", cov(к))
end
Количество компонент: 2
Размерность: 2
Веса: [0.5, 0.5]
Типы компонент: FullNormal

  Компонента 1:
    Среднее: [1.0, 2.0]
    Ковариация: [2.0 0.0; 0.0 0.5]

  Компонента 2:
    Среднее: [-3.0, -5.0]
    Ковариация: [1.0 0.0; 0.0 1.0]

Визуализация

Вычислим функцию плотности распределения и визуализируем её трёхмерную фигуру.

In [ ]:
gmPDF(x, y) = pdf(gm, [x, y])
gmPDF_vec(x, y) = [pdf(gm, [x[i], y[i]]) for i in 1:length(x)]
xs = range(-10, 10, length=100)
ys = range(-10, 10, length=100)
X = [x for x in xs, y in ys]
Y = [y for x in xs, y in ys]
Z = [gmPDF(x, y) for x in xs, y in ys]
p1 = surface(xs, ys, Z, title="Плотность распределения", xlabel="X", ylabel="Y", zlabel="", camera=(45, 30), colorbar=false, color=:viridis, grid=:on)
display(p1)

C помощью метода Монте-Карло, вычислим функцию распределения.

In [ ]:
function gmCDF(x, y)
    точек = 3*(10^4)
    точки = rand(gm, точек)
    сумма = sum(точки[1, :] .≤ x .&& точки[2, :] .≤ y)
    return сумма / точек
end

function gmCDF_vec(xs, ys)
    n = length(xs)
    Z_cdf = zeros(n, n)
    for i in 1:n
        for j in 1:n
            Z_cdf[i, j] = gmCDF(xs[i], ys[j])
        end
    end
    return Z_cdf
end

Z_cdf = gmCDF_vec(xs, ys)

И визуализируем её трёхмерную фигуру.

In [ ]:
p2 = surface(xs, ys, Z_cdf, title="Функция распределения", xlabel="X", ylabel="Y", zlabel="", camera=(45, 30), colorbar=false, color=:viridis, legend=false)
display(p2)

Заключение

Метод явного задания Гауссовой смеси демонстрирует принцип построения сложных вероятностных моделей из простых компонентов. Прямое определение параметров позволяет конструировать гипотетические распределения для планирования экспериментов и тестирования алгоритмов.

Области применения:

  • Синтез тестовых данных для оценки алгоритмов кластеризации и классификации

  • Задание априорных распределений в байесовском анализе

  • Моделирование многомодальных распределений в финансах и обработке сигналов

  • Инициализация EM-алгоритма для обучения моделей на реальных данных

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