Обяснен алгоритъм за клъстериране на моделите на Гаусова смес

Гаусовите смесени модели могат да се използват за групиране на немаркирани данни по почти същия начин като k-средните. Има обаче няколко предимства при използването на смесени модели на Гаус пред k-средните.

Първо и най-важно, k-средните не отчитат дисперсията. Под вариация имаме предвид ширината на камбанообразната крива.

В две измерения дисперсията (по-точно ковариацията) определя формата на разпределението.

Един от начините да мислим за модела на k-средствата е, че той поставя кръг (или, в по-високи измерения, хиперсфера) в центъра на всеки клъстер, с радиус, определен от най-отдалечения точка в клъстера.

Това работи добре, когато вашите данни са кръгови. Въпреки това, когато вашите данни приемат различна форма, в крайна сметка получавате нещо подобно.

За разлика от тях моделите на Гаусова смес могат да се справят дори с много продълговати клъстери.

Втората разлика между k-средните и моделите на Гаусовата смес е, че първият извършва твърда класификация, докато вторият извършва мека класификация. С други думи, k-средните ни казват коя точка от данни принадлежи към кой клъстер, но няма да ни предостави вероятностите дадена точка от данни да принадлежи към всеки от възможните клъстери.

При извикването на функцията predict моделът ще присвои всяка точка от данни на един от клъстерите.

gmm.predict(X)

От друга страна, можем да извикаме функцията predict_proba, за да върнем вероятностите дадена точка от данни да принадлежи на всеки от клъстерите K.

gmm.predict_proba(X)

Гаусови смесени модели с един поглед

Както подсказва името, моделът на гаусовата смес включва смесването (т.е. суперпозицията) на множество гаусови разпределения. За целите на обяснението, да предположим, че имаме три дистрибуции, съставени от проби от три различни класа.

Синият Гаус представлява нивото на образование на хората, които съставляват по-ниската класа. Червеният Гаус представлява нивото на образование на хората, които съставляват средната класа, а зеленият Гаус представлява нивото на образование на хората, които съставляват висшата класа.

Без да знаем какви проби идват от кой клас, нашата цел ще бъде да използваме смесени модели на Гаус, за да присвоим точките от данни към подходящия клъстер.

След като обучим модела, в идеалния случай бихме завършили с три разпределения на една и съща ос. След това, в зависимост от нивото на образование на дадена извадка (където се намира на оста), ще я поставим в една от трите категории.

Всяко разпределение се умножава по тегло π, за да се отчете фактът, че нямаме равен брой проби от всяка категория. С други думи, може да сме включили само 1000 души от висшата класа и 100 000 души от средната класа.

Тъй като имаме работа с вероятности, теглата трябва да се добавят към 1, когато се сумират.

Ако решим да добавим друго измерение като броя на децата, тогава може да изглежда по следния начин.

Алгоритъм на модела на гаусовата смес

За тези от вас, които не са склонни към математика, се извинявам предварително, тъй като следващият раздел е доста тежък.

Да предположим, че искаме да знаем каква е вероятността i-тата проба да е от Gaussian k. Можем да изразим това като:

Където тита представлява средната стойност, ковариацията и теглото за всеки Гаус.

Може също да срещнете уравнението, записано като π. Това не трябва да се бърка с теглото, свързано с всеки Гаус (объркващо, знам).

След това изразяваме вероятността за наблюдение на точка от данни, като се има предвид, че идва от Gaussian K като:

Последното понякога се пише по следния начин (вярвам, че N идва от Nнормално разпределение):

Да предположим, че имаме гаусово разпределение, където хоризонталната ос е различните IQ резултати, които индивидът би могъл да получи, от най-ниския до най-високия. Можем да разберем колко вероятно е даден индивид да има коефициент на интелигентност 120, като начертаем вертикална линия от позицията по оста x до кривата и след това погледнем съответната стойност на оста y. Стойността на y във всяка точка е равна на уравнението по-горе.

Ако искаме да знаем вероятността да наблюдаваме извадкатаiкато вземаме предвид всички различни разпределения, ние просто сумираме вероятностите да наблюдаваме извадката, като се има предвид, че е дошла от всяка от възможните гаусиани.

Казано по друг начин, ние вземаме една извадка (ред) от нашия набор от данни, разглеждаме една характеристика (т.е. ниво на образование), начертаваме нейната позиция по оста x и сумираме съответните стойности на y (вероятност) за всяко разпределение.

За да разширим това до всички проби в нашия набор от данни. Предполагаме, че вероятността за наблюдение на една проба е независима от всички останали и тогава можем просто да ги умножим.

Можем да пренапишем уравнението, като използваме номенклатурата, която видяхме по-рано, както следва:

По-често вземаме логаритъм на вероятността, защото умножението на две числа вътре в логаритъм е равно на сумата от логаритмите на неговите съставни части и е по-лесно да добавяме числа, отколкото да ги умножаваме.

Алгоритъм за максимизиране на очакванията (EM).

Тепърва трябва да обърнем внимание на факта, че се нуждаем от параметрите на всеки гаус (т.е. дисперсия, средна стойност и тегло), за да групираме нашите данни, но трябва да знаем коя извадка принадлежи към какъв гаус, за да оценим същите тези параметри.

Това е мястото, къдетоeмаксимизирането на очакванията влиза в действие. На високо ниво алгоритъмът за максимизиране на очакванията може да бъде описан, както следва:

  1. Започнете със случайни параметри на Гаус (θ)
  2. Повторете следното, докато се сближим:

a) Стъпка на очакване: Изчислете p(zi = k | xi, θ). С други думи, пробата i изглежда ли сякаш идва от клъстер k?

b) Стъпка на максимизиране: Актуализирайте гаусовите параметри (θ)за да отговарят на присвоените им точки.

Стъпка на максимизиране

В стъпката на максимизиране искаме да увеличим максимално вероятността всяка проба да идва от разпределението. Спомнете си, че вероятността е височината на кривата в точка по оста x. Следователно искаме да модифицираме дисперсията и средната стойност на разпределението, така че височината на диаграмата във всяка точка от данни да е максимална.

Това повдига въпроса „Как трябва да подходим към избора на оптималните стойности за дисперсията и средната стойност.“ Използвайки общата форма на максимизиране на очакванията, можем да извлечем набор от уравнения за средна стойност, дисперсия и тегло.

Можем да следваме същия процес, за да получим уравненията за ковариацията и теглото.

След като имаме уравненията, ние просто ги прилагаме по време на стъпката на максимизиране. Тоест, ние добавяме числата във всяко уравнение, за да определим най-добрата средна стойност, ковариация, тегло и след това задаваме гаусовите параметри съответно.

Нека да разгледаме математиката в действие. Първоначално не знаем кои точки са свързани с кое разпределение.

Започваме с K гаусиани (в този случай K=2) с произволна средна стойност, дисперсия и тегло.

След това повтаряме стъпките за очакване и максимизиране, докато няма малка или никаква промяна в тита (θ).

Заслужава да се отбележи, че алгоритъмът е податлив на локални максимуми.

Код

Сега, след като вече разбираме как работят моделите на Гаусова смес, нека да разгледаме как можем да ги приложим. За да започнете, импортирайте следните библиотеки.

import numpy as np
from sklearn.datasets.samples_generator import make_blobs
from sklearn.mixture import GaussianMixture
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

На случаен принцип генерираме 4 клъстера.

X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
plt.scatter(X[:,0], X[:,1])

Оптималният брой клъстери (K) е стойността, която минимизира информационния критерий на Akaike (AIC) или информационния критерий на Байес (BIC).

n_components = np.arange(1, 21)
models = [GaussianMixture(n, covariance_type='full', random_state=0).fit(X) for n in n_components]
plt.plot(n_components, [m.bic(X) for m in models], label='BIC')
plt.plot(n_components, [m.aic(X) for m in models], label='AIC')
plt.legend(loc='best')
plt.xlabel('n_components');

Ние обучаваме нашия модел, използвайки оптималния брой клъстери (в този случай 4).

gmm = GaussianMixture(n_components=4)
gmm.fit(X)

Използваме метода predict, за да получим списък с точки и съответните им клъстери.

labels = gmm.predict(X)
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis');

Последни мисли

За разлика от k-средните стойности, моделите на Гаусова смес отчитат дисперсията и връщат вероятността дадена точка от данни да принадлежи към всеки от клъстерите K.