朴素贝叶斯算法--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

 

 

 
 
 

posted on 2017-08-15 13:52  一叶舟鸣  阅读(20797)  评论(1编辑  收藏  举报

导航