学习与分类算法


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)#cls指的是“class”类别属性,也就是因变量:,atr指的是一个包含特征名称的字符串向量,特征顺序是可以任意的
#data 是数据框Imada是控制参数,=0,模型采用极大似然估计法进行学习>0,模型采用贝叶斯估计法进行学习
#=1,使用的是拉普拉斯平滑法,所有的组建信息可通过names()或srt()获取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 打印结果 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 对多个样本实例进行预测