關於gmm聚類python實現的信息

  • 1、高斯混合模型(GMM)及EM演算法的初步理解
  • 2、[譯] 高斯混合模型 — python教程
  • 3、如何用高斯混合模型 GMM 做聚類

高斯混合模型(Gaussian Mixed Model)指的是多個高斯分布函數的線性組合,理論上GMM可以擬合出任意類型的分布,通常用於解決同一集合下的數據包含多個不同的分布的情況(或者是同一類分布但參數不一樣,或者是不同類型的分布,比如正態分布和伯努利分布)。

如圖1,圖中的點在我們看來明顯分成兩個聚類。這兩個聚類中的點分別通過兩個不同的正態分布隨機生成而來。但是如果沒有GMM,那麼只能用一個的二維高斯分布來描述圖1中的數據。圖1中的橢圓即為二倍標準差的正態分布橢圓。這顯然不太合理,畢竟肉眼一看就覺得應該把它們分成兩類。

這時候就可以使用GMM了!如圖2,數據在平面上的空間分布和圖1一樣,這時使用兩個二維高斯分布來描述圖2中的數據,分別記為N(μ1,Σ1)和N(μ2,Σ2) 。圖中的兩個橢圓分別是這兩個高斯分布的二倍標準差橢圓。可以看到使用兩個二維高斯分布來描述圖中的數據顯然更合理。實際上圖中的兩個聚類的中的點是通過兩個不同的正態分布隨機生成而來。如果將兩個二維高斯分布N(μ1,Σ1)和N(μ2,Σ2) 合成一個二維的分布,那麼就可以用合成後的分布來描述圖2中的所有點。最直觀的方法就是對這兩個二維高斯分布做線性組合,用線性組合後的分布來描述整個集合中的數據。這就是高斯混合模型(GMM)。

高斯混合模型(GMM)的數學表示:

期望極大(Expectation Maximization)演算法,也稱EM演算法,是一種迭代演算法,由Dempster et. al 在1977年提出,用於含有隱變數的概率參數模型的極大似然估計。

EM演算法作為一種數據添加演算法,在近幾十年得到迅速的發展,主要源於當前科學研究以及各方面實際應用中數據量越來越大的情況下,經常存在數據缺失或者不可用的的問題,這時候直接處理數據比較困難,而數據添加辦法有很多種,常用的有神經網路擬合、添補法、卡爾曼濾波法等,但是EM演算法之所以能迅速普及主要源於它演算法簡單,穩定上升的步驟能相對可靠地找到「最優的收斂值」。

(個人的理解就是用含有隱變數的含參表達式不斷擬合,最終能收斂並擬合出不含隱變數的含參表達式)

模型的EM訓練過程,直觀的來講是這樣:我們通過觀察採樣的概率值和模型概率值的接近程度,來判斷一個模型是否擬合良好。然後我們通過調整模型以讓新模型更適配採樣的概率值。反覆迭代這個過程很多次,直到兩個概率值非常接近時,我們停止更新並完成模型訓練。現在我們要將這個過程用演算法來實現,所使用的方法是模型生成的數據來決定似然值,即通過模型來計算數據的期望值。通過更新參數μ和σ來讓期望值最大化。這個過程可以不斷迭代直到兩次迭代中生成的參數變化非常小為止。該過程和k-means的演算法訓練過程很相似(k-means不斷更新類中心來讓結果最大化),只不過在這裡的高斯模型中,我們需要同時更新兩個參數:分布的均值和標準差.[3]

GMM常用於聚類。如果要從 GMM 的分布中隨機地取一個點的話,實際上可以分為兩步:首先隨機地在這 K 個 Component 之中選一個,每個 Component 被選中的概率實際上就是它的係數Πk ,選中 Component 之後,再單獨地考慮從這個 Component 的分布中選取一個點就可以了──這裡已經回到了普通的 Gaussian 分布,轉化為已知的問題。

根據數據來推算概率密度通常被稱作 density estimation 。特別地,當我已知(或假定)概率密度函數的形式,而要估計其中的參數的過程被稱作『參數估計』。

(推導和迭代收斂過程這裡省略,可參考資料1)

一個實際的例子:用GMM對iris數據集進行聚類,並通過make_ellipses表示出來

make_ellipses方法概念上很簡單,它將gmm對象(訓練模型)、坐標軸、以及x和y坐標索引作為參數,運行後基於指定的坐標軸繪製出相應的橢圓圖形。

在特定條件下,k-means和GMM方法可以互相用對方的思想來表達。在k-means中根據距離每個點最接近的類中心來標記該點的類別,這裡存在的假設是每個類簇的尺度接近且特徵的分布不存在不均勻性。 這也解釋了為什麼在使用k-means前對數據進行歸一會有效果。高斯混合模型則不會受到這個約束 ,因為它對每個類簇分別考察特徵的協方差模型。

K-means演算法可以被視為高斯混合模型(GMM)的一種特殊形式。 整體上看,高斯混合模型能提供更強的描述能力,因為聚類時數據點的從屬關係不僅與近鄰相關,還會依賴於類簇的形狀。n維高斯分布的形狀由每個類簇的協方差來決定。在協方差矩陣上添加特定的約束條件後,可能會通過GMM和k-means得到相同的結果。

在k-means方法中使用EM來訓練高斯混合模型時對初始值的設置非常敏感。而對比k-means,GMM方法有更多的初始條件要設置。實踐中不僅初始類中心要指定,而且協方差矩陣和混合權重也要設置。可以運行k-means來生成類中心,並以此作為高斯混合模型的初始條件。由此可見並兩個演算法有相似的處理過程,主要區別在於模型的複雜度不同。

高斯混合模型的基本假設是 已知類別的比例 和 類別的個數 ,但是不知道每個樣例的具體標籤,據此用EM的模式為每個樣本進行最優的標註。也就是說它適合的是 無標籤學習的分類問題 ,並且需要已知基本假設。

整體來看,所有無監督機器學習演算法都遵循一條簡單的模式:給定一系列數據,訓練出一個能描述這些數據規律的模型(並期望潛在過程能生成數據)。 訓練過程通常要反覆迭代,直到無法再優化參數獲得更貼合數據的模型為止。

【1】  高斯混合模型(GMM)及其EM演算法的理解

【2】    機器學習中的數學(4)-EM演算法與高斯混合模型(GMM)

【3】    一文詳解高斯混合模型原理

本文翻譯自

上一節中探討的k-means聚類模型簡單易懂,但其簡單性導致其應用中存在實際挑戰。具體而言,k-means的非概率特性及簡單地計算點與類蔟中心的歐式距離來判定歸屬,會導致其在許多真實的場景中性能較差。本節,我們將探討高斯混合模型(GMMs),其可以看成k-means的延伸,更可以看成一個強有力的估計工具,而不僅僅是聚類。

我們將以一個標準的import開始

我們看下k-means的缺陷,思考下如何提高聚類模型。正如上一節所示,給定簡單,易於分類的數據,k-means能找到合適的聚類結果。

舉例而言,假設我們有些簡單的數據點,k-means演算法能以某種方式很快地將它們聚類,跟我們肉眼分辨的結果很接近:

從直觀的角度來看,我可能期望聚類分配時,某些點比其他的更確定:舉例而言,中間兩個聚類之間似乎存在非常輕微的重疊,這樣我們可能對這些數據點的分配沒有完全的信心。不幸的是,k-means模型沒有聚類分配的概率或不確定性的內在度量(儘管可能使用bootstrap 的方式來估計這種不確定性)。為此,我們必須考慮泛化這種模型。

k-means模型的一種理解思路是,它在每個類蔟的中心放置了一個圈(或者,更高維度超球面),其半徑由聚類中最遠的點確定。該半徑充當訓練集中聚類分配的一個硬截斷:任何圈外的數據點不被視為該類的成員。我們可以使用以下函數可視化這個聚類模型:

觀察k-means的一個重要發現,這些聚類模式必須是圓形的。k-means沒有內置的方法來計算橢圓形或橢圓形的簇。因此,舉例而言,假設我們將相同的數據點作變換,這種聚類分配方式最終變得混亂:

高斯混合模型(GMM)試圖找到一個多維高斯概率分布的混合,以模擬任何輸入數據集。在最簡單的情況下,GMM可用於以與k-means相同的方式聚類。

但因為GMM包含概率模型,因此可以找到聚類分配的概率方式 – 在Scikit-Learn中,通過調用predict_proba方法實現。它將返回一個大小為[n_samples, n_clusters]的矩陣,用于衡量每個點屬於給定類別的概率:

我們可以可視化這種不確定性,比如每個點的大小與預測的確定性成比例;如下圖,我們可以看到正是群集之間邊界處的點反映了群集分配的不確定性:

本質上說,高斯混合模型與k-means非常相似:它使用期望-最大化的方式,定性地執行以下操作:

有了這個,我們可以看看四成分的GMM為我們的初始數據提供了什麼:

同樣,我們可以使用GMM方法來擬合我們的拉伸數據集;允許full的協方差,該模型甚至可以適應非常橢圓形,伸展的聚類模式:

這清楚地表明GMM解決了以前遇到的k-means的兩個主要實際問題。

如果看了之前擬合的細節,你將看到covariance_type選項在每個中都設置不同。該超參數控制每個類簇的形狀的自由度;對於任意給定的問題,必須仔細設置。默認值為covariance_type =「diag」,這意味著可以獨立設置沿每個維度的類蔟大小,並將得到的橢圓約束為與軸對齊。一個稍微簡單和快速的模型是covariance_type =「spherical」,它約束了類簇的形狀,使得所有維度都相等。儘管它並不完全等效,其產生的聚類將具有與k均值相似的特徵。更複雜且計算量更大的模型(特別是隨著維數的增長)是使用covariance_type =「full」,這允許將每個簇建模為具有任意方向的橢圓。

對於一個類蔟,下圖我們可以看到這三個選項的可視化表示:

儘管GMM通常被歸類為聚類演算法,但從根本上說它是一種密度估算演算法。也就是說,GMM適合某些數據的結果在技術上不是聚類模型,而是描述數據分布的生成概率模型。

例如,考慮一下Scikit-Learn的make_moons函數生成的一些數據:

如果我們嘗試用視為聚類模型的雙成分的GMM模擬數據,則結果不是特別有用:

但是如果我們使用更多成分的GMM模型,並忽視聚類的類別,我們會發現更接近輸入數據的擬合:

這裡,16個高斯分布的混合不是為了找到分離的數據簇,而是為了對輸入數據的整體分布進行建模。這是分布的一個生成模型,這意味著GMM為我們提供了生成與我們的輸入類似分布的新隨機數據的方法。例如,以下是從這個16分量GMM擬合到我們原始數據的400個新點:

GMM非常方便,可以靈活地建模任意多維數據分布。

GMM是一種生成模型這一事實為我們提供了一種確定給定數據集的最佳組件數的自然方法。生成模型本質上是數據集的概率分布,因此我們可以簡單地評估模型下數據的可能性,使用交叉驗證來避免過度擬合。校正過度擬合的另一種方法是使用一些分析標準來調整模型可能性,例如 Akaike information criterion (AIC) 或 Bayesian information criterion (BIC) 。Scikit-Learn的GMM估計器實際上包含計算這兩者的內置方法,因此在這種方法上操作非常容易。

讓我們看看在moon數據集中,使用AIC和BIC函數確定GMM組件數量:

最佳的聚類數目是使得AIC或BIC最小化的值,具體取決於我們希望使用的近似值。 AIC告訴我們,我們上面選擇的16個組件可能太多了:大約8-12個組件可能是更好的選擇。與此類問題一樣,BIC建議使用更簡單的模型。

注意重點:這個組件數量的選擇衡量GMM作為密度估算器的效果,而不是它作為聚類演算法的效果。我鼓勵您將GMM主要視為密度估算器,並且只有在簡單數據集中保證時才將其用於聚類。

我們剛剛看到了一個使用GMM作為數據生成模型的簡單示例,以便根據輸入數據定義的分布創建新樣本。在這裡,我們將運行這個想法,並從我們以前使用過的標準數字語料庫中生成新的手寫數字。

首先,讓我們使用Scikit-Learn的數據工具載入數字數據:

接下來讓我們繪製前100個,以準確回憶我們正在看的內容:

我們有64個維度的近1,800位數字,我們可以在這些位置上構建GMM以產生更多。 GMM可能難以在如此高維空間中收斂,因此我們將從數據上的可逆維數減少演算法開始。在這裡,我們將使用一個簡單的PCA,要求它保留99%的預測數據方差:

結果是41個維度,減少了近1/3,幾乎沒有信息丟失。根據這些預測數據,讓我們使用AIC來計算我們應該使用的GMM組件的數量:

似乎大約110個components最小化了AIC;我們將使用這個模型。我們迅速將其與數據擬合併確保它已收斂合:

現在我們可以使用GMM作為生成模型在這個41維投影空間內繪製100個新點的樣本:

最後,我們可以使用PCA對象的逆變換來構造新的數字:

大部分結果看起來像數據集中合理的數字!

考慮一下我們在這裡做了什麼:給定一個手寫數字的樣本,我們已經模擬了數據的分布,這樣我們就可以從數據中生成全新的數字樣本:這些是「手寫數字」,不是單獨的出現在原始數據集中,而是捕獲混合模型建模的輸入數據的一般特徵。這種數字生成模型可以證明作為貝葉斯生成分類器的一個組成部分非常有用,我們將在下一節中看到。

當我們在做聚類任務時,

如果每一類的分布已知的話,那麼要求出每個樣本屬於哪一類,

只需要計算出它歸屬於 k 個不同簇的概率,然後選擇概率值最高的那個簇作為它最終的歸屬即可。

但很多時候,樣本分布的參數乃至概率密度函數的形式都是未知的

這時,我們通過設定一個目標,在優化目標的時候求出這些未知的參數。

在聚類這個問題中,我們希望達到的目標是:

第 i 個樣本 x(i) 之所以被歸屬到了第 k 個簇,是因為 它在這一類的概率是所有類中概率最大的。

所以目標為最大化樣本集的集體概率:

這其實是一個似然函數,要優化它,可以用極大化對數似然函數的方法,所以取對數。

這裡面的每個 ϕ 都是一個獨立的概率密度函數形式,而 θ 是對應的參數集合,

這時 K 個分模型的概率分布都不相同——每個概率密度函數的形式不同,對應參數集合不同,參數本身又都是未知的,如果直接求解就會非常困難,

所以,這時我們可以把所有的 ϕ 都當作高斯分布即可。也就是說這些樣本分屬的模型對應的概率密度函數形式相同,參數類型也相同,只是參數的具體取值有所差別:

高斯分布(Gaussian Distribution),又名正態分布(Normal distribtion),它的密度函數如上圖公式所示。

現實生活中的許多自然現象都被發現近似地符合高斯分布,比如人類的壽命、身高、體重等,在金融、科研、工業等各個領域都有大量現實業務產生的數據被證明是符合高斯分布的。

這時就用到了 高斯混合模型(GMM),

就是將若干個概率分布為高斯分布的分模型混合在一起的模型。

之所以可以把所有的 ϕ 都當作高斯分布,

是高斯分布有一個非常重要的性質:中心極限定理

中心極限定理:

在適當的條件下,大量相互獨立的隨機變數的均值經適當標準化後,依分布收斂於高斯分布,

即無論 xi 的自身分布是什麼,隨著 n 變大,這些樣本平均值經過標準化處理—後的分布,都會逐步接近高斯分布。

有了這個定理,當我們遇到一個問題的時候,如果對某一變數做定量分析時其確定的分布情況未知,只要掌握了大量的觀測樣本,都可以按照服從高斯分布來處理這些樣本。

例如我們要做一個聚類任務,無論原本每一簇自身的分布如何,我們都可以用高斯模型來近似表示它們。這個混合模型,就可以是一個高斯混合模型(GMM)

GMM 的學習目標為:

x(i) 是已經觀測到的樣本觀測數據,是已知的,zik 是未知的。

因為有沒被觀測到的隱變數存在,這樣的對數似然函數需要用 EM 演算法來優化。

用 EM 演算法學習 GMM 的參數分為4步:

各參數取初始值開始迭代;

E 步;

M 步;

重複 E 步和 M 步,直到收斂

E 步的任務是求 Q

M 步的任務是求 arg max Q

在 E 步,求出了 zik,代入 Q,得到 Q 只和參數 α,μ,σ 有關,

在 M 步,通過分別對各個自變數求偏導,再令導數為0,來求取 α,μ,σ 的極值點,

然後再帶回到函數中去求整體 arg max Q 的值。

原創文章,作者:NV1TX,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/127155.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
NV1TX的頭像NV1TX
上一篇 2024-10-03 23:13
下一篇 2024-10-03 23:13

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論