1. 程式人生 > >Mixture of Gaussian(高斯混合原型聚類)

Mixture of Gaussian(高斯混合原型聚類)

高斯混合聚類原理:

這裡寫圖片描述

高斯混合模型(Gaussian Mixture Model ,GMM)也是原型聚類,和上一篇總結的K-meansLVQ一樣,不過與它們不同的是,GMM沒有想用原型向量來刻畫聚類結構的不同。因為比如用k-means演算法解決聚類問題非常簡單,將資料聚為一個一個的點,但這樣往往比較粗糙,不適用於很多資料集。所以是採用概率模型來表達原型,即通過統計得到每個樣本點屬於各個類的概率,而不是判定它完全屬於一個類,所以有時也會被稱為軟聚類。從貝葉斯我們可以看出,給出一個概率來估計比直接得出一個結果要好得多。那麼如何估計出概率值呢?沒錯,就是利用高斯分佈函式。首先看一下高斯分佈的概率密度公式:

p(x)=1(2π)n2(||)12e12(xμ)T()1(xμ)
可以看出高斯分佈由均值向量μ和協方差矩陣這兩個引數確定,故將概率密度函式記為:p(x|μ,)
可定義高斯混合分佈為:
p(x)=k=1Kαi.p(x|μi,i)
給定一組資料,假設該資料由多個高斯分佈產生,現在我們要估計這些高斯分佈的引數,以及每個樣本屬於每個高斯分佈的概率,那麼根據樣本推測出元GMM的概率分佈就可以了。具體求解藉助EM演算法可得。

高斯混合模型不需要先驗知識,可以實現模型結構和引數的自動學習,而且因為該分佈由k個混合部分組成,所以它本身可以任意複雜,通過增加model的數量(即聚類的k值),可以任意的逼近任何連續的概率分佈。但同樣的,它對初始化方法很敏感。

GMM應用:
GaussianMixture引數說明:
GaussianMixture(covariance_type=’full’, init_params=’kmeans’, max_iter=100,means_init=None, n_components=2, n_init=1, precisions_init=None,random_state=None, reg_covar=1e-06, tol=0.001, verbose=0,verbose_interval=10, warm_start=False, weights_init=None)

用sklearn做GMM異常檢測:

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

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.7], [3.5, .7]]) stretched_gaussian = np.dot(np.random.randn(n_samples, 2), C) X_train = np.vstack([shifted_gaussian, stretched_gaussian]) clf = mixture.GaussianMixture(n_components=2, covariance_type='full') clf.fit(X_train) #根據概率畫出等高線 x = np.linspace(-20., 30.) y = np.linspace(-20., 40.) 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], .8) plt.title('Negative log-likelihood predicted by a GMM') plt.axis('tight') plt.show()

這裡寫圖片描述