stick-learn樸素貝葉斯的三個經常使用模型:高斯、多項式、伯努利

樸素貝葉斯是一個很不錯的分類器,在使用樸素貝葉斯分類器劃分郵件有關於樸素貝葉斯的簡單介紹。html

一個樣本有n個特徵,分別用x1,x2,...,xn表示,將其劃分到類yk的可能性P(yk|x1,x2,...,xn)爲:python

P(yk|x1,x2,...,xn)=P(yk)ni=1P(xi|yk)算法

上式中等號右側的各個值能夠經過訓練獲得。根據上面的公式能夠求的某個數據屬於各個分類的可能性(這些可能性之和不必定是1),該數據應該屬於具備最大可能性的分類中。ruby

通常來講,若是一個樣本沒有特徵xi,那麼P(xi|yk)將不參與計算。不過下面的伯努利模型除外。dom

以上是樸素貝葉斯的最基本的內容。函數

高斯模型


有些特徵多是連續型變量,好比說人的身高,物體的長度,這些特徵能夠轉換成離散型的值,好比若是身高在160cm如下,特徵值爲1;在160cm和170cm之間,特徵值爲2;在170cm之上,特徵值爲3。也能夠這樣轉換,將身高轉換爲3個特徵,分別是f一、f二、f3,若是身高是160cm如下,這三個特徵的值分別是一、0、0,若身高在170cm之上,這三個特徵的值分別是0、0、1。不過這些方式都不夠細膩,高斯模型能夠解決這個問題。高斯模型假設這些一個特徵的全部屬於某個類別的觀測值符合高斯分佈,也就是:atom

P(xi|yk)=12πσ2yk√exp((xiμyk)22σ2yk)spa

下面看一個sklearn中的示例:code

>>> 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.naive_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]) # 預測結果很合理 

多項式模型


該模型經常使用於文本分類,特徵是單詞,值是單詞的出現次數。htm

P(xi|yk)=Nykxi+αNyk+αn

其中,Nykxi是類別yk下特徵xi出現的總次數;Nyk是類別yk下全部特徵出現的總次數。對應到文本分類裏,若是單詞word在一篇分類爲label1的文檔中出現了5次,那麼Nlabel1,word的值會增長5。若是是去除了重複單詞的,那麼Nlabel1,word的值會增長1。n是特徵的數量,在文本分類中就是去重後的全部單詞的數量。α的取值範圍是[0,1],比較常見的是取值爲1。

待預測樣本中的特徵xi在訓練時可能沒有出現,若是沒有出現,則Nykxi值爲0,若是直接拿來計算該樣本屬於某個分類的機率,結果都將是0。在分子中加入α,在分母中加入αn能夠解決這個問題。

下面的代碼來自sklearn的示例:

>>> import numpy as np >>> X = np.random.randint(5, size=(6, 100)) >>> y = np.array([1, 2, 3, 4, 5, 6]) >>> from sklearn.naive_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] 

值得注意的是,多項式模型在訓練一個數據集結束後能夠繼續訓練其餘數據集而無需將兩個數據集放在一塊兒進行訓練。在sklearn中,MultinomialNB()類的partial_fit()方法能夠進行這種訓練。這種方式特別適合於訓練集大到內存沒法一次性放入的狀況。

在第一次調用partial_fit()時須要給出全部的分類標號。

>>> import numpy >>> from sklearn.naive_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') 

伯努利模型


伯努利模型中,對於一個樣原本說,其特徵用的是全局的特徵。

在伯努利模型中,每一個特徵的取值是布爾型的,即true和false,或者1和0。在文本分類中,就是一個特徵有沒有在一個文檔中出現。

若是特徵值xi值爲1,那麼

P(xi|yk)=P(xi=1|yk)

若是特徵值xi值爲0,那麼

P(xi|yk)=1P(xi=1|yk)

這意味着,「沒有某個特徵」也是一個特徵。 下面的示例來自sklearn官方文檔:

>>> import numpy as np >>> X = np.random.randint(2, size=(6, 100)) >>> Y = np.array([1, 2, 3, 4, 4, 5]) >>> from sklearn.naive_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] 

BernoulliNB()類也有partial_fit()函數。

多項式模型和伯努利模型在文本分類中的應用


基於naive bayes的文本分類算法給出了很好的解釋。

在多項式模型中:

在多項式模型中, 設某文檔d=(t1,t2,…,tk),tk是該文檔中出現過的單詞,容許重複,則

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

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

V是訓練樣本的單詞表(即抽取單詞,單詞出現屢次,只算一個),|V|則表示訓練樣本包含多少種單詞。 P(tk|c)能夠看做是單詞tk在證實d屬於類c上提供了多大的證據,而P(c)則能夠認爲是類別c在總體上佔多大比例(有多大可能性)。

在伯努利模型中:

P(c)= 類c下文件總數/整個訓練樣本的文件總數

P(tk|c)=(類c下包含單詞tk的文件數+1)/(類c下單詞總數+2)

參考


http://scikit-learn.org/stable/modules/naive_bayes.html

http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html

http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html

http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.BernoulliNB.html

http://cn.soulmachine.me/blog/20100528/

相關文章
相關標籤/搜索