Spark機器學習(4):朴素貝葉斯算法


1. 貝葉斯定理

條件概率公式:

這個公式非常簡單,就是計算在B發生的情況下,A發生的概率。但是很多時候,我們很容易知道P(A|B),需要計算的是P(B|A),這時就要用到貝葉斯定理:

2. 朴素貝葉斯分類

朴素貝葉斯分類的推導過程就不詳述了,其流程可以簡單的用一張圖來表示:

 

舉個簡單的例子來說,下面這張表說明了各地區的人口構成:

這個時候如果一個黑皮膚的人走過來(一個待分類項(0,0,1)),他是來自歐美,亞洲還是非洲呢?可以根據朴素貝葉斯分類進行計算:

歐美=0.30×0.90×0.20×0.40=0.0216

亞洲=0.95×0.10×0.05×0.40=0.0019

非洲=0.90×1.00×0.90×0.20=0.1620

即他來自非洲的可能性最大,來自歐美的可能性次之,來自亞洲的可能性最小,那么我們就判斷他來自非洲,這和我們日常生活中的經驗是一致的。

如果特征屬性是連續值,則按照下面的公式計算:

3. MLlib的貝葉斯分類

直接上代碼:

import org.apache.log4j.{Level, Logger}
import org.apache.spark.mllib.classification.NaiveBayes
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.{SparkConf, SparkContext}

object NaiveBayesTest {
  def main(args: Array[String]) {
    // 設置運行環境
    val conf = new SparkConf().setAppName("Naive Bayes Test")
      .setMaster("spark://master:7077").setJars(Seq("E:\\Intellij\\Projects\\MachineLearning\\MachineLearning.jar"))
    val sc = new SparkContext(conf)
    Logger.getRootLogger.setLevel(Level.WARN)

    // 讀取樣本數據並解析
    val dataRDD = sc.textFile("hdfs://master:9000/ml/data/sample_naive_bayes_data.txt")
    val parsedDataRDD = dataRDD.map { line =>
      val parts = line.split(',')
      LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble)))
    }

    // 樣本數據划分,訓練樣本占0.8,測試樣本占0.2
    val dataParts = parsedDataRDD.randomSplit(Array(0.8, 0.2))
    val trainRDD = dataParts(0)
    val testRDD = dataParts(1)

    // 建立貝葉斯分類模型並訓練
    val model = NaiveBayes.train(trainRDD, lambda = 1.0, modelType = "multinomial")

    // 對測試樣本進行測試
    val predictionAndLabel = testRDD.map(p => (model.predict(p.features), p.label, p.features))
    val showPredict = predictionAndLabel.take(50)
    println("Prediction" + "\t" + "Label" + "\t" + "Data")
    for (i <- 0 to showPredict.length - 1) {
      println(showPredict(i)._1 + "\t" + showPredict(i)._2 + "\t" + showPredict(i)._3)
    }

    val accuracy = 1.0 * predictionAndLabel.filter(x => x._1 == x._2).count() / testRDD.count()
    println("Accuracy=" + accuracy)
  }
}

其中,NaiveBayes是貝葉斯分類伴生對象,train方法進行模型訓練,三個參數分別是訓練樣本,平滑參數和模型類別。模型類別有兩個:multinomial(多項式)和bernoulli(伯努利),這里使用的是multinomial。predict方法根據特征值進行判斷分類。

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM