EM算法、存在噪声的EM算法
1 EM算法的R语言实现
#步骤1 数据集准备及其描述
library(mclust)
mod1<-Mclust(iris[,1:4])
summary(mod1)
#步骤2 构建EM算法模型,指定分3类
mod2<-Mclust(iris[,1:4],G=3)
summary(mod2,parameters=T)
#步骤3 构建EM算法模型,指定先验概率
mod3<-Mclust(iris[,1:4],prior=priorControl(functionName="defaultPrior",shrinkage=0.1))
summary(mod3)
举例:EM算法应用于iris数据集
library(mclust)
mc<-Mclust(iris[,1:4],3) #运用mclust包处理iris数据集
plot(mc,what="classification",dimens=c(3,4)) #画出分类结果
table(iris$Species,mc$classification)
2 存在噪声的EM算法R语言实现
#步骤1 数据集准备
set.seed(0) #设置随机种子
nNoise=100
Noise=apply(faithful,2,function(x)runif(nNoise,min=min(x)-.1,max=max(x)+.1)) #faithful是一个数据集,表示火山喷发之间的等待时间以及美国怀俄明州黄石国家公园老忠实间歇泉的持续时间。
dim(faithful)
解释:#runif()函数用于生成从0到1区间范围内的服从正态分布的随机数,每次生成的值都不一样。#runif(20) 表示生成20个0到1之间的随机数
#runif(nNoise,min=min(x)-.1,max=max(x)+.1) 表示总共生成nNoise个随机数,且随机数下限为min=min(x)-.1,上限为max=max(x)+.1,
#apply(faithful,2,FUN) 第一个参数表示要参与计算的数据,第二个参数1表示对行计算,2表示对列计算,第三个参数表示对数据的行(列)进行什么运算(比如:均值,和等)。
#Noise=apply(faithful,2,function(x)runif(nNoise,min=min(x)-.1,max=max(x)+.1)) 表示生成100个随机数,且最小的数比faithful数据中最小的小0.1,最大的数比faithful数据中最大的大0.1。
data<-rbind(faithful,Noise) #带有人工噪声的数据集data ,rbind 行合并,要求列数一样。
dim(data)
#步骤2 数据集可视化
plot(faithful) #展示faithful数据集的分布
points(Noise,pch=20,cex=0.5,col="lightgrey") #把人工噪声数据加进去显示,并且设置噪声数据显示的符号pch,噪声数据的大小cex,噪声数据的颜色col
set.seed(0)
NoiseInit<-sample(c(TRUE,FALSE),size=nrow(faithful)+nNoise,replace = T,prob = c(3,1)/4)
#sample(x, size, replace = FALSE,prob ) x表示要抽样的数据,size表示抽样的大小,replace = FALSE表示不重复抽样,replace = TRUE表示重复抽样,prob 表示样本中元素被抽到的可能性
size=nrow(faithful)+nNoise
size
prob = c(3,1)/4
prob
#步骤3 模型建立
library(mclust)
mod4=Mclust(data,initialization=list(noise=NoiseInit)) #建立EM模型,initialization参数为包含零个或多个以下组件的列表:hcPairs、subset、noise。
summary(mod4,parameter=TRUE)
#par(mfrow=c(1,1))
plot(mod4)
图1贝叶斯信息度量图 BIC
图2 分类图classification
图3 不确定性图uncertainty
图4 密度图 density