# 2.1. 高斯混合模型
校驗者:
[@why2lyj](https://github.com/why2lyj)
[@Shao Y.](https://github.com/apachecn/scikit-learn-doc-zh)
翻譯者:
[@glassy](https://github.com/apachecn/scikit-learn-doc-zh)
`sklearn.mixture` 是一個應用高斯混合模型進行非監督學習的包,支持 diagonal,spherical,tied,full 四種協方差矩陣 (注:diagonal 指每個分量有各自不同對角協方差矩陣, spherical 指每個分量有各自不同的簡單協方差矩陣, tied 指所有分量有相同的標準協方差矩陣, full 指每個分量有各自不同的標準協方差矩陣),它對數據進行抽樣,并且根據數據估計模型。同時包也提供了相關支持,來幫助用戶決定合適的分量數(分量個數)。 *(譯注:在高斯混合模型中,我們將每一個高斯分布稱為一個分量,即 component )*
> [](../auto_examples/mixture/plot_gmm_pdf.html)**二分量高斯混合模型:** *數據點,以及模型的等概率線。*
高斯混合模型是一個假設所有的數據點都是生成于一個混合的有限數量的并且未知參數的高斯分布的概率模型。 我們可以將混合模型看作是 k-means 聚類算法的推廣,它利用了關于數據的協方差結構以及潛在高斯中心的信息。
對應不同的估算策略,Scikit-learn 實現了不同的類來估算高斯混合模型。 詳細描述如下:
## 2.1.1. 高斯混合
> [`GaussianMixture`](generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture "sklearn.mixture.GaussianMixture") 對象實現了用來擬合高斯混合模型的 [期望最大化](#expectation-maximization) (EM) 算法。它還可以為多變量模型繪制置信區間,同時計算 BIC(Bayesian Information Criterion,貝葉斯信息準則)來評估數據中聚類的數量。 [`GaussianMixture.fit`](generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture.fit "sklearn.mixture.GaussianMixture.fit") 提供了從訓練數據中學習高斯混合模型的方法。
給定測試數據,通過使用 [`GaussianMixture.predict`](generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture.predict "sklearn.mixture.GaussianMixture.predict") 方法,可以為每個樣本分配最有可能對應的高斯分布。
[`GaussianMixture`](generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture "sklearn.mixture.GaussianMixture") 方法中自帶了不同的選項來約束不同估類的協方差:spherical,diagonal,tied 或 full 協方差。
[](../auto_examples/mixture/plot_gmm_covariances.html)
示例:
- 一個利用高斯混合模型在鳶尾花卉數據集(IRIS 數據集)上做聚類的協方差實例,請查閱 [GMM covariances](../auto_examples/mixture/plot_gmm_covariances.html#sphx-glr-auto-examples-mixture-plot-gmm-covariances-py)
- 一個繪制密度估計的例子,請查閱 [Density Estimation for a Gaussian mixture](../auto_examples/mixture/plot_gmm_pdf.html#sphx-glr-auto-examples-mixture-plot-gmm-pdf-py)
### 2.1.1.1. 優缺點 [`GaussianMixture`](generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture "sklearn.mixture.GaussianMixture")
#### 2.1.1.1.1. 優點
速度:是混合模型學習算法中最快的算法。無偏差性:這個算法僅僅只是最大化可能性,并不會使均值偏向于0,或是使聚類大小偏向于可能適用或者可能不適用的特殊結構。
#### 2.1.1.1.2. 缺點
奇異性:當每個混合模型沒有足夠多的點時,估算協方差變得困難起來,同時算法會發散并且找具有無窮大似然函數值的解,除非人為地對協方差進行正則化。分量的數量:這個算法將會總是用所有它能用的分量,所以在沒有外部線索的情況下需要留存數據或者用信息理論標準來決定用多少分量。
### 2.1.1.2. 選擇經典高斯混合模型中分量的個數
一種高效的方法是利用 BIC(貝葉斯信息準則)來選擇高斯混合的分量數。 理論上,它僅當在近似狀態下可以恢復正確的分量數(即如果有大量數據可用,并且假設這些數據實際上是一個混合高斯模型獨立同分布生成的)。注意:使用 [變分貝葉斯高斯混合](#bgmm) 可以避免高斯混合模型中分量數的選擇。
[](../auto_examples/mixture/plot_gmm_selection.html)
示例:
- 一個用典型的高斯混合進行的模型選擇的例子,請查閱 [Gaussian Mixture Model Selection](../auto_examples/mixture/plot_gmm_selection.html#sphx-glr-auto-examples-mixture-plot-gmm-selection-py)
### 2.1.1.3. 估計算法期望最大化(EM)
在從無標記的數據中應用高斯混合模型主要的困難在于:通常不知道哪個點來自哪個潛在的分量 (如果可以獲取到這些信息,就可以很容易通過相應的數據點,擬合每個獨立的高斯分布)。 [期望最大化(Expectation-maximization,EM)](https://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm) 是一個理論完善的統計算法,其通過迭代方式來解決這個問題。首先,假設一個隨機分量 (隨機地選擇一個中心點,可以用 k-means 算法得到,或者甚至就直接地隨便在原點周圍選取),并且為每個點計算由模型的每個分量生成的概率。然后,調整模型參數以最大化模型生成這些參數的可能性。重復這個過程,該算法保證過程中的參數總會收斂到局部最優解。
## 2.1.2. 變分貝葉斯高斯混合
> [`BayesianGaussianMixture`](generated/sklearn.mixture.BayesianGaussianMixture.html#sklearn.mixture.BayesianGaussianMixture "sklearn.mixture.BayesianGaussianMixture") 對象實現了具有變分的高斯混合模型的變體推理算法。 這個API和 [`GaussianMixture`](generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture "sklearn.mixture.GaussianMixture") 相似。
### 2.1.2.1. 估計算法: 變分推斷(variational inference)
變分推斷是期望最大化(EM)的擴展,它最大化模型證據(包括先驗)的下界,而不是數據似然函數。 變分方法的原理與期望最大化相同(二者都是迭代算法,在尋找由混合產生的每個點的概率和根據所分配的點擬合之間兩步交替),但是變分方法通過整合先驗分布信息來增加正則化限制。 這避免了期望最大化解決方案中常出現的奇異性,但是也對模型帶來了微小的偏差。 變分方法計算過程通常明顯較慢,但通常不會慢到無法使用。
由于它的貝葉斯特性,變分算法比預期最大化(EM)需要更多的超參數(即先驗分布中的參數),其中最重要的就是 濃度參數 `weight_concentration_prior` 。指定一個低濃度先驗,將會使模型將大部分的權重放在少數分量上, 其余分量的權重則趨近 0。而高濃度先驗將使混合模型中的大部分分量都有一定的權重。 [`BayesianGaussianMixture`](generated/sklearn.mixture.BayesianGaussianMixture.html#sklearn.mixture.BayesianGaussianMixture "sklearn.mixture.BayesianGaussianMixture") 類的參數實現提出了兩種權重分布先驗: 一種是利用 Dirichlet distribution(狄利克雷分布)的有限混合模型,另一種是利用 Dirichlet Process(狄利克雷過程)的無限混合模型。 在實際應用上,狄利克雷過程推理算法是近似的,并且使用具有固定最大分量數的截尾分布(稱之為 Stick-breaking representation)。使用的分量數實際上幾乎總是取決于數據。
下圖比較了不同類型的權重濃度先驗(參數 `weight_concentration_prior_type` ) 不同的 `weight_concentration_prior` 的值獲得的結果。 在這里,我們可以發現 `weight_concentration_prior` 參數的值對獲得的有效的激活分量數(即權重較大的分量的數量)有很大影響。 我們也能注意到當先驗是 ‘dirichlet\_distribution’ 類型時,大的濃度權重先驗會導致更均勻的權重,然而 ‘dirichlet\_process’ 類型(默認類型)卻不是這樣。
**[](../auto_examples/mixture/plot_concentration_prior.html) [](../auto_examples/mixture/plot_concentration_prior.html)**
下面的例子將具有固定數量分量的高斯混合模型與 Dirichlet process prior(狄利克雷過程先驗)的變分高斯混合模型進行比較。 這里,典型高斯混合模型被指定由 2 個聚類組成的有 5 個分量的數據集。 我們可以看到,具有狄利克雷過程的變分高斯混合可以將自身限制在 2 個分量,而高斯混合必須按照用戶先驗設置的固定數量的分量來擬合數據。 在例子中,用戶選擇了 `n_components=5` ,這與真正的試用數據集(toy dataset)的生成分量不符。 稍微觀察就能注意到,狄利克雷過程先驗的變分高斯混合模型可以采取保守的立場,并且只適合一個分量。
[](../auto_examples/mixture/plot_gmm.html)
在下圖中,我們將擬合一個并不能被高斯混合模型很好描述的數據集。 調整 [`BayesianGaussianMixture`](generated/sklearn.mixture.BayesianGaussianMixture.html#sklearn.mixture.BayesianGaussianMixture "sklearn.mixture.BayesianGaussianMixture") 類的參數 `weight_concentration_prior` ,這個參數決定了用來擬合數據的分量數。我們在最后兩個圖上展示了從兩個混合結果產生的隨機抽樣。
[](../auto_examples/mixture/plot_gmm_sin.html)
示例:
> - 一個用 [`GaussianMixture`](generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture "sklearn.mixture.GaussianMixture") 和 [`BayesianGaussianMixture`](generated/sklearn.mixture.BayesianGaussianMixture.html#sklearn.mixture.BayesianGaussianMixture "sklearn.mixture.BayesianGaussianMixture") 繪制置信橢圓體的例子, 請查閱 [Gaussian Mixture Model Ellipsoids](../auto_examples/mixture/plot_gmm.html#sphx-glr-auto-examples-mixture-plot-gmm-py)
> - [Gaussian Mixture Model Sine Curve](../auto_examples/mixture/plot_gmm_sin.html#sphx-glr-auto-examples-mixture-plot-gmm-sin-py) 這個例子展示了用 [`GaussianMixture`](generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture "sklearn.mixture.GaussianMixture") 和 [`BayesianGaussianMixture`](generated/sklearn.mixture.BayesianGaussianMixture.html#sklearn.mixture.BayesianGaussianMixture "sklearn.mixture.BayesianGaussianMixture") 來擬合正弦波。
> - 一個使用不同的 `weight_concentration_prior_type` 用以不同的 `weight_concentration_prior` 參數值的:class:BayesianGaussianMixture 來繪制置信橢圓體的例子。 請查閱 [Concentration Prior Type Analysis of Variation Bayesian Gaussian Mixture](../auto_examples/mixture/plot_concentration_prior.html#sphx-glr-auto-examples-mixture-plot-concentration-prior-py)
[`BayesianGaussianMixture`](generated/sklearn.mixture.BayesianGaussianMixture.html#sklearn.mixture.BayesianGaussianMixture "sklearn.mixture.BayesianGaussianMixture") 下的變分推理的優缺點
- - - - - -
#### 2.1.2.1.1. 優點
自動選擇:當 `weight_concentration_prior` 足夠小以及 `n_components` 比模型需要的更大時,變分貝葉斯混合模型計算的結果可以讓一些混合權重值趨近 0。 這讓模型可以自動選擇合適的有效分量數。這僅僅需要提供分量的數量上限。但是請注意,“理想” 的激活分量數只在應用場景中比較明確,在數據挖掘參數設置中通常并不明確。對參數數量的敏感度較低:與總是用盡可以用的分量,因而將為不同數量的組件產生不同的解決方案有限模型不同,變分推理狄利克雷過程先驗變分推理( `weight_concentration_prior_type='dirichlet_process'` )改變參數后結果并不會改變太多,使之更穩定和更少的調優。正則化:由于結合了先驗信息,變分的解比期望最大化(EM)的解有更少的病理特征(pathological special cases)。
#### 2.1.2.1.2. 缺點
速度:變分推理所需要的額外參數化使推理速度變慢,盡管并沒有慢很多。超參數:這個算法需要一個額外的可能需要通過交叉驗證進行實驗調優的超參數。偏差:在推理算法存在許多隱含的偏差(如果用到狄利克雷過程也會有偏差), 每當這些偏差和數據之間不匹配時,用有限模型可能可以擬合更好的模型。
### 2.1.2.2. The Dirichlet Process(狄利克雷過程)
這里我們描述了狄利克雷過程混合的變分推理算法。狄利克雷過程是在 *具有無限大,無限制的分區數的聚類* 上的先驗概率分布。相比于有限高斯混合模型,變分技術讓我們在推理時間幾乎沒有懲罰(penalty)的情況下納入了高斯混合模型的先驗結構。
一個重要的問題是狄利克雷過程是如何實現用無限的,無限制的聚類數,并且結果仍然是一致的。 本文檔不做出完整的解釋,但是你可以看這里 [stick breaking process](https://en.wikipedia.org/wiki/Dirichlet_process#The_stick-breaking_process) 來幫助你理解它。折棍(stick breaking)過程是狄利克雷過程的衍生。我們每次從一個單位長度的 stick 開始,且每一步都折斷剩下的一部分。每次,我們把每個 stick 的長度聯想成落入一組混合的點的比例。 最后,為了表示無限混合,我們聯想成最后每個 stick 的剩下的部分到沒有落入其他組的點的比例。 每段的長度是隨機變量,概率與濃度參數成比例。較小的濃度值將單位長度分成較大的 stick 段(即定義更集中的分布)。較高的濃度值將生成更小的 stick 段(即增加非零權重的分量數)。
狄利克雷過程的變分推理技術,在對該無限混合模型進行有限近似情形下,仍然可以運用。 用戶不必事先指定想要的分量數,只需要指定濃度參數和混合分量數的上界(假定上界高于“真實”的分量數,僅僅影響算法復雜度,而不是實際上使用的分量數)。
- scikit-learn 0.19 中文文檔
- 用戶指南
- 1. 監督學習
- 1.1. 廣義線性模型
- 1.2. 線性和二次判別分析
- 1.3. 內核嶺回歸
- 1.4. 支持向量機
- 1.5. 隨機梯度下降
- 1.6. 最近鄰
- 1.7. 高斯過程
- 1.8. 交叉分解
- 1.9. 樸素貝葉斯
- 1.10. 決策樹
- 1.11. 集成方法
- 1.12. 多類和多標簽算法
- 1.13. 特征選擇
- 1.14. 半監督學習
- 1.15. 等式回歸
- 1.16. 概率校準
- 1.17. 神經網絡模型(有監督)
- 2. 無監督學習
- 2.1. 高斯混合模型
- 2.2. 流形學習
- 2.3. 聚類
- 2.4. 雙聚類
- 2.5. 分解成分中的信號(矩陣分解問題)
- 2.6. 協方差估計
- 2.7. 經驗協方差
- 2.8. 收斂協方差
- 2.9. 稀疏逆協方差
- 2.10. Robust 協方差估計
- 2.11. 新奇和異常值檢測
- 2.12. 密度估計
- 2.13. 神經網絡模型(無監督)
- 3. 模型選擇和評估
- 3.1. 交叉驗證:評估估算器的表現
- 3.2. 調整估計器的超參數
- 3.3. 模型評估: 量化預測的質量
- 3.4. 模型持久化
- 3.5. 驗證曲線: 繪制分數以評估模型
- 4. 數據集轉換
- 4.1. Pipeline(管道)和 FeatureUnion(特征聯合): 合并的評估器
- 4.2. 特征提取
- 4.3. 預處理數據
- 4.4. 無監督降維
- 4.5. 隨機投影
- 4.6. 內核近似
- 4.7. 成對的矩陣, 類別和核函數
- 4.8. 預測目標 (y) 的轉換
- 5. 數據集加載工具
- 6. 大規模計算的策略: 更大量的數據
- 7. 計算性能
- 教程
- 使用 scikit-learn 介紹機器學習
- 關于科學數據處理的統計學習教程
- 機器學習: scikit-learn 中的設置以及預估對象
- 監督學習:從高維觀察預測輸出變量
- 模型選擇:選擇估計量及其參數
- 無監督學習: 尋求數據表示
- 把它們放在一起
- 尋求幫助
- 處理文本數據
- 選擇正確的評估器(estimator)
- 外部資源,視頻和談話