朴素贝叶斯算法
学习与分类算法
1 训练数据
代码语言:javascript复制
代码语言:javascript复制X1<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
X2<-c("S","M","M","S","S","S","M","M","L","L","L","M","M","L","L")
Y<-c(-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1)
2 采用模型学习
对于一个新的实例的特征x,x的取值必须是已知特征的取值范围内的,就可以进行后验概率的估计,否则无法使用朴素贝叶斯进行预测
代码语言:javascript复制#cls指的是“class”类别属性,也就是因变量:,atr指的是一个包含特征名称的字符串向量,特征顺序是可以任意的
#data 是数据框Imada是控制参数,=0,模型采用极大似然估计法进行学习>0,模型采用贝叶斯估计法进行学习
#=1,使用的是拉普拉斯平滑法,所有的组建信息可通过names()或srt()获取
代码语言:javascript复制
navieBayes<-function(cls= "Y",atr=c("X1","X2"),data=NULL,lmada=0){
if(!is.data.frame(data)) stop("Please enter a data frame.")
if(lmada<0) stop("lmada must be greater than or equal to ZERO.")
d<-as.data.frame(apply(data,2,as.factor))
n<-nrow(d)
prodvar_lst<-list()#用来装计算出来的概率
prec_var<-d[cls][,1];levelprec<-levels(prec_var);lprec<-length(levelprec)
prec_p<-data.frame(level=levelprec,prob=NA)
for(i in 1:lprec){
prec_p[i,2]<-(sum(prec_var==levelprec[i]) lmada)/(n lprec*lmada)
}#类Y的先验概率
prodvar_lst[[cls]]<-prec_p
lvar=length(atr)#特征个数
for(i in 1:lvar){ #特征的条件先验概率
xvar<-d[atr[i]][,1]
txy<-table(xvar,prec_var) lmada
ptxy<-prop.table(txy,2)
prodvar_lst[[atr[i]]]<-ptxy}
prodvar_lst$lmada<-lmada
prodvar_lst$response<-cls
prodvar_lst$variables<-atr
class(prodvar_lst)<-"navieBayes" #指定输出对象的类
return(prodvar_lst)}
3 打印结果
代码语言:javascript复制
- print.navieBayes<-function(obj){
- cat("response=prec_var: ",obj$response,";","lmada=",obj$lmada,"n","n")
- cat("The variables are:", obj$variables,"n","n")
- lobj<-length(c(obj$response,obj$variables))
- print.default(obj[1:lobj])}
4 对一个进行预测
代码语言:javascript复制
preCnavieBayes<-function(NBobj,cls=NULL,atr=NULL,atr_value=NULL){
#只能对一个函数进行预测
level<-NBobj[[cls]][,1];ncls<-length(level)
latr<-length(NBobj)-4#特征的个数
start_atr<-2
end_atr<-latr 1
predict_df<-data.frame(matrix(NA,ncls,latr 2))#先建立一个数据框储存结果
colnames(predict_df)<-c(atr,"level","post_p")
for(l in 1:latr){
predict_df[1:ncls,l]<-atr_value[l]
}
predict_df$level<-level
for(i in 1:ncls){
xvec<-NULL
for(j in start_atr:end_atr){
xwhich<-which(rownames(NBobj[[atr[j-1]]])==as.character(atr_value[j-1]))
ywhich<-which(colnames(NBobj[[atr[j-1]]])==as.character(predict_df$level[i]))
px<-NBobj[[atr[j-1]]][xwhich,ywhich]
xvec<-c(xvec,px) }
ypre<-NBobj[[1]][,2][i]
predict_df[i,4]<-ypre*prod(xvec)
}
return(predict_df)
}
5 对多个样本实例进行预测
代码语言:javascript复制
- predict.navieBayes<-function(NBobj,cls=NULL,atr=NULL,atr_value=NULL){
- if(!is.data.frame(atr_value)) stop("atr_value must be a data.frame!")
- post_lst<-apply(atr_value,1,preCnavieBayes,NBobj=NBobj,atr= atr,cls=cls)
- lst<-length(post_lst)
- post_df<-NULL
- for(i in 1:lst) {
- prc_df<-post_lst[[i]]
- post_df<-rbind(post_df,prc_df)}
- cat("The response :",cls,"n")
- return(post_df)}
6 确定实例
代码语言:javascript复制
- dataB4.1<-data.frame(X1=X1,X2=X2,Y=Y)#将训练数据储存在数据框中
- pred_var<-data.frame(X1=c(2),X2=c("S"))
- #需要预测的实例
- plist<-navieBayes(cls="Y",atr=c("X1","X2"),data=dataB4.1,lmada=0)#训练模型
- predict(plist,cls="Y",atr=c("X1","X2"),atr_value=pred_var)#预测模型
- 1/15
- 1/45
- plist#打印“navieBayes”类
- plist1<-navieBayes(cls="Y",atr=c("X1","X2"),data=dataB4.1,lmada=1)#训练模型
- predict(plist1,cls="Y",atr=c("X1","X2"),atr_value=pred_var)#预测模型