樸素貝葉斯的三個常用模型 高斯 多項式 伯努利

2021-07-11 10:54:26 字數 4244 閱讀 9090

x1

,x2,

…,xn

x1,x2,…,xn

表示,將其劃分到類yk

yk的可能性p(

yk|x

1,x2

,…,x

n)p(yk|x1,x2,…,xn)為:p

(yk|

x1,x

2,…,

xn)=

p(yk

)∏ni

=1p(

xi|y

k)p(yk|x1,x2,…,xn)=p(yk)∏i=1np(xi|yk)xi

xi,那麼p(x

i|yk

) p(xi|yk)

將不參與計算。不過下面的伯努利模型除外。p(

xi|y

k)=1

2πσ2

yk√e

xp(−

(xi−

μyk)

22σ2

yk) p(xi|yk)=12πσyk2exp(−(xi−μyk)22σyk2)

>>> from sklearn import datasets

>>> iris = datasets.load_iris()

>>> iris.feature_names # 四個特徵的名字

['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

>>> iris.data

array([[ 5.1, 3.5, 1.4, 0.2],

[ 4.9, 3. , 1.4, 0.2],

[ 4.7, 3.2, 1.3, 0.2],

[ 4.6, 3.1, 1.5, 0.2],

[ 5. , 3.6, 1.4, 0.2],

[ 5.4, 3.9, 1.7, 0.4],

[ 4.6, 3.4, 1.4, 0.3],

[ 5. , 3.4, 1.5, 0.2],

......

[ 6.5, 3. , 5.2, 2. ],

[ 6.2, 3.4, 5.4, 2.3],

[ 5.9, 3. , 5.1, 1.8]]) #型別是numpy.array

>>> iris.data.size

600#共600/4=150個樣本

>>> iris.target_names

array(['setosa', 'versicolor', 'virginica'],

dtype='|s10')

>>> iris.target

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,....., 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ......, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

>>> iris.target.size

150>>> from sklearn.*****_bayes import gaussiannb

>>> clf = gaussiannb()

>>> clf.fit(iris.data, iris.target)

>>> clf.predict(iris.data[0])

array([0]) # **正確

>>> clf.predict(iris.data[149])

array([2]) # **正確

>>> data = numpy.array([6,4,6,2])

>>> clf.predict(data)

array([2]) # **結果很合理

p(x

i|yk

)=ny

kxi+

αnyk

+αn p(xi|yk)=nykxi+αnyk+αnny

kxi nykxi

是類別y

k yk

下特徵x

i xi

出現的總次數;ny

k nyk

是類別y

k yk

下所有特徵出現的總次數。對應到文字分類裡,如果單詞word在一篇分類為label1的文件中出現了5次,那麼nl

abel

1,wo

rdnlabel1,word

的值會增加5。如果是去除了重複單詞的,那麼nl

abel

1,wo

rdnlabel1,word

的值會增加1。

n n

是特徵的數量,在文字分類中就是去重後的所有單詞的數量。

α α

的取值範圍是[0,1],比較常見的是取值為1。xi

xi在訓練時可能沒有出現,如果沒有出現,則ny

kxi nykxi

值為0,如果直接拿來計算該樣本屬於某個分類的概率,結果都將是0。在分子中加入

α α

,在分母中加入αn

αn可以解決這個問題。

>>> 

import numpy as np

>>> x = np.random.randint(5, size=(6, 100))

>>> y = np.array([1, 2, 3, 4, 5, 6])

>>>

from sklearn.*****_bayes import multinomialnb

>>> clf = multinomialnb()

>>> clf.fit(x, y)

multinomialnb(alpha=1.0, class_prior=none, fit_prior=true)

>>> print(clf.predict(x[2]))

[3]

>>> import numpy

>>> from sklearn.*****_bayes import multinomialnb

>>> clf = multinomialnb()

>>> clf.partial_fit(numpy.array([1,1]), numpy.array(['aa']), ['aa','bb'])

gaussiannb()

>>> clf.partial_fit(numpy.array([6,1]), numpy.array(['bb']))

gaussiannb()

>>> clf.predict(numpy.array([9,1]))

array(['bb'],

dtype='|s2')

x

i xi

值為1,那麼p(

xi|y

k)=p

(xi=

1|yk

) p(xi|yk)=p(xi=1|yk)xi

xi值為0,那麼p(

xi|y

k)=1

−p(x

i=1|

yk) p(xi|yk)=1−p(xi=1|yk)

>>> 

import numpy as np

>>> x = np.random.randint(2, size=(6, 100))

>>> y = np.array([1, 2, 3, 4, 4, 5])

>>>

from sklearn.*****_bayes import bernoullinb

>>> clf = bernoullinb()

>>> clf.fit(x, y)

bernoullinb(alpha=1.0, binarize=0.0, class_prior=none, fit_prior=true)

>>> print(clf.predict(x[2]))

[3]

先驗概率p(c)= 類c下單詞總數/整個訓練樣本的單詞總數

類條件概率p(tk|c)=(類c下單詞tk在各個文件中出現過的次數之和+1)/(類c下單詞總數+|v|)

v是訓練樣本的單詞表(即抽取單詞,單詞出現多次,只算乙個),|v|則表示訓練樣本包含多少種單詞。 p(tk|c)可以看作是單詞tk在證明d屬於類c上提供了多大的證據,而p(c)則可以認為是類別c在整體上佔多大比例(有多大可能性)。

p(tk|c)=(類c下包含單詞tk的檔案數+1)/(類c下單詞總數+2)

樸素貝葉斯模型

生成模型 條件概率 p a b p a b p b 全概率 p a in p a bi p bi inp abi 把所 有包含a 的情況都 加起來 貝葉斯公式 p a b p ak b p ab p b ak p ak p b i p b ai p ai p b ak p ak i 1 kp b a...

樸素貝葉斯模型的簡單實現

coding utf 8 from numpy import def loaddataset postinglist my dog has flea problems help please maybe not take him to dog park stupid my dalmation is ...

樸素貝葉斯的2種模型

多項式模型 以詞為粒度,目標文件中沒出現的詞不參與後驗概率計算 先驗概率p c 類c下單詞總數 整個訓練樣本的單詞總數 類條件概率p tk c 類c下單詞tk在各個文件 現過的次數之和 1 類c下單詞總數 v p yes d p yes p chinese yes p japan yes p tok...