高斯混合模型是一種流行的無監督學習算法。GMM方法類似於K-Means聚類算法,但是由於其複雜性,它更健壯,更有用。
K-means聚類使用歐式距離函數來發現數據中的聚類。只要數據相對於質心呈圓形分布,此方法就可以很好地工作。但是,如果數據是非線性的呢?或者數據具有非零的協方差呢?如果聚類具有不同的均值和協方差怎麼辦?
這就要用到高斯混合模型了!
GMM假設生成數據的是一種混合的高斯分布。與將數據點硬分配到聚類的K-means方法(假設圍繞質心的數據呈圓形分布)相比,它使用了將數據點軟分配到聚類的方法(即概率性,因此更好)。
簡而言之,GMM效果更好,因為:(A)通過使用軟分配捕獲屬於不同聚類的數據點的不確定性,(B)對圓形聚類沒有偏見。即使是非線性數據分布,它也能很好地工作。
GMM
GMM的目標函數是最大化數據X、p(X)或對數似然值L的似然值(因為對數是單調遞增函數)。通過假設混合了K個高斯來生成數據,我們可以將p(X)寫為邊緣概率,對所有數據點的K個聚類求和。


利用上面對數函數的求和,我們不能得到解析解。看起來很討厭,但這個問題有一個很好的解決方案:Expectation-Maximization(EM)算法。
數學
EM算法是一種迭代算法,用於在無法直接找到參數的情況下尋找模型的最大似然估計(MLE)。它包括兩個步驟:期望步驟和最大化步驟。
1.期望步驟:計算成員值r_ic。這是數據點x_i屬於聚類c的概率。
2. 最大化步驟:計算一個新參數mc,該參數確定屬於不同聚類的點的分數。 通過計算每個聚類c的MLE來更新參數μ,π,Σ。
重複EM步驟,直到對數似然值L收斂。
Python編碼
讓我們從頭開始用python編寫GMM的基本實現。
生成一維數據。
初始化GMM的參數:μ,π,Σ。
運行EM算法的第一次迭代
將此代碼放在for循環中,並將其放在類對象中。
我們已經建立並運行了一個一維數據模型。同樣的原理也適用於更高維度(≥2D)。唯一的區別是我們將使用多元高斯分布。讓我們為2D模型編寫Python代碼。
讓我們生成一些數據並編寫我們的模型
讓我們對此模型進行一些預測
y = np.random.randint(-10, 20, size=(12, 2))gmm2d = GMM2D(num_clusters=3, max_iterations=10)gmm2d.run(X)gmm2d.predict(y)
如果使用sklearn,可以在幾行代碼中完成相同的任務。
GMM將樣本分類為第二類。
結論
實現高斯混合模型並不難。一旦你清楚了數學,它將為模型找到最大似然估計(無論是一維數據還是高維數據)。該方法具有較強的魯棒性,在執行聚類任務時非常有用。現在您已經熟悉了GMM的python實現,可以使用數據集執行一些很酷的操作。