R에서 무한 혼합 가우스 모델 구현 (깁스 샘플링)

17829 단어 R

기사의 목적



이 기사의 목적은 R에서 무한 혼합 가우스 모델을 구현하는 것입니다.
참고 : 비 파라 메트릭 베이즈 포인트 프로세스 및 통계적 기계 학습 수리

목차



No.
목차

1

모델 설명

2

데이터 및 라이브러리

3

구현

4

확인



1. 모델 설명





2. 데이터 및 라이브러리



iris 데이터 세트를 사용합니다.
X <- iris[,1:4]
D <- ncol(X)
N <- nrow(X)
library(mvtnorm)
library(MCMCpack)
library(cluster)

3. 구현


#(1)Kを求める
K <- 1
#(2)muを乱数で初期化
set.seed(100)
mu <- matrix(rep(apply(X,2,mean),each=K)+rnorm(K*D,0,2), nrow=K)
#(3)パラメータ初期値
a0 <- 1
b0 <- 1
alpha0 <- 10
t <- 1
#(4)(ⅰ)-(ⅳ)を繰り返す
max.iter <- 10
a <- a0 + N*D/2
n <- N
mu0 <- as.vector(rmvnorm(1, apply(X,2,mean), diag(D)))
for(s in 1:max.iter){
  #(ⅰ)zのサンプリング
  tmp <- t(apply(mu, 1, function(x) dmvnorm(X, x, diag(D)/t)))*
    as.vector(n/(N-1+alpha0))
  tmp2 <- dmvnorm(X, rmvnorm(1,mu0,diag(D)/t), diag(D)/t)*
    as.vector(alpha0/(N-1+alpha0))
  z <- apply(rbind(tmp,tmp2), 2, function(x) which.max(rmultinom(1,5,x)))
  #k,nの更新
  K <- z %>% unique() %>% length()
  n <- tapply(z, z, length)
  #(ⅱ)mu(µ)のサンプリング
  x.k <-  apply(X, 2, function(x) tapply(x, z, mean))
  mu <- t(apply(cbind(x.k, n), 1,
                function(x) rmvnorm(1, x[D+1]*x[1:(D)]/(x[D+1]+1)+1/(x[D+1]+1)*mu0,
                                    diag(D)/(t*(x[D+1]+1)))))
  #(ⅲ)t(τ)のサンプリング
  b <- b0 + sum(unlist(apply(X, 2, function(x) tapply(x, z, function(x) (x-mean(x))^2))))/2 +
    sum(as.vector(n/(2*(1+n)))*((t(t(x.k)-mu0)%*%(t(x.k)-mu0))*diag(K)))
  t <- rgamma(1, a, b)
}

4. 확인



왼쪽이 정답이고 오른쪽이 구현의 결과입니다.
par(mfrow=c(1,2))
clusplot(X, iris[,5], color=TRUE, shade=FALSE, labels=4, lines=0)
clusplot(X, z, color=TRUE, shade=FALSE, labels=4, lines=0)

좋은 웹페이지 즐겨찾기