LoginSignup
0
0

More than 3 years have passed since last update.

混合正規分布によるクラスタリング

Last updated at Posted at 2019-04-14
#混合指数分布によるクラスタリング

#mixed exponential Intervals p.29

n=1000



k=4

X=array(0,dim=c(k,n))

param=c()

for(j in 1:k){

val=sample(5:50,1)

param=c(param,val)

X[j,]=abs(rpois(n,val))  

}

X=as.numeric(X)

lam=1/sample(5:10,k);p=rep(1/k,k)



ite=1000

for(l in 1:ite){

q=array(0,dim=c(k,length(X)))

for(i in 1:k){
for(j in 1:length(X)){  

q[i,j]=p[i]*dexp(X[j],1/lam[i])   

}
}  

q=t(t(q)/c(apply(q,2,sum)))

p=apply(q,1,mean)

lam=1/(q%*%X/c(apply(q,1,sum)))

q[q==0]=10^(-20)

#print(sum(log(q)))

print(lam)

}



#混合正規分布によるクラスタリング

library(dplyr)

N=10000;

class=4

pi=rep(0.25,class)

mu=c(-5,5,8,3);sig=c(1,5,3,4)

#真の出身(正解データ)

attr=sample(1:class,N,replace = T,prob=pi)

x=rep(-99,N)

for(j in 1:class){

 x[which(attr==j)]<-rnorm(length(which(attr==j)),mu[j],sig[j])

}

#initial conditions

mu=sample(c(-20:20),class);sig=sample(c(1:50),class)

pi=c(0.2,0.6,0.1,0.1)

times=100

for(j in 1:times){

s_piN=array(0,dim=c(class,N))  

for(i in 1:class){

 s_piN[i,]=pi[i]*dnorm(x,mu[i],sig[i]) 

}

qn=c()

for(i in 1:class){

 qn=c(qn,sum(s_piN[i,]/apply(s_piN,2,sum))/N) 

}

pi=qn

mu=c()

sig=c()

for(i in 1:class){

mu_val=sum(x*s_piN[i,]/apply(s_piN,2,sum))/(N*pi[i])  

mu=c(mu,mu_val)  

sig=c(sig,sqrt(sum((s_piN[i,]/apply(s_piN,2,sum))*((x-mu_val)*(x-mu_val)))/(N*pi[i])))

}


}


N=1000

pi0=0.5;pi1=0.5

mu0=5;mu1=-5

sig0=1;sig1=5


attr=sample(0:1,N,replace=T,prob=c(pi0,pi1))

x=rep(-99,N)

x[which(attr==0)]=rnorm(length(which(attr==0)),mu0,sig0)

x[which(attr==1)]=rnorm(length(which(attr==1)),mu1,sig1)

#initial conditions

mu0=1;mu1=1;sig0=10;sig1=20;pi0=0.1;pi1=0.9

iteration=20

for(i in 1:iteration){

 piN0=pi0*dnorm(x,mu0,sig0);piN1=pi1*dnorm(x,mu1,sig1)

 qn0=piN0/(piN0+piN1);qn1=piN1/(piN0+piN1)

 pi0=sum(qn0)/N;pi1=sum(qn1)/N

 mu0=sum(qn0*x)/(N*pi0);mu1=sum(qn1*x)/(N*pi1)

 sig0=sqrt(sum(qn0*(x-mu0)*(x-mu0))/(N*pi0))

 sig1=sqrt(sum(qn1*(x-mu1)*(x-mu1))/(N*pi1))

}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0