R 語言 樸素貝葉斯算法

樸素貝葉斯算法

學習與分類算法

1 訓練數據

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的取值必須是已知特徵的取值範圍內的,就可以進行後驗概率的估計,否則無法使用樸素貝葉斯進行預測

#cls指的是“class”類別屬性,也就是因變量:,atr指的是一個包含特徵名稱的字符串向量,特徵順序是可以任意的
#data 是數據框Imada是控制參數,=0,模型採用極大似然估計法進行學習>0,模型採用貝葉斯估計法進行學習
#=1,使用的是拉普拉斯平滑法,所有的組建信息可通過names()或srt()獲取
  1. navieBayes<-function(cls= "Y",atr=c("X1","X2"),data=NULL,lmada=0){
  2. if(!is.data.frame(data)) stop("Please enter a data frame.")
  3. if(lmada<0) stop("lmada must be greater than or equal to ZERO.")
  4. d<-as.data.frame(apply(data,2,as.factor))
  5. n<-nrow(d)
  6. prodvar_lst<-list()#用來裝計算出來的概率
  7. prec_var<-d[cls][,1];levelprec<-levels(prec_var);lprec<-length(levelprec)
  8. prec_p<-data.frame(level=levelprec,prob=NA)
  9. for(i in 1:lprec){
  10. prec_p[i,2]<-(sum(prec_var==levelprec[i])+lmada)/(n+lprec*lmada)
  11. }#類Y的先驗概率
  12. prodvar_lst[[cls]]<-prec_p
  13. lvar=length(atr)#特徵個數
  14. for(i in 1:lvar){ #特徵的條件先驗概率
  15. xvar<-d[atr[i]][,1]
  16. txy<-table(xvar,prec_var)+lmada
  17. ptxy<-prop.table(txy,2)
  18. prodvar_lst[[atr[i]]]<-ptxy}
  19. prodvar_lst$lmada<-lmada
  20. prodvar_lst$response<-cls
  21. prodvar_lst$variables<-atr
  22. class(prodvar_lst)<-"navieBayes" #指定輸出對象的類
  23. return(prodvar_lst)}

3 打印結果

  1. print.navieBayes<-function(obj){
  2. cat("response=prec_var: ",obj$response,";","lmada=",obj$lmada,"\n","\n")
  3. cat("The variables are:", obj$variables,"\n","\n")
  4. lobj<-length(c(obj$response,obj$variables))
  5. print.default(obj[1:lobj])}

4 對一個進行預測

  1. preCnavieBayes<-function(NBobj,cls=NULL,atr=NULL,atr_value=NULL){
  2. #只能對一個函數進行預測
  3. level<-NBobj[[cls]][,1];ncls<-length(level)
  4. latr<-length(NBobj)-4#特徵的個數
  5. start_atr<-2
  6. end_atr<-latr+1
  7. predict_df<-data.frame(matrix(NA,ncls,latr+2))#先建立一個數據框儲存結果
  8. colnames(predict_df)<-c(atr,"level","post_p")
  9. for(l in 1:latr){
  10. predict_df[1:ncls,l]<-atr_value[l]
  11. }
  12. predict_df$level<-level
  13. for(i in 1:ncls){
  14. xvec<-NULL
  15. for(j in start_atr:end_atr){
  16. xwhich<-which(rownames(NBobj[[atr[j-1]]])==as.character(atr_value[j-1]))
  17. ywhich<-which(colnames(NBobj[[atr[j-1]]])==as.character(predict_df$level[i]))
  18. px<-NBobj[[atr[j-1]]][xwhich,ywhich]
  19. xvec<-c(xvec,px) }
  20. ypre<-NBobj[[1]][,2][i]
  21. predict_df[i,4]<-ypre*prod(xvec)
  22. }
  23. return(predict_df)
  24. }

5 對多個樣本實例進行預測

  1. predict.navieBayes<-function(NBobj,cls=NULL,atr=NULL,atr_value=NULL){
  2. if(!is.data.frame(atr_value)) stop("atr_value must be a data.frame!")
  3. post_lst<-apply(atr_value,1,preCnavieBayes,NBobj=NBobj,atr= atr,cls=cls)
  4. lst<-length(post_lst)
  5. post_df<-NULL
  6. for(i in 1:lst) {
  7. prc_df<-post_lst[[i]]
  8. post_df<-rbind(post_df,prc_df)}
  9. cat("The response :",cls,"\n")
  10. return(post_df)}

6 確定實例

  1. dataB4.1<-data.frame(X1=X1,X2=X2,Y=Y)#將訓練數據儲存在數據框中
  2. pred_var<-data.frame(X1=c(2),X2=c("S"))
  3. #需要預測的實例
  4. plist<-navieBayes(cls="Y",atr=c("X1","X2"),data=dataB4.1,lmada=0)#訓練模型
  5. predict(plist,cls="Y",atr=c("X1","X2"),atr_value=pred_var)#預測模型
  6. 1/15
  7. 1/45
  8. plist#打印“navieBayes”類
  9. plist1<-navieBayes(cls="Y",atr=c("X1","X2"),data=dataB4.1,lmada=1)#訓練模型
  10. predict(plist1,cls="Y",atr=c("X1","X2"),atr_value=pred_var)#預測模型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章