朴素貝葉斯算法要理解一下基礎: 【朴素:特征條件獨立 貝葉斯:基於貝葉斯定理】
1朴素貝葉斯的概念【聯合概率分布、先驗概率、
條件概率**、全概率公式】【條件獨立性假設、】 極大似然估計
2優缺點
【優點: 分類效率穩定;對缺失數據不敏感,算法比較簡單,常用於
文本分類;在屬性相關性較小時,該算法性能最好 缺點:假設屬性之間相互獨立;先驗概率多取決於假設;對輸入數據的表達形式很敏感】
3先驗概率、后驗概率
先驗概率的計算比較簡單,沒有使用貝葉斯公式;
而后驗概率的計算,要使用貝葉斯公式,而且在利用樣本資料計算邏輯概率時,還要使用理論概率分布,需要更多的數理統計知識。
4朴素貝葉斯的參數估計:
①極大似然估計(可能出現概率為0的情況)②貝葉斯估計(加入常數,拉普拉斯平滑)
參考:
教你明白啥是朴素貝葉斯分類器 有助於理解朴素貝葉斯算法
《統計學習方法》-朴素貝葉斯法筆記和python源碼 理論總結得很全*
前提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