我很喜歡研究無監督學習問題。它們爲監督學習問題提供了一個徹底不一樣的挑戰,用我擁有的數據進行實驗的發揮空間要比監督學習大得多。毫無疑問,機器學習領域的大多數發展和突破都發生在無監督學習領域。python
無監督學習中最流行的技術之一就是聚類。這是一個咱們一般在機器學習的早期學習的概念,它很容易理解。我相信你曾經遇到過,甚至參與過顧客細分、購物籃分析等項目。算法
但問題是聚類有不少方面。它並不侷限於咱們以前學過的基本算法。它是一種強大的無監督學習技術,咱們能夠在現實世界中準確地使用它。機器學習
> 高斯混合模型就是我想在本文中討論的一種聚類算法。函數
想預測一下你最喜歡的產品的銷售狀況嗎?或許你想經過不一樣客戶羣體的視角來理解客戶流失。不管用什麼方法,你都會發現高斯混合模型很是有用。學習
在本文中,咱們將採用自下而上的方法。所以,咱們首先來看一下聚類的基礎知識,包括快速回顧一下k-means算法。而後,咱們將深刻討論高斯混合模型的概念,並在Python中實現它們。3d
在咱們開始討論高斯混合模型的實質內容以前,讓咱們快速更新一些基本概念。code
注意:若是你已經熟悉了聚類背後的思想以及k-means聚類算法的工做原理,那麼你能夠直接跳到第4部分「高斯混合模型介紹」。component
那麼,讓咱們從正式定義核心思想開始:blog
> 聚類是指根據類似數據點的屬性或特徵將它們分組在一塊兒。教程
例如,若是咱們有一組人的收入和支出,咱們能夠把他們分紅如下幾組:
這些組中的每個都擁有一個類似的特徵,在某些狀況下特別有用。例如信用卡、汽車/房產貸款等等。用簡單的話說:
> 聚類背後的思想是將數據點分組在一塊兒,這樣每一個單獨的簇擁有最類似的點。 > 有各類各樣的聚類算法。最流行的聚類算法之一是k-means。讓咱們瞭解一下k-means算法是如何工做的,以及在哪些狀況下該算法可能達不到預期效果。
k-means聚類是一種基於距離的算法。這意味着它試圖將最近的點分組造成一個聚類。
讓咱們仔細看看這個算法是如何工做的。這將創建基礎知識,以幫助你瞭解高斯混合模型將在本文後面的地方發揮做用。
所以,咱們首先定義咱們想要將種羣劃分紅的組的數量——這是k的值。基於咱們想要的聚類或組的數量,而後咱們隨機初始化k箇中心體。
而後將這些數據點分配給到離它最近的簇。而後更新中心,從新分配數據點。這個過程不斷重複,直到簇的中心的位置再也不改變。
注意:這是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算法。
這些缺失的變量被稱爲隱變量。在處理無監督學習問題時,咱們認爲目標(或簇數量)是未知的。
因爲缺乏這些變量,很難肯定正確的模型參數。能夠這樣想——若是你知道哪一個數據點屬於哪一個簇,那麼就能夠輕鬆地肯定均值向量和協方差矩陣。
因爲咱們沒有隱變量的值,指望最大化嘗試使用現有的數據來肯定這些變量的最佳值,而後找到模型參數。根據這些模型參數,咱們返回並更新隱變量的值,等等。
廣義上,指望最大化算法有兩個步驟:
指望最大化是許多算法的基礎,包括高斯混合模型。那麼,GMM如何使用EM的概念呢?咱們如何將其應用於給定的點集呢?讓咱們來看看!
讓咱們用另外一個例子來理解它。我想讓你在閱讀的過程當中把這個思路具體化。這將幫助你更好地理解咱們在談論什麼。
假設咱們須要分配k個簇。高斯分佈,這意味着有k個均值μ1,μ2,. .μk和協方差矩陣Σ1,Σ2,. .Σk。此外,還有一個用於分佈的參數,用於定義各個分佈的權重,權重表明每一個簇的點的數量,用Πi表示。
如今,咱們須要找到這些參數的值來定義高斯分佈。咱們已經肯定了簇的數量,並隨機分配平均值、協方差和權重。接下來,咱們將執行E步和M步!
E步:
對於每一個點xi,計算它屬於分佈c1, c2,…ck的機率。這是使用如下公式:
當將該點分配給正確的簇時,此值將比較高,不然將比較低。
M步:
E步後,咱們回去更新Π,μ和Σ值。這些資料的更新方式以下:
基於此步驟生成的更新值,咱們計算每一個數據點的新機率,並迭代更新這些值。重複這個過程是爲了使對數似然函數最大化。實際上咱們能夠說
> k-means只考慮更新簇中心的均值,而GMM則考慮數據的均值和方差。
是時候深刻研究代碼了!這是任何文章中我最喜歡的部分之一,因此讓咱們開始吧。
咱們將從加載數據開始。這是我建立的一個臨時文件-你能夠從這個連接下載數據: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。這是學習和強化一個概念的最好方法,相信我,你會充分認識到這個算法有多麼有用。