首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

朴素贝叶斯

【简介】

朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。和决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier,或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响(来自百度百科)。

【概念】

朴素贝叶斯公式:P( Category | Document) = P ( Document | Category ) * P( Category) / P(Document)

假设a1,a2,a3..........an互斥且构成一个完全事件,已知它们的概率P(ai),i=1,2,…,n,现观察到某事件A与a1,a2,a3..........an相伴随机出现,且已知条件概率P(A/ai),求P(ai/A)。即:已知某条件概率P(A|B),其交换事件P(B|A) = P(A|B)P(B)/P(A)

【注:P(A|B)表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。其基本求解公式为:P(A|B)=P(AB)/P(B)】

对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。所以程序里主要的工作就是计算出各个条件概率。

【阶段】

整个朴素贝叶斯分类分为三个阶段:

①准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。

②分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。

③应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。

【代码】

#coding=utf-8fromnumpyimport*#初始化数据#DataList 多条样例数据#DataClass 数据对应的分类defInitData(): DataList=[['data8'], ['data1','data2','data3','data4'], ['data1','data2','data5','data6'], ['data1','data2','data4','data6'], ['data8','data9'], ['data7','data8'], ['data1','data2'], ['data-invalid']] DataClass= [1,1,2,1,2,1,2,0]returnDataList,DataClass#去除重复数据#UniqueSet 无重复的数据集defUniqueSet(DataSet): UniqueSet=set([])foriinDataSet: UniqueSet= UniqueSet | set(i)#set并returnlist(UniqueSet)#数据状态压缩#InputData 输入数据#DataSet 数据集#ModelType 模型类别 1:只考虑存不存在 2:考虑出现次数……#CountArr 数据状态数组defGetCountArr(InputData,DataSet,ModelType): CountArr= [0] *len(DataSet)foriinInputData:ifiinDataSet:ifModelType == 1: CountArr[DataSet.index(i)]= 1else: CountArr[DataSet.index(i)]+= 1else:print(i,'is Invalid data')returnarray(CountArr)#朴素贝叶斯分类器#CountArrList 数据状态集#DataClass 数据类别#p1 p1概率自然对数#p2 p2概率自然对数#p1_ratio 数据集p1占比#p2_ratio 数据集p2占比#p1Num 数据集影响p1的数量#p2Num 数据集影响p2的数量defNBM_Classifier(CountArrList,DataClass): ListLen=len(CountArrList) WordsLen=len(CountArrList[0]) p1_ratio= (sum(DataClass==1))/float(ListLen) p2_ratio= (sum(DataClass==2))/float(ListLen)#某分类下某词项出现频次为0时,其概率也是0,#因此在计算p(w0|ci)p(w1|ci)p(w2|ci)......p(wN|ci)会因为其中某个的概率为0而全部是0。#为了避免这样的情况发生,我们将所有词项出现的频次都初始化为1,某类所有词项数量初始化为2。p1Num =ones(WordsLen) p2Num=ones(WordsLen) p1Denom= 2.0p2Denom= 2.0foriinrange(ListLen):ifDataClass[i] == 1: p1Num+=CountArrList[i] p1Denom+=sum(CountArrList[i])elifDataClass[i] == 2: p2Num+=CountArrList[i] p2Denom+=sum(CountArrList[i])#由于p(w0|ci)p(w1|ci)p(w2|ci)......p(wN|ci)中每个因子都很小#所有因子相乘,特别是因子数量多的时候,会导致结果溢出,从而得到错误的数据#为了避免溢出问题的发生,使用求自然对数的方法#自然对数和原本的数值同增同减,不会有任何损失,因此不会影响求得的概率结果。print(p1Num/p1Denom)print(p2Num/p2Denom) p1= log(p1Num/p1Denom) p2= log(p2Num/p2Denom)returnp1,p2,p1_ratio,p2_ratio,p1Num-1,p2Num-1#获取数据类别#CountArr 数据状态数组#p1 p1概率自然对数#p2 p2概率自然对数#p1_ratio 数据集p1占比#p2_ratio 数据集p2占比#p1Num 数据集影响p1的数量#p2Num 数据集影响p2的数量defGetDataClass(CountArr, p1, p2, p1_ratio,p2_ratio,p1Num,p2Num):#无效数据:该数据没有影响过p1和p2ifsum(CountArr*p1Num) == 0andsum(CountArr*p2Num) ==0:return-1#数学公式:ln(a*b)=ln(a) +ln(b)is_p1 = sum(CountArr * p1) +log(p1_ratio) is_p2= sum(CountArr * p2) +log(p2_ratio)ifis_p1 >is_p2:return1else:return2defTest(): DataList,DataClass=InitData() UniqueDataList=UniqueSet(DataList) ModelType= 1CountArrList=[]forInputDatainDataList: CountArrList.append(GetCountArr(InputData,UniqueDataList,ModelType)) p1, p2, p1_ratio,p2_ratio,p1Num,p2Num=NBM_Classifier(array(CountArrList),array(DataClass)) TestData=[['data-invalid','data0'], ['data1','data2','data3','data5'], ['data4','data6'], ['data8'], ['data7','data8','data0']]forInputDatainTestData: CountArr=GetCountArr(InputData,UniqueDataList,ModelType)print(InputData,'is class',GetDataClass(CountArr,p1,p2,p1_ratio,p2_ratio,p1Num,p2Num)) Test()

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180410G1S81900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券