1. 程式人生 > >[R][原始碼]EM演算法實現基於高斯混合模型(GMM)的聚類

[R][原始碼]EM演算法實現基於高斯混合模型(GMM)的聚類

要求:用EM演算法實現基於GMM的聚類演算法。


一、實驗資料

參考[1] 3.3.2章節。由兩個二維高斯分佈混合生成1000個數據,混合係數分別是0.4、0.6,均值和方差如下:

mu1=[-2,-2]

sigma1=[1.2, 0.5, 0.5, 1]

mean2=[2,2]

sigma2=[1.5, 0.7, 0.7, 1]

二、實驗過程、結果與分析

2.1 資料散點圖

 

2.2 用mclust包實現

R語言自帶mclust包可對混合高斯分佈實現EM聚類,cluster1有391個數據,cluster2有609個數據。

2.3 我的實現

演算法迭代47次後收斂,cluster1中有387個數據,cluster2中有613個數據。

 


2.4 分析

我的演算法得到的cluster1比mclust包得到的cluster1少了4個數據,故兩種演算法基本一致。將我的演算法得到的兩個高斯的均值、方差與預設值對比,也基本一致。

三、參考文獻

[1]Vipin Kumar. Data clustering algorithmsand applications

[2]Miin-Shen Yang. A robust EM clusteringalgorithm for Gaussian mixture models

四:原始碼(R程式 gmm2dim.R)

#------------------multivariate normaldistribution-------------------

library(MASS)

#gaussian 1

mean1<-c(-2,-2)

sigma1<-matrix(c(1.2,0.5,

                 0.5,1),nrow=2,ncol=2)

#gaussian 2

mean2<-c(2,2)

sigma2<-matrix(c(1.5,0.7,

                 0.7,1),nrow=2,ncol=2)

#The number of samples from the mixturedistribution

N = 1000           

#Sample N random uniforms U (均勻分佈 U值介於[0,1],N個U)

U = runif(N)

#matrix(dim:N,2) to store the samples fromthe mixture distribution                                         

samples = matrix(NA,nrow=N,ncol=2)

#Sampling from the mixture

for(i in 1:N){

   if(U[i]<.4){

       samples[i,] = mvrnorm(1,mean1,sigma1)

        }else{

       samples[i,] = mvrnorm(1,mean2,sigma2)

       }

}

plot(samples,xlim=c(-6,6),ylim=c(-6,6),xlab="",ylab="")

#----------------using the mclustpackage----------Gaussian finite mixture model fitted by EM algorithm

library(mclust)

mc<-Mclust(samples)

#----------------myalgorithm------------------------------

#-----initialization-----

 #themax iteration times

T = 100

 #means,attention:不能令mu1=mu2

mu1<-c(-1,-1)

mu2<-c(1,1)

 #covariances

sig1<-matrix(c(1,0,

               0,1),nrow=2,ncol=2)

sig2<-matrix(c(1,0,

               0,1),nrow=2,ncol=2)

 #mixing probabilities

pi1<- 0.5

pi2<- 1-pi1

 #probability matrix p(z(i)=j|x(i);pi,mu,sig)

prob<-matrix(rep(NA,N*M),nrow=N,ncol=M)

#-----EM------

 #dmvnorm(x,mu,sd) 生成多維正太分佈的密度值,包:mvtnorm

library(mvtnorm)

for(step in 1:T){

#----mu1賦值給oldmu1,在M step對mu1進行改變

 oldmu1<-mu1

 oldmu2<-mu2

 oldsig1<-sig1

 oldsig2<-sig2

 oldpi1<-pi1

 oldpi2<-pi2

#----E step

 for(i in 1:N){

   t1= dmvnorm(samples[i,],mu1,sig1) * pi1

   t2= dmvnorm(samples[i,],mu2,sig2) * pi2

  prob[i,1] = t1 / (t1+t2)

  prob[i,2] = t2 / (t1+t2)

 }

#----M step

#compute mu1,sig1,pi1,針對prob[,1]

 #--1--prob矩陣的第一列求和

  p1= sum(prob[,1])

 #--2--for i=1:N, prob[i,1]*samples[i,] [N*2]矩陣

  m1= prob[,1] * samples

 #c(m1的第一列求和,m1的第二列求和) [1*2]矩陣

  p2= c( sum(m1[,1]),sum(m1[,2]) )

 #--3--calculate sig1的分子

  p3= matrix(0,nrow=2,ncol=2)

 for(k in 1:N)

   p3 = p3 + prob[k,1] * (samples[k,] - mu1)%*%t(samples[k,] - mu1)

 #--4--

  mu1= p2 / p1

 sig1 = p3 / p1

  pi1= p1 / N

#compute mu2,sig2,pi2,針對prob[,2]

 #--1--prob矩陣的第二列求和

  p1= sum(prob[,2])

 #--2--for i=1:N, prob[i,2]*samples[i,] [N*2]矩陣

  m1= prob[,2] * samples

 #c(m1的第一列求和,m1的第二列求和) [1*2]矩陣

  p2= c( sum(m1[,1]),sum(m1[,2]) )

 #--3--calculate sig2的分子

  p3= matrix(0,nrow=2,ncol=2)

 for(k in 1:N)

   p3 = p3 + prob[k,2] * (samples[k,] - mu2)%*%t(samples[k,] - mu2)

 #--4--

  mu2= p2 / p1

 sig2 = p3 / p1

  pi2= p1 / N

#----判斷兩個cluster中點的數目

  c1= 0

 for( k in 1:N){

    if( prob[k,1] >= prob[k,2]){

       c1 = c1 + 1

    }

  }

#----whether get to convergence

 epsilo = 1e-10

  if(#均值 mu1,mu2每個量<epsilo

     abs(mu1[1]-oldmu1[1]) < epsilo &

     abs(mu1[2]-oldmu1[2]) < epsilo &

     abs(mu2[1]-oldmu2[1]) < epsilo &

      abs(mu2[2]-oldmu2[2]) < epsilo &

     #協方差矩陣 sig1,sig2每個量<epsilo

     abs(sig1[1,1]-oldsig1[1,1]) < epsilo &

     abs(sig1[1,2]-oldsig1[1,2]) < epsilo &

     abs(sig1[2,1]-oldsig1[2,1]) < epsilo &

     abs(sig1[2,2]-oldsig1[2,2]) < epsilo &

     abs(sig2[1,1]-oldsig2[1,1]) < epsilo &

     abs(sig2[1,2]-oldsig2[1,2]) < epsilo &

     abs(sig2[2,1]-oldsig2[2,1]) < epsilo &

     abs(sig2[2,2]-oldsig2[2,2]) < epsilo

     )break

 cat('Step',step,':mu1=',mu1,',mu2=',mu2,',sigma1=',sig1,',sigma2=',sig2,'c1=',c1,'c2=',N-c1,'\n')

}

相關推薦

[R][原始碼]EM演算法實現基於混合模型GMM

要求:用EM演算法實現基於GMM的聚類演算法。一、實驗資料參考[1] 3.3.2章節。由兩個二維高斯分佈混合生成1000個數據,混合係數分別是0.4、0.6,均值和方差如下:mu1=[-2,-2]sigma1=[1.2, 0.5, 0.5, 1]mean2=[2,2]sigm

混合模型GMMEM演算法實現

在 聚類演算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut一文中我們給出了GMM演算法的基本模型與似然函式,在EM演算法原理中對EM演算法的實現與收斂性證明進行了詳細說明。本文主要針對如何用EM演算法在混合高

混合模型GMM及其EM演算法的理解

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

混合模型GMM及其求解期望最大化EM演算法

1、高斯混合模型的公式表達 高斯混合模型是指隨機變數x具有如下形式的分佈(概率密度函式): (公式1) 其中,引數θθ代表所有混合成分的引數(均值向量μ與協方差矩陣Σ)的集合: (公式2) 每個混合成分的概率密度函式為:

混合模型GMM介紹以及學習筆記

1.高斯混合模型概述 高斯密度函式估計是一種引數化模型。高斯混合模型(Gaussian Mixture Model, GMM)是單一高斯概率密度函式的延伸,GMM能夠平滑地近似任意形狀的密度分佈。高斯混合模型種類有單高斯模型(Single Gaussian Model, S

EM演算法混合模型

單個高斯模型 如果我們有一堆資料,其分佈屬於一個高斯模型,那麼有 p(X)=N(x|μ,Σ)=1(2π)m|Σ|‾‾‾‾‾‾‾‾√exp[−12(x−μ)TΣ−1(x−μ)](1.1) p(X) = N(x|\mu,\Sigma) = \

EM演算法】在混合模型中的應用及python示例

一、EM演算法 EM演算法是一種迭代演算法,用於含有隱含變數的概率模型引數的極大似然估計。設Y為觀測隨機變數的資料,Z為隱藏的隨機變數資料,Y和Z一起稱為完全資料。 觀測資料的似然函式為: 模型引數θ的極大似然估計為: 這個問題只有通過迭代求解,下面給出EM演算法的迭代

混合模型GMM model以及梯度下降法gradient descent更新引數

關於GMM模型的資料和 EM 引數估算的資料,網上已經有很多了,今天想談的是GMM的協方差矩陣的分析、GMM的引數更新方法 1、GMM協方差矩陣的物理含義 涉及到每個元素,是這樣求算: 用中文來描述就是: 注意後面的那個除以(樣本數-1),就是大括號外面的E求期望 (這叫

混合模型Gaussian Mixture Model,GMM

先從簡單的離散型隨機變數看起 離散型隨機變數P{X=ak}=pk,k=1,2,3,...,n 其中:∑i=1npi=1 那麼它的期望值是:E(X)=∑kakpk 以上都是中學數學知識,那麼到了高等數學的概率論與數理統計這門課才開始討論連續隨機變數的情況。

混合模型Gaussian Mixture Model

k-means應該是原來級別的聚類方法了,這整理下一個使用後驗概率準確評測其精度的方法—高斯混合模型。 我們談到了用 k-means 進行聚類的方法,這次我們來說一下另一個很流行的演算法:Gaussian Mixture Model (GMM)。事實上,GMM

混合模型Gaussian Mixture Model【轉】

k-means應該是原來級別的聚類方法了,這整理下一個使用後驗概率準確評測其精度的方法—高斯混合模型。 我們談到了用 k-means 進行聚類的方法,這次我們來說一下另一個很流行的演算法:Gaussian Mixture Model (GMM)。事實上,GMM 和 k-means 很像,不過 GMM 是學習

R語言:EM演算法混合模型R語言實現

本文我們討論期望最大化理論,應用和評估基於期望最大化的聚類。軟體包install.packages("mclust");require(mclust)## Loading required package: mclust## Package 'mclust' version

混合模型視訊背景建模的EM演算法與Matlab 實現

1.問題描述 影像的背景前景分離. 輸⼊為影像監控的1000 幀 (如下⽅圖中左邊所⽰), 要求輸出是背景和前景 (如下⽅圖中右邊所⽰). 2.背景知識 觀察待處理的監控影像,可以發現,前景主要是來來往往的行人,背景始終是攝像頭對準的固定區域,

EM(期望最大演算法)在混合模型中的python實現

以下程式碼僅實現了兩個高斯混合模型在均勻分佈條件下的引數估計,想要實現完全隨機的非均勻分佈的多高斯混合模型,可在上面加以修改。具體參考書中的9.3.2節 ##python實現## import math #import copy import numpy

【機器學習】EM演算法混合模型學習中的應用

前言 EM演算法,此部落格介紹了EMEM演算法相關理論知識,看本篇部落格前先熟悉EMEM演算法。 本篇部落格打算先從單個高斯分佈說起,然後推廣到多個高斯混合起來,最後給出高斯混合模型引數求解過程。 單個高斯分佈 假如我們有一些資料,這些資料來自同一個

EM演算法混合模型

      由k個高斯模型加權組成,α是各高斯分佈的權重,Θ是引數。對GMM模型的引數估計,就要用EM演算法。更一般的講,EM演算法適用於帶有隱變數的概率模型的估計,即不同的高斯分佈所對應的類別變數。   為何不能使用極大似然估計,如果直接使用極大似然估計

機器學習筆記EM演算法及實踐混合模型GMM為例來次完整的EM

今天要來討論的是EM演算法。第一眼看到EM我就想到了我大楓哥,EM Master,千里馬,RUA!!!不知道看這個部落格的人有沒有懂這個梗的。好的,言歸正傳,今天要講的EM演算法,全稱是Expectation maximization,期望最大化。怎麼個意思呢,就是給你一

05 EM演算法 - 混合模型 - GMM

04 EM演算法 - EM演算法收斂證明 __GMM__(Gaussian Mixture Model, 高斯混合模型)是指該演算法由多個高斯模型線性疊加混合而成。每個高斯模型稱之為component。 __GMM演算法__描述的是資料的本身存在的一種分佈,即樣本特徵屬性的分佈,和預測值Y無關。顯然G

演算法基於混合分佈 GMM方法補充閱讀

      基於高斯混合分佈的聚類,我看了很多資料,,寫的千篇一律,一律到讓人看不明白。直到認真看了幾遍周志華寫的,每看一遍,都對 GMM 聚類有一個進一步的認識。所以,如果你想了解這一塊,別看亂七八糟的部落格了,直接去看周志華的《機器學習》 P206頁。 下面是我額外看的

EM演算法混合模型(二)

EM引數求解 我們將GMM帶入 θ(g+1) \theta^{(g+1)}中 θ(g+1)=argmaxθ∫zln{P(X,z|θ)P(z|X,θ(g))}dz(6.1) \theta^{(g+1)} = {argm