朴素貝葉斯算法--python實現


朴素貝葉斯算法要理解一下基礎:    【朴素:特征條件獨立   貝葉斯:基於貝葉斯定理】

1朴素貝葉斯的概念【聯合概率分布、先驗概率、 條件概率**、全概率公式】【條件獨立性假設、】   極大似然估計
2優缺點    
【優點: 分類效率穩定;對缺失數據不敏感,算法比較簡單,常用於 文本分類;在屬性相關性較小時,該算法性能最好    缺點:假設屬性之間相互獨立;先驗概率多取決於假設;對輸入數據的表達形式很敏感】
3先驗概率、后驗概率
先驗概率的計算比較簡單,沒有使用貝葉斯公式;
而后驗概率的計算,要使用貝葉斯公式,而且在利用樣本資料計算邏輯概率時,還要使用理論概率分布,需要更多的數理統計知識。
4朴素貝葉斯的參數估計:
①極大似然估計(可能出現概率為0的情況)②貝葉斯估計(加入常數,拉普拉斯平滑)
 
參考
教你明白啥是朴素貝葉斯分類器    有助於理解朴素貝葉斯算法
 
前提python2.7     數據來源:  http://pan.baidu.com/s/1pLoKUMJ
 # 極大似然估計  朴素貝葉斯算法
 1 #coding:utf-8
 2 # 極大似然估計  朴素貝葉斯算法
 3 import pandas as pd
 4 import numpy as np
 5 
 6 class NaiveBayes(object):
 7     def getTrainSet(self):
 8         dataSet = pd.read_csv('C://pythonwork//practice_data//naivebayes_data.csv')
 9         dataSetNP = np.array(dataSet)  #將數據由dataframe類型轉換為數組類型
10         trainData = dataSetNP[:,0:dataSetNP.shape[1]-1]   #訓練數據x1,x2
11         labels = dataSetNP[:,dataSetNP.shape[1]-1]        #訓練數據所對應的所屬類型Y
12         return trainData, labels
13 
14     def classify(self, trainData, labels, features):
15         #求labels中每個label的先驗概率
16         labels = list(labels)    #轉換為list類型
17         P_y = {}       #存入label的概率
18         for label in labels:
19             P_y[label] = labels.count(label)/float(len(labels))   # p = count(y) / count(Y)
20 
21         #求label與feature同時發生的概率
22         P_xy = {}
23         for y in P_y.keys():
24             y_index = [i for i, label in enumerate(labels) if label == y]  # labels中出現y值的所有數值的下標索引
25             for j in range(len(features)):      # features[0] 在trainData[:,0]中出現的值的所有下標索引
26                 x_index = [i for i, feature in enumerate(trainData[:,j]) if feature == features[j]]
27                 xy_count = len(set(x_index) & set(y_index))   # set(x_index)&set(y_index)列出兩個表相同的元素
28                 pkey = str(features[j]) + '*' + str(y)
29                 P_xy[pkey] = xy_count / float(len(labels))
30 
31         #求條件概率
32         P = {}
33         for y in P_y.keys():
34             for x in features:
35                 pkey = str(x) + '|' + str(y)
36                 P[pkey] = P_xy[str(x)+'*'+str(y)] / float(P_y[y])    #P[X1/Y] = P[X1Y]/P[Y]
37 
38         #求[2,'S']所屬類別
39         F = {}   #[2,'S']屬於各個類別的概率
40         for y in P_y:
41             F[y] = P_y[y]
42             for x in features:
43                 F[y] = F[y]*P[str(x)+'|'+str(y)]     #P[y/X] = P[X/y]*P[y]/P[X],分母相等,比較分子即可,所以有F=P[X/y]*P[y]=P[x1/Y]*P[x2/Y]*P[y]
44 
45         features_label = max(F, key=F.get)  #概率最大值對應的類別
46         return features_label
47 
48 
49 if __name__ == '__main__':
50     nb = NaiveBayes()
51     # 訓練數據
52     trainData, labels = nb.getTrainSet()
53     # x1,x2
54     features = [2,'S']
55     # 該特征應屬於哪一類
56     result = nb.classify(trainData, labels, features)
57     print features,'屬於',result

 

#朴素貝葉斯算法   貝葉斯估計, λ=1  K=2, S=3; λ=1 拉普拉斯平滑
 1 #coding:utf-8
 2 #朴素貝葉斯算法   貝葉斯估計, λ=1  K=2, S=3; λ=1 拉普拉斯平滑
 3 import pandas as pd
 4 import numpy as np
 5 
 6 class NavieBayesB(object):
 7     def __init__(self):
 8         self.A = 1    # 即λ=1
 9         self.K = 2
10         self.S = 3
11 
12     def getTrainSet(self):
13         trainSet = pd.read_csv('C://pythonwork//practice_data//naivebayes_data.csv')
14         trainSetNP = np.array(trainSet)     #由dataframe類型轉換為數組類型
15         trainData = trainSetNP[:,0:trainSetNP.shape[1]-1]     #訓練數據x1,x2
16         labels = trainSetNP[:,trainSetNP.shape[1]-1]          #訓練數據所對應的所屬類型Y
17         return trainData, labels
18 
19     def classify(self, trainData, labels, features):
20         labels = list(labels)    #轉換為list類型
21         #求先驗概率
22         P_y = {}
23         for label in labels:
24             P_y[label] = (labels.count(label) + self.A) / float(len(labels) + self.K*self.A)
25 
26         #求條件概率
27         P = {}
28         for y in P_y.keys():
29             y_index = [i for i, label in enumerate(labels) if label == y]   # y在labels中的所有下標
30             y_count = labels.count(y)     # y在labels中出現的次數
31             for j in range(len(features)):
32                 pkey = str(features[j]) + '|' + str(y)
33                 x_index = [i for i, x in enumerate(trainData[:,j]) if x == features[j]]   # x在trainData[:,j]中的所有下標
34                 xy_count = len(set(x_index) & set(y_index))   #x y同時出現的次數
35                 P[pkey] = (xy_count + self.A) / float(y_count + self.S*self.A)   #條件概率
36 
37         #features所屬類
38         F = {}
39         for y in P_y.keys():
40             F[y] = P_y[y]
41             for x in features:
42                 F[y] = F[y] * P[str(x)+'|'+str(y)]
43 
44         features_y = max(F, key=F.get)   #概率最大值對應的類別
45         return features_y
46 
47 
48 if __name__ == '__main__':
49     nb = NavieBayesB()
50     # 訓練數據
51     trainData, labels = nb.getTrainSet()
52     # x1,x2
53     features = [2,'S']
54     # 該特征應屬於哪一類
55     result = nb.classify(trainData, labels, features)
56     print features,'屬於',result

 

 

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM