R語言使用混合模型進行聚類

原文連接:http://tecdat.cn/?p=6112

 混合模型是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

  • μμ
  • σ2σ2

 咱們將用 代碼來演示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並得到如下標籤分佈。

相關文章
相關標籤/搜索