朴素贝叶斯算法--python实现
朴素贝叶斯算法要理解一下基础: 【朴素:特征条件独立 贝叶斯:基于贝叶斯定理】
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