貝葉斯定理
先驗(yàn)概率:p(A)
后驗(yàn)概率:p(A|B)是已知B發(fā)生后A的條件概率抵窒,
標(biāo)準(zhǔn)化常量:p(B)是B的先驗(yàn)概率或邊緣概率
在生活中我們很容易求出P(A|B)芍秆,p(B|A)則很難直接得出睦柴,貝葉斯可以幫助我們求出p(B|A)
貝葉斯定理:P(B|A)=P(A|B)P(B)/P(A)
樸素貝葉斯分類
思想基礎(chǔ):對(duì)于每一個(gè)待分類項(xiàng)脚翘,求出在此項(xiàng)類別的基礎(chǔ)下耻姥,各個(gè)類別出現(xiàn)的概率秧了,那個(gè)最大。就認(rèn)為此待分類項(xiàng)屬于哪個(gè)類別受扳。
樸素貝葉斯分類的正式定義如下携龟。
(1)設(shè)x={a1,a2,....an}為一個(gè)待分類項(xiàng)。而每個(gè)a為x的一個(gè)特征屬性
(2)有類別集合C={y1,y2,...,yn}勘高,計(jì)算各類別的先驗(yàn)概率峡蟋。并取對(duì)數(shù)坟桅。
計(jì)算公式:p(i)=log(p(yi))
??????????????????????????? =log((i類別的次數(shù) + 平滑因子)/(總次數(shù) + 類別數(shù)*平滑因子))
(3)在各類別下各個(gè)特征屬性的條件概率估計(jì),并取對(duì)數(shù):
theta(i)(j)=log(p(aj/yi))=log(sumTermFreqs(j)+平滑因子)-thetaLogDenom
theta(i)(j)是i類別下j特征的概率蕊蝗,sumTermFreqs(j)是特征j出現(xiàn)的次數(shù)仅乓,thetaLogDenom分為如下兩種模式:
①多項(xiàng)式模式:
?????????????????? thetaLogDenom=log(sumTermFreqs.values.sum + numFeatures*lambda)
對(duì)于文本分類,sumTermFreqs.values.sum解釋為類i下的單詞總數(shù)匿又,numFeatures是特征數(shù)量,lambda是平滑因子建蹄。
②伯努利模型
?????????????????? thetaLogDenom =log(n+2.0*lambda)
對(duì)于文本分類碌更,n解釋為類i下的文章總數(shù),lambda是平滑因子
(4)計(jì)算P(yi|x),.......P(yn|x)
各個(gè)特征屬性是條件獨(dú)立的洞慎,根據(jù)貝葉斯店里有如下推到:
??????????????? p(yi|x)=p(x|yi)p(yi)/p(x)
因?yàn)閜(x)對(duì)于所有類別為常數(shù)痛单,所以我們只要將分子最大化即可。又因?yàn)楦魈卣鲗傩允菞l件獨(dú)立的劲腿。所以有:p(x|yi)p(yi)=p(a1|yi)..p(am)(y1)p(yi)然后取log
(5)如果p(yi|x)=max{p(y1|x),p(y2|X),.....p(yn|x)},
代碼如下:
importorg.apache.log4j.{Level, Logger}
importorg.apache.spark.mllib.classification.NaiveBayes
importorg.apache.spark.mllib.linalg.Vectors
importorg.apache.spark.mllib.regression.LabeledPoint
importorg.apache.spark.{SparkConf, SparkContext}
/**
* Created by 87109 on 2017/9/30.
*/
objecttmp_native_bayes {
defmain(args: Array[String]): Unit = {
valconf =newSparkConf().setAppName("bayes").setMaster("local")
valsc =newSparkContext(conf)
Logger.getRootLogger.setLevel(Level.WARN)
//讀取樣本數(shù)據(jù)
valdata = sc.textFile("bayes.txt")
valparsedData = data.map{line =>
valparts =line.split(",")
LabeledPoint(parts(0).toDouble,Vectors.dense(parts(1).split(" ").map(_.toDouble)))
}
//將樣本劃分訓(xùn)練樣本和測(cè)試樣本
valsplits = parsedData.randomSplit(Array(0.6,0.4),seed =11L)
valtraining = splits(0)
valtest = splits(1)
//新建貝葉斯模型旭绒,并訓(xùn)練
valmodel = NaiveBayes.train(training,lambda =1.0,modelType ="multinomial")
//對(duì)測(cè)試樣本進(jìn)行測(cè)試
valpredictionAndLabel = test.map(p => (model.predict(p.features),p.label))
valprint_predict=predictionAndLabel.take(20)
println("prediction"+"\t"+"label")
for(i<-0to print_predict.length-1){println(print_predict(i)._1+"\t"+ print_predict(i)._2)}
valaccuracy =1.0*predictionAndLabel.filter(x => x._1 == x._2).count()
}
}