1. 程式人生 > >python中如何使用樸素貝葉斯演算法

python中如何使用樸素貝葉斯演算法

        這裡再重複一下標題為什麼是"使用"而不是"實現":

              首先,專業人士提供的演算法比我們自己寫的演算法無論是效率還是正確率上都要高。

              其次,對於數學不好的人來說,為了實現演算法而去研究一堆公式是很痛苦的事情。

              再次,除非他人提供的演算法滿足不了自己的需求,否則沒必要"重複造輪子"。

        下面言歸正傳,不瞭解貝葉斯演算法的可以去查一下相關資料,這裡只是簡單介紹一下:

        1.貝葉斯公式:

          P(A|B)=P(AB)/P(B)

        2.貝葉斯推斷:

          P(A|B)=P(A)×P(B|A)/P(B)

          用文字表述:

          後驗概率=先驗概率×相似度/標準化常量

         而貝葉斯演算法要解決的問題就是如何求出相似度,即:P(B|A)的值

        3. 在scikit-learn包中提供了三種常用的樸素貝葉斯演算法,下面依次說明:

         1)高斯樸素貝葉斯:假設屬性/特徵是服從正態分佈的(如下圖),主要應用於數值型特徵。

             

              使用scikit-learn包中自帶的資料,程式碼及說明如下:

複製程式碼
>>>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]............
>>> iris.data.size                ##資料大小 ---600個
>>> iris.target_names             ##顯示分類的名字 
    array(['setosa', 'versicolor', 'virginica'], dtype='<U10')
>>> from sklearn.naive_bayes import GaussianNB  ##匯入高斯樸素貝葉斯演算法
>>> clf = GaussianNB()                          ##給演算法賦一個變數,主要是為了方便使用
>>> clf.fit(iris.data, iris.target)             ##開始分類。對於量特別大的樣本,可以使用函式partial_fit分類,避免一次載入過多資料到記憶體

>>> clf.predict(iris.data[0].reshape(1,-1))       ##驗證分類。標紅部分特別說明:因為predict的引數是陣列,data[0]是列表,所以需要轉換一下
array([0])

>>> data=np.array([6,4,6,2])                      ##驗證分類
>>> clf.predict(data.reshape(1,-1))
array([2])

複製程式碼

 這裡涉及到一個問題:如何判斷資料符合正態分佈? R語言裡面有相關函式判斷,或者直接繪圖也可以看出來,但是都是P(x,y)這種可以在座標系裡面直接

畫出來的情況,而例子中的資料如何確定,目前還沒有搞明白,這部分後續會補上。

          2)多項式分佈樸素貝葉斯:常用於文字分類,特徵是單詞,值是單詞出現的次數。

複製程式碼
##示例來在官方文件,詳細說明見第一個例子
>>> import numpy as np
>>> X = np.random.randint(5, size=(6, 100))    ##返回隨機整數值:範圍[0,5) 大小6*100 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]
複製程式碼

          3)伯努力樸素貝葉斯:每個特徵都是是布林型,得出的結果是0或1,即出現沒出現

複製程式碼
##示例來在官方文件,詳細說明見第一個例子
>>> 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]
複製程式碼

     補充說明:此文還不完善,示例一中也有部分說明需要寫,最近事情較多,後續會逐漸完善。