省吃俭用贝叶斯算法–python实现。机器上之省贝叶斯法。

厉行节约贝叶斯算法要了解一下基础:    【朴素:特征条件独立  
贝叶斯:基于贝叶斯定理】

  转载请注明出处:http://www.cnblogs.com/Peyton-Li/

1节能贝叶斯的定义【联合概率分布、先验概率、规则概率**、全概率公式】【条件独立性假设、】
  极大似然估计

  朴素贝叶斯法是机械上型中一个比较简单的模子,实现简单,比较常用。

2优缺点    

  大红鹰葡京会娱乐 1凡概念在输入空间大红鹰葡京会娱乐 2直达的自由向量,大红鹰葡京会娱乐 3大凡概念在出口空间大红鹰葡京会娱乐 4达成的随机变量。大红鹰葡京会娱乐 5大红鹰葡京会娱乐 6大红鹰葡京会娱乐 7的联名概率分布。训练数据集大红鹰葡京会娱乐 8大红鹰葡京会娱乐 9单独和分布有。

【优点:
分类效率稳定;对少失数据不敏感,算法比较简单,常用来文本分类;在性质相关性较小时,该算法性能最好
 
 缺点:假设属性之间彼此独立;先验概率多在假设;对输入数据的表达形式很机灵】

  朴素贝叶斯法通过训练多少集上共同概率分布大红鹰葡京会娱乐 10。具体地,学习一下先验概率分布与原则概率分布。

3先验概率、后验概率

  先验概率分布大红鹰葡京会娱乐 11,条件概率分布大红鹰葡京会娱乐 12大红鹰葡京会娱乐 13,于是上到共同概率分布大红鹰葡京会娱乐 14

先验概率的计量比较简单,没有动用贝叶斯公式;

  条件概率分布大红鹰葡京会娱乐 15生指数级数量的参数,其估价实际是不可行的。事实上,假设大红鹰葡京会娱乐 16然取值有大红鹰葡京会娱乐 17个,大红鹰葡京会娱乐 18大红鹰葡京会娱乐 19然取值有大红鹰葡京会娱乐 20只,那么参数个数为大红鹰葡京会娱乐 21

下验概率的计量,要运用贝叶斯公式,而且于应用样本资料计算逻辑概率时,还要以理论概率分布,需要重多的数理统计知识。

  朴素贝叶斯法对极概率分布作了标准化独立性的假设。由于当时是一个较强之若,朴素贝叶斯法也由此得名。具体的,条件独立性假设是

4勤俭贝叶斯的参数估计:

    大红鹰葡京会娱乐 22

①巨大似然估计(可能出现概率为0的景)②贝叶斯估价(加入常数,拉普拉斯平)

              大红鹰葡京会娱乐 23      (4.3)

 

  朴素贝叶斯法实际上学习及变化数据的体制,所以属于生成模型。条件独立设等于是说用于分类的特色于看似规定的格下都是规则独立的。这同借要朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。

参考

  朴素贝叶斯法分类时,对加的输入大红鹰葡京会娱乐 24,通过上得的模子测算后验概率分布大红鹰葡京会娱乐 25,将继验概率最深之近乎作为大红鹰葡京会娱乐 26的接近输出。后验概率计算根据贝叶斯定理进行:

使得您明白啥是节能贝叶斯分类器  
 有助于了解朴素贝叶斯算法

    大红鹰葡京会娱乐 27    (4.4)

《统计上方法》-朴素贝叶斯法笔记和python源码 
   理论总结得死咸*   

将式(4.3)带入(4.4)有

 

    大红鹰葡京会娱乐 28    (4.5)

前提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

    大红鹰葡京会娱乐 29    (4.6)

 

小心到,在式(4.6)中分母对具有大红鹰葡京会娱乐 30还是一样的,所以,

#朴素贝叶斯算法   贝叶斯估计, λ=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

    大红鹰葡京会娱乐 31    (4.7)

 

  朴素贝叶斯法将实例分及后验概率最特别之好像中。这等于价于期望风险最小化。假设选择0-1损失函数:

 

    大红鹰葡京会娱乐 32

 

式中大红鹰葡京会娱乐 33是分类决策函数。这时,期望风险函数为

 

    大红鹰葡京会娱乐 34

 

望是本着伙同分布大红鹰葡京会娱乐 35获取的。由此得到条件期望

    大红鹰葡京会娱乐 36

以要梦想风险最小化,只需要对大红鹰葡京会娱乐 37次第极小化,由此赢得:

    大红鹰葡京会娱乐 38

      大红鹰葡京会娱乐 39

      大红鹰葡京会娱乐 40

      大红鹰葡京会娱乐 41

这样一来,根据期望风险最小化准则就是抱了后验概率最大化准则:

      大红鹰葡京会娱乐 42    (4.8)

哪怕朴素贝叶斯法所运用的规律。(注意用4.7式和4.8式对比)

 

  于节俭贝叶斯法中,学习意味着估计大红鹰葡京会娱乐 43大红鹰葡京会娱乐 44。可以采用极大似然估计法估计相应的几率。先验概率大红鹰葡京会娱乐 45的大幅度似然估计是

      大红鹰葡京会娱乐 46

 

设第大红鹰葡京会娱乐 47个特征大红鹰葡京会娱乐 48恐怕取值的成团为大红鹰葡京会娱乐 49,条件概率大红鹰葡京会娱乐 50的庞似然估计是

      大红鹰葡京会娱乐 51

      大红鹰葡京会娱乐 52

式中,大红鹰葡京会娱乐 53是第大红鹰葡京会娱乐 54单样本的次序大红鹰葡京会娱乐 55个特征;大红鹰葡京会娱乐 56是第大红鹰葡京会娱乐 57只特点可能赢得之次第大红鹰葡京会娱乐 58个值;大红鹰葡京会娱乐 59否指示函数。

于给定的实例大红鹰葡京会娱乐 60,计算

    大红鹰葡京会娱乐 61

确定实例大红鹰葡京会娱乐 62的类

    大红鹰葡京会娱乐 63

 

从而高大似然估计可能会见冒出所而估算的概率值为0的景象。这是会影响至后验概率的计结果,使分类产生偏差。解决就同题材的方法是下贝叶斯估计。具体地,条件概率的贝叶斯估计是

    大红鹰葡京会娱乐 64      (4.10)

式中大红鹰葡京会娱乐 65。等价于在随机变量各个取值的频数大红鹰葡京会娱乐上施一个正数大红鹰葡京会娱乐 66。当大红鹰葡京会娱乐 67常常便是高大似然估计。常获大红鹰葡京会娱乐 68,这是叫拉普拉斯平(Laplace
smoothing)。显然,对其它大红鹰葡京会娱乐 69,有

    大红鹰葡京会娱乐 70

    大红鹰葡京会娱乐 71

表明式(4.10)确也平种植概率分布。同样,先验概率的贝叶斯估计是

    大红鹰葡京会娱乐 72

 

  朴素贝叶斯分类有一个范围标准,就是特色性必须出规则独立或者基本独立(实际上在切实应用中几不可能毕其功于一役了独立)。

  优点

    1、朴素贝叶斯模型发源于古典数学理论,有安定的分类效率。

    2、对小范围之数码显现好好,能独处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可一批批的错过增量训练。

    3、对缺乏失数据未绝灵敏,算法也比较简单,常用于文书分类。

  缺点

    1、理论及,朴素贝叶斯模型与其它分类方法相比有极其小之误差率。但是实际并非总是如此,这是为节俭贝叶斯模型如果属性之间交互独立,这个只要以实际上用被反复是免立之,在性质个数较多还是性质之间相关性较充分时,分类效果不好。而以性相关性较小时,朴素贝叶斯性能最精彩。对于这或多或少,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改善。

    2、需要掌握先验概率,且先验概率很多时候在假设,假设的型可以发广大种,因此于少数时段会出于要的先验模型的原委致预测效果不漂亮。

    3、由于我们是由此先验和数量来决定后验的几率从而决定分类,所以分类核定是必然之错误率。对输入数据的表达形式很聪明伶俐。

 

admin

网站地图xml地图