使用高斯混合模型創建更精確的聚類

介紹

我很喜歡研究無監督學習問題。它們爲監督學習問題提供了一個徹底不一樣的挑戰,用我擁有的數據進行實驗的發揮空間要比監督學習大得多。毫無疑問,機器學習領域的大多數發展和突破都發生在無監督學習領域。python

無監督學習中最流行的技術之一就是聚類。這是一個咱們一般在機器學習的早期學習的概念,它很容易理解。我相信你曾經遇到過,甚至參與過顧客細分、購物籃分析等項目。算法

但問題是聚類有不少方面。它並不侷限於咱們以前學過的基本算法。它是一種強大的無監督學習技術,咱們能夠在現實世界中準確地使用它。機器學習

> 高斯混合模型就是我想在本文中討論的一種聚類算法。函數

想預測一下你最喜歡的產品的銷售狀況嗎?或許你想經過不一樣客戶羣體的視角來理解客戶流失。不管用什麼方法,你都會發現高斯混合模型很是有用。學習

在本文中,咱們將採用自下而上的方法。所以,咱們首先來看一下聚類的基礎知識,包括快速回顧一下k-means算法。而後,咱們將深刻討論高斯混合模型的概念,並在Python中實現它們。3d

目錄

  1. 聚類簡介
  2. k-means聚類簡介
  3. k-means聚類的缺點
  4. 介紹高斯混合模型
  5. 高斯分佈
  6. 指望最大化EM算法
  7. 高斯混合模型的指望最大化
  8. 在Python中實現用於聚類的高斯混合模型

聚類簡介

在咱們開始討論高斯混合模型的實質內容以前,讓咱們快速更新一些基本概念。code

注意:若是你已經熟悉了聚類背後的思想以及k-means聚類算法的工做原理,那麼你能夠直接跳到第4部分「高斯混合模型介紹」。component

那麼,讓咱們從正式定義核心思想開始:blog

> 聚類是指根據類似數據點的屬性或特徵將它們分組在一塊兒。教程

例如,若是咱們有一組人的收入和支出,咱們能夠把他們分紅如下幾組:

  • 賺得多,花得多
  • 賺得多,花得少
  • 賺得少,花得少
  • 賺得少,花得多

這些組中的每個都擁有一個類似的特徵,在某些狀況下特別有用。例如信用卡、汽車/房產貸款等等。用簡單的話說:

> 聚類背後的思想是將數據點分組在一塊兒,這樣每一個單獨的簇擁有最類似的點。 > 有各類各樣的聚類算法。最流行的聚類算法之一是k-means。讓咱們瞭解一下k-means算法是如何工做的,以及在哪些狀況下該算法可能達不到預期效果。

k-means聚類簡介

k-means聚類是一種基於距離的算法。這意味着它試圖將最近的點分組造成一個聚類。

讓咱們仔細看看這個算法是如何工做的。這將創建基礎知識,以幫助你瞭解高斯混合模型將在本文後面的地方發揮做用。

所以,咱們首先定義咱們想要將種羣劃分紅的組的數量——這是k的值。基於咱們想要的聚類或組的數量,而後咱們隨機初始化k箇中心體。

而後將這些數據點分配給到離它最近的簇。而後更新中心,從新分配數據點。這個過程不斷重複,直到簇的中心的位置再也不改變。

注意:這是k-means聚類的簡要概述,對於本文來講已經足夠了。

k-means聚類的缺點

k-means聚類概念聽起來很不錯,不是嗎?它易於理解,相對容易實現,而且能夠應用於至關多的用例中。但也有一些咱們須要注意的缺陷和限制。

讓咱們以上面看到的收入-支出的例子爲例。k-means算法彷佛運行得很好,對吧?等等——若是你仔細觀察,你會發現全部的聚類都是圓形的。這是由於聚類的中心體是使用平均值迭代更新的。

如今,考慮下面這個點的分佈不是圓形的例子。若是咱們對這些數據使用k-means聚類,你認爲會發生什麼?它仍然試圖以循環方式對數據點進行分組。這不是很好。

所以,咱們須要一種不一樣的方法來爲數據點分配聚類。所以,咱們將再也不使用基於距離的模型,而是使用基於分佈的模型。高斯混合模型介紹基於分佈的模型!

高斯混合模型簡介

> 高斯混合模型(GMMs)假設存在必定數量的高斯分佈,每一個分佈表明一個簇。所以,高斯混合模型傾向於將屬於單一分佈的數據點聚在一塊兒。

假設咱們有三個高斯分佈(下一節會詳細介紹)——GD一、GD2和GD3。均值爲(μ一、μ二、μ3)和方差分別(σ一、σ二、σ3)值。對於給定的一組數據點,咱們的GMM將識別屬於這些分佈的每一個數據點的機率。

等一下,機率?

你沒看錯!混合高斯模型是機率模型,採用軟聚類方法將點分佈在不一樣的聚類中。我再舉一個例子,這樣更容易理解。

這裏,咱們有三個用三種顏色表示的聚類——藍色、綠色和青色。讓咱們以紅色突出顯示的數據點爲例。這個點是藍的一部分的機率是1,而它是綠色或青色的一部分的機率是0。

如今,考慮另外一個點,在藍色和青色之間的某個地方(在下面的圖中突出顯示)。這個點是綠色的機率是0。這個點屬於藍色和青色的機率分別是0.2和0.8。

高斯混合模型使用軟聚類技術將數據點分配給高斯分佈。

高斯分佈

我相信大家對高斯分佈(或正態分佈)很熟悉。它有一個鐘形曲線,數據點對稱分佈在平均值周圍。 如下圖片有幾個高斯分佈的不一樣均值(μ)和不一樣方差(σ2)的正態分佈圖像。記住,σ值越低圖像越尖:

在一維空間中,高斯分佈的機率密度函數爲:

其中μ是均值和σ2是方差。

但這隻對一維狀況下成立。在二維的狀況下,咱們再也不使用2D鐘形曲線,而是使用3D鐘形曲線,以下圖所示:

機率密度函數爲:

其中x是輸入向量,μ是2維的均值向量,Σ是2×2的協方差矩陣。協方差定義了曲線的形狀。咱們能夠推廣d維的狀況。

> 所以,這個多元高斯模型x和μ向量長度都是d,Σ是dxd的協方差矩陣。

所以,對於一個具備d個特徵的數據集,咱們將有k個高斯分佈的混合(其中k等於簇的數量),每一個都有一個特定的均值向量和協方差矩陣。可是等一下,如何分配每一個高斯分佈的均值和方差值?

這些值是使用一種稱爲指望最大化(EM)的技術肯定的。在深刻研究高斯混合模型以前,咱們須要瞭解這種技術。

指望最大化EM算法

> 指望最大化(EM)是一種尋找正確模型參數的統計算法。咱們一般在數據缺乏值時使用EM,或者換句話說,在數據不完整時會使用EM算法。

這些缺失的變量被稱爲隱變量。在處理無監督學習問題時,咱們認爲目標(或簇數量)是未知的。

因爲缺乏這些變量,很難肯定正確的模型參數。能夠這樣想——若是你知道哪一個數據點屬於哪一個簇,那麼就能夠輕鬆地肯定均值向量和協方差矩陣。

因爲咱們沒有隱變量的值,指望最大化嘗試使用現有的數據來肯定這些變量的最佳值,而後找到模型參數。根據這些模型參數,咱們返回並更新隱變量的值,等等。

廣義上,指望最大化算法有兩個步驟:

  • E步:在此步驟中,可用數據用於估計(猜想)缺失變量的值
  • M步:根據E步生成的估計值,使用完整的數據更新參數

指望最大化是許多算法的基礎,包括高斯混合模型。那麼,GMM如何使用EM的概念呢?咱們如何將其應用於給定的點集呢?讓咱們來看看!

高斯混合模型的指望最大化

讓咱們用另外一個例子來理解它。我想讓你在閱讀的過程當中把這個思路具體化。這將幫助你更好地理解咱們在談論什麼。

假設咱們須要分配k個簇。高斯分佈,這意味着有k個均值μ1,μ2,. .μk和協方差矩陣Σ1,Σ2,. .Σk。此外,還有一個用於分佈的參數,用於定義各個分佈的權重,權重表明每一個簇的點的數量,用Πi表示。

如今,咱們須要找到這些參數的值來定義高斯分佈。咱們已經肯定了簇的數量,並隨機分配平均值、協方差和權重。接下來,咱們將執行E步和M步!

E步:

對於每一個點xi,計算它屬於分佈c1, c2,…ck的機率。這是使用如下公式:

當將該點分配給正確的簇時,此值將比較高,不然將比較低。

M步:

E步後,咱們回去更新Π,μ和Σ值。這些資料的更新方式以下:

  1. 新的權重定義爲簇內數據的數量與數據總數量之比:

  1. 均值和協方差矩陣根據分配給分佈的值更新,與數據點的機率值成比例。所以,一個更有可能成爲該分佈一部分的數據點將有更大貢獻:

基於此步驟生成的更新值,咱們計算每一個數據點的新機率,並迭代更新這些值。重複這個過程是爲了使對數似然函數最大化。實際上咱們能夠說

> k-means只考慮更新簇中心的均值,而GMM則考慮數據的均值和方差。

在Python中實現高斯混合模型

是時候深刻研究代碼了!這是任何文章中我最喜歡的部分之一,因此讓咱們開始吧。

咱們將從加載數據開始。這是我建立的一個臨時文件-你能夠從這個連接下載數據:https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2019/10/Clustering_gmm.csv。

import pandas as pd
data = pd.read_csv('Clustering_gmm.csv')

plt.figure(figsize=(7,7))
plt.scatter(data["Weight"],data["Height"])
plt.xlabel('Weight')
plt.ylabel('Height')
plt.title('Data Distribution')
plt.show()

這就是咱們的數據。咱們先在這個數據上創建一個k-means模型:

#訓練k-means模型
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4)
kmeans.fit(data)

#kmeans預測
pred = kmeans.predict(data)
frame = pd.DataFrame(data)
frame['cluster'] = pred
frame.columns = ['Weight', 'Height', 'cluster']

#輸出結果
color=['blue','green','cyan', 'black']
for k in range(0,4):
    data = frame[frame["cluster"]==k]
    plt.scatter(data["Weight"],data["Height"],c=color[k])
plt.show()

結果不大準確。k-means模型未能識別正確的簇。咱們仔細觀察位於中心的簇,儘管數據分佈是橢圓形的,但k-means已經嘗試構建一個圓形簇(還記得咱們前面討論的缺點嗎?)

如今讓咱們在相同的數據上創建一個高斯混合模型,看看咱們是否能夠改進k-means:

import pandas as pd
data = pd.read_csv('Clustering_gmm.csv')

# 訓練高斯混合模型
from sklearn.mixture import GaussianMixture
gmm = GaussianMixture(n_components=4)
gmm.fit(data)

#GMM預測
labels = gmm.predict(data)
frame = pd.DataFrame(data)
frame['cluster'] = labels
frame.columns = ['Weight', 'Height', 'cluster']

color=['blue','green','cyan', 'black']
for k in range(0,4):
    data = frame[frame["cluster"]==k]
    plt.scatter(data["Weight"],data["Height"],c=color[k])
plt.show()

這正是咱們所但願的結果。在這個數據集中高斯混合模型把k-means模型戰勝了

結尾

這是高斯混合模型的入門教程。我在這裏的目的是向你介紹這種強大的聚類技術,並展現它與傳統算法相比是多麼有效和高效。

我鼓勵你着手一個聚類項目,並在那裏嘗試GMMs。這是學習和強化一個概念的最好方法,相信我,你會充分認識到這個算法有多麼有用。

相關文章
相關標籤/搜索