勤政贝叶斯算法,机器学习之朴素贝叶斯法

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

  转载请表明出处: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,那是称呼拉普Russ平滑(Laplace
smoothing)。明显,对别的图片 69,有

    图片 70

    图片 71

申明式(4.10)确为一种可能率遍及。同样,先验可能率的贝叶斯臆度是

    图片 72

 

  朴素贝叶斯分类有一个范围条件,正是特色属性必需有规范化独立或骨干独立(实际上在切切实实应用中大概不或者成功一心独立)。

  优点

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

    2、对小圈圈的数额显现很好,能个管理多分类职责,适合增量式磨炼,特别是数据量超出内部存款和储蓄器时,大家能够一群批的去增量训练。

    3、对缺点和失误数据不太敏感,算法也相比简单,常用来文书分类。

  缺点

    1、理论上,朴素贝叶斯模型与任何分类方法相比较有着最小的测量误差率。可是事实上实际不是总是那样,那是因为节俭贝叶斯模型假诺属性之间互相独立,那一个只要在实际上利用中每每是不创设的,在品质个数非常多如故性质之间相关性相当的大时,分类功用不佳。而在性质相关性较时辰,朴素贝叶斯品质最棒神奇。对于这点,有半朴素贝叶斯之类的算法通过思量部分关联性适度改进。

    2、需求掌握先验可能率,且先验可能率非常多时候取决于假如,借使的模型可以有不计其数种,由此在有个别时候会由于假如的先验模型的来头促成预测效果倒霉。

    3、由于大家是透过先验和多少来决定后验的可能率从而调整分类,所以分类核定期存款在必然的错误率。对输入数据的表明方式很机智。

 

相关文章

admin

网站地图xml地图