混合模型是k個份量分佈的混合,它們共同造成混合分佈:F(x )f(x)post
F(x )= Σk = 1ķαķFķ(x )f(x)=∑k=1Kαkfk(x)spa
讓咱們經過一個例子激發您爲什麼使用混合模型的緣由。讓咱們說有人向您展現瞭如下密度圖:code
p <- ggplot(faithful, aes(x = waiting)) + geom_density() p
咱們能夠當即看到所獲得的分佈彷佛是雙峯的(即有兩個凸起),代表這些數據可能來自兩個不一樣的來源。orm
head(faithful) ## eruptions waiting ## 1 3.600 79 ## 2 1.800 54 ## 3 3.333 74 ## 4 2.283 62 ## 5 4.533 85 ## 6 2.883 55
該數據是2列data.framerem
p + geom_vline(xintercept = 53, col = "red", size = 2) + geom_vline(xintercept = 80, col = "blue", size = 2)
執行混合模型聚類時,您須要作的第一件事是肯定要用於組件的統計分佈類型。 get
正態分佈由兩個變量參數化:it
咱們將用 代碼來演示GMM的實際應用:io
set.seed(1) wait <- faithful$waiting mixmdl <- normalmixEM(wait, k = 2)
data.frame(x = mixmdl$x) %>% ggplot() + fill = "white") + stat_function(geom = "line", fun = plot_mix_comps, args = list(mixmdl$mu[1], mixmdl$sigma[1], lam = mixmdl$lambda[1]), (geom = "line", fun = plot_mix_comps, args = list(mixmdl$mu[2], mixmdl$sigma[2], lam = mixmdl$lambda[2]), colour = "blue", lwd = 1.5) + ylab("Density")
實際上很簡單; 紅色和藍色線僅表示2種不一樣的擬合高斯分佈。平均值分別爲:function
mixmdl$mu ## [1] 54.61489 80.09109
分別具備如下標準誤差:class
mixmdl$sigma ## [1] 5.871244 5.867716
mixmdl$lambda ## [1] 0.3608869 0.6391131
另外一個重要方面是每一個輸入數據點實際上被分配了屬於這些組件之一的後驗機率。咱們可使用如下代碼檢索這些數據:
post.df <- as.data.frame(cbind(x = mixmdl$x, mixmdl$posterior)) head(post.df, 10) #
<span ><span ><code>## x comp.1 comp.2 ## 1 79 0.0001030875283 0.999896912472 ## 2 54 0.9999093397312 0.000090660269 ## 3 74 0.0041357268361 0.995864273164 ## 4 62 0.9673819082244 0.032618091776 ## 5 85 0.0000012235720 0.999998776428 ## 6 55 0.9998100114503 0.000189988550 ## 7 88 0.0000001333596 0.999999866640 ## 8 85 0.0000012235720 0.999998776428 ## 9 51 0.9999901530788 0.000009846921 ## 10 85 0.0000012235720 0.999998776428 </code></span></span>
x列表示數據的值,而comp.1和comp.2分別表示屬於任一組件的後驗機率。
最終用戶決定使用什麼「閾值」將數據分配到組中。例如,可使用0.3做爲後閾值來將數據分配給comp.1並得到如下標籤分佈。