Mixture of Gaussian(高斯混合原型聚類)
阿新 • • 發佈:2019-01-02
高斯混合聚類原理:
高斯混合模型(Gaussian Mixture Model ,GMM)也是原型聚類,和上一篇總結的K-means和LVQ一樣,不過與它們不同的是,GMM沒有想用原型向量來刻畫聚類結構的不同。因為比如用k-means演算法解決聚類問題非常簡單,將資料聚為一個一個的點,但這樣往往比較粗糙,不適用於很多資料集。所以是採用概率模型來表達原型,即通過統計得到每個樣本點屬於各個類的概率,而不是判定它完全屬於一個類,所以有時也會被稱為軟聚類。從貝葉斯我們可以看出,給出一個概率來估計比直接得出一個結果要好得多。那麼如何估計出概率值呢?沒錯,就是利用高斯分佈函式。首先看一下高斯分佈的概率密度公式:
可以看出高斯分佈由均值向量
可定義高斯混合分佈為:
給定一組資料,假設該資料由多個高斯分佈產生,現在我們要估計這些高斯分佈的引數,以及每個樣本屬於每個高斯分佈的概率,那麼根據樣本推測出元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()