Spark 貝葉斯分類演算法

2021-08-08 06:33:02 字數 3649 閱讀 1249

一、貝葉斯定理數學基礎

我們都知道條件概率的數學公式形式為

根據此公式變換,得到貝葉斯公式:

更進一步將貝葉斯公式進行推廣,假設事件a發生的概率是由一系列的因素(a1,a2,a3,...an)決定的,則事件a的全概率公式為:

二、樸素貝葉斯分類

樸素貝葉斯分類是一種十分簡單的分類演算法,其思想基礎是:對於給定的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項就屬於哪個類別。

假設v=(v1,v2,v3....vn)是乙個待分項,而vn為v的每個特徵向量;

b=(b1,b2,b3...bn)是乙個分類集合,bn為每個具體的分類;

如果需要測試某個vn歸屬於b集合中的哪個具體分類,則需要計算p(bn|v),即在v發生的條件下,歸屬於b1,b2,b3,....bn中哪個可能性最大。即:

因此,這個問題轉換成求每個待分項分配到集合中具體分類的概率是多少。而這個·具體概率的求法可以使用貝葉斯定律。

經過變換得出:

三、mllib對應的api

1、貝葉斯分類伴生物件nativebayes,原型:

object *****bayes extends scala.anyref with scala.serializable 

def train(input : org.apache.spark.rdd.rdd[org.apache.spark.mllib.regression.labeledpoint], lambda : scala.double) : org.apache.spark.mllib.classification.*****bayesmodel =

}

其主要定義了訓練貝葉斯分類模型的train方法,其中input為訓練樣本,lambda為平滑因子引數。

2、train方法,其是nativebayes物件的靜態方法,根據設定的樸素貝葉斯分類引數新建樸素貝葉斯分類類,並執行run方法進行訓練。

3、樸素貝葉斯分類類*****bayes,原型:

class *****bayes private (private

varlambda : scala.double) extends scala.anyref with scala.serializable with org.apache.spark.logging

def setlambda(lambda : scala.double) : org.apache.spark.mllib.classification.*****bayes =

def run(data : org.apache.spark.rdd.rdd[org.apache.spark.mllib.regression.labeledpoint]) : org.apache.spark.mllib.classification.*****bayesmodel =

}

4、run方法,該方法主要計算先驗概率和條件概率。首先對所有樣本資料進行聚合,以label為key,聚合同乙個label的特徵features,得到所有label的統計(label,features之和),然後根據label統計資料,再計算p(i),和theta(i)(j),最後,根據類別標籤列表、類別先驗概率、各類別下的每個特徵的條件概率生成貝葉斯模型。

先驗概率並取對數p(i)=log(p(yi))=log((i類別的次數+平滑因子)/(總次數+類別數*平滑因子)))

各個特徵屬性的條件概率,並取對數

theta(i)(j)=log(p(ai|yi))=log(sumtermfreqs(j)+平滑因子)-thetalogdenom

其中,theta(i)(j)是類別i下特徵j的概率,sumtermfreqs(j)是特徵j出現的次數,thetalogdenom一般分2種情況,如下:

1.多項式模型

thetalogdenom=log(sumtermfreqs.values.sum+ numfeatures* lambda)

其中,sumtermfreqs.values.sum類別i的總數,numfeatures特徵數量,lambda平滑因子

2.伯努利模型

thetalogdenom=log(n+2.0*lambda)

5、aggregated:對所有樣本進行聚合統計,統計沒個類別下的每個特徵值之和及次數。

6、pi表示各類別·的·先驗概率取自然對數的值

7、theta表示各個特徵在各個類別中的條件概率值

8、predict:根據模型的先驗概率、條件概率,計算樣本屬於每個類別的概率,取最大項作為樣本的類別

9、貝葉斯分類模型

*****bayesmodel包含引數:類別標籤列表(labels)、類別先驗概率(pi)、各個特徵在各個類別中的條件概率(theta)。

四、使用示例

1、樣本資料:

0,1 0 0

0,2 0 0

1,0 1 0

1,0 2 0

2,0 0 1

2,0 0 2

import

org.apache.spark.mllib.classification.*****bayes

import

org.apache.spark.mllib.linalg.vectors

import

org.apache.spark.mllib.util.mlutils

import

org.apache.spark.

object bayes

}

import

org.apache.log4j.

import

org.apache.spark.mllib.classification.*****bayes

import

org.apache.spark.mllib.linalg.vectors

import

org.apache.spark.mllib.regression.labeledpoint

import

org.apache.spark.

object bayes

//將樣本資料分為訓練樣本和測試樣本

val sp=demo.randomsplit(array(0.6,0.4),seed = 11l)//對資料進行分配

val train=sp(0)//訓練資料

val testing=sp(1)//測試資料

//建立貝葉斯分類模型,並進行訓練

val model=*****bayes.train(train,lambda = 1.0)

//對測試樣本進行測試

val pre=testing.map(p=>(model.predict(p.features),p.label))//驗證模型

val prin=pre.take(20)

println("prediction"+"\t"+"label")

for(i

val accuracy=1.0 *pre.filter(x=>x._1==x._2).count()//計算準確度

println(accuracy)

}

}

Spark 貝葉斯分類演算法

一 貝葉斯定理數學基礎 我們都知道條件概率的數學公式形式為 根據此公式變換,得到貝葉斯公式 更進一步將貝葉斯公式進行推廣,假設事件a發生的概率是由一系列的因素 a1,a2,a3,an 決定的,則事件a的全概率公式為 二 樸素貝葉斯分類 樸素貝葉斯分類是一種十分簡單的分類演算法,其思想基礎是 對於給定...

貝葉斯分類演算法

貝葉斯分類演算法 貝葉斯分類演算法是統計學的一種分類方法,它是一類利用概率統計知識進行分類的演算法。在許多場合,樸素貝葉斯 na ve bayes,nb 分類演算法可以與決策樹和神經網路分類演算法相媲美,該演算法能運用到大型資料庫中,而且方法簡單 分類準確率高 速度快。樸素貝葉斯演算法 設每個資料樣...

spark 類別特徵 Spark 貝葉斯分類演算法

一 貝葉斯定理數學基礎 我們都知道條件概率的數學公式形式為 根據此公式變換,得到貝葉斯公式 更進一步將貝葉斯公式進行推廣,假設事件a發生的概率是由一系列的因素 a1,a2,a3,an 決定的,則事件a的全概率公式為 二 樸素貝葉斯分類 樸素貝葉斯分類是一種十分簡單的分類演算法,其思想基礎是 對於給定...