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...