最近发现很多公司招聘数据挖掘的职位都提到贝叶斯分类,其实我不太清楚他们是要求理解贝叶斯分类算法,还是要求只需要通过工具(SPSS,SAS,Mahout)使用贝叶斯分类算法进行分类。反正不管是需求什么都最好是了解其原理,才能知其然,还知其所以然。我尽量简单的描述贝叶斯定义和分类算法,复杂而有全面的描述参考“数据挖掘:概念与技术”。贝叶斯是一个人,叫(ThomasBayes),下面这哥们就是。本文介绍了贝叶斯定理,朴素贝叶斯分类算法及其使用MapReduce实现。贝叶斯定理首先了解下贝叶斯定理(|)(|)()()是不是有感觉都是符号看起来真复杂,我们根据下图理解贝叶斯定理。这里D是所有顾客(全集),H是购买H商品的顾客,X是购买X商品的顾客。自然是即购买X又购买H的顾客。P(X)指先验概率,指所有顾客中购买X的概率。同理P(H)指的是所有顾客中购买H的概率,见下式。()||||()||||P(H|X)指后验概率,在购买X商品的顾客,购买H的概率。同理P(X|H)指的是购买H商品的顾客购买X的概率,见下式。(|)||||(|)||||将这些公式带入上面贝叶斯定理自然就成立了。朴素贝叶斯分类分类算法有很多,基本上决策树,贝叶斯分类和神经网络是齐名的。朴素贝叶斯分类假定一个属性值对给定分类的影响独立于其他属性值。描述:这里有个例子假定我们有一个顾客X(age=middle,income=high,sex=man):年龄(age)取值可以是:小(young),中(middle),大(old)收入(income)取值可以是:低(low),中(average),高(high)性别(sex)取值可以是:男(man),女(woman)其选择电脑颜色的分类标号H:白色(white),蓝色(blue),粉色(pink)问题:用朴素贝叶斯分类法预测顾客X,选择哪个颜色的分类标号,也就是预测X属于具有最高后验概率的分类。解答:Step1也就是说我们要分别计算X选择分类标号为白色(white),蓝色(blue),粉色(pink)的后验概率,然后进行比较取其中最大值。根据贝叶斯定理(|)(|)()()同理(|)(|)()()(|)(|)()()Step2其中()为常数。||为全集元组数,||为全集中分类标号为white的元组数。()||||同理()||||()||||Step3那么只需计算(|)就可以了。(|),(|)同理就不在进行阐述。对于许多属性的集,(|)有可能是缺失的,对于多个X的计算开销可能非常大,那么根据朴素贝叶斯分类假定一个属性值对给定类的影响独立于其他属性值。(|)∏(|)(|)(|)(|)可以很容易的由训练元组得出:(|)(|)(|)Step4(|),(|),(|)后验概率中最大的,那么它的分类标号就是X的分类标号。改进1,目前X(年龄=中,收入=高,性别=男)中的属性都是分类属性,而不是连续值属性,我们要处理连续值属性可以使用如下方法:(|)()√()连续值属性服从均值为,标准差为的高斯分布。2,如果遇到零概率值怎么办?比如在训练元组中(|)为零,可以使用拉普拉斯校准的方法避免该问题。朴素贝叶斯分类的MapReduce实现我们通过MapReduce计算X(age=middle,income=high,sex=man)的分类标号。根据上面的推导,()为常数只需计算(|)(),(|)(),(|)()最大值即可。源文件为old:low:man:bluemiddle:high:man:whiteold:low:man:blueyonng:high:woman:whiteyoung:low:woman:pink那么如何使用一次MapReduce就计算出(),(|),(|),(|)等等MapClass为publicstaticclassMapClassextendsMapReduceBaseimplementsMapperLongWritable,Text,Text,IntWritable{privatefinalstaticIntWritableone=newIntWritable(1);privateTextword=newText();publicvoidmap(LongWritablekey,Textvalue,OutputCollectorText,IntWritableoutput,Reporterreporter)throwsIOException{Stringline=value.toString();String[]words=line.split(:);word.set(SUM);output.collect(word,one);word.set(words[3]);output.collect(word,one);word.set(words[0]+-+words[3]);output.collect(word,one);word.set(words[1]+-+words[3]);output.collect(word,one);word.set(words[2]+-+words[3]);output.collect(word,one);}}ReduceClass为:publicstaticclassReduceextendsMapReduceBaseimplementsReducerText,IntWritable,Text,IntWritable{publicvoidreduce(Textkey,IteratorIntWritablevalues,OutputCollectorText,IntWritableoutput,Reporterreporter)throwsIOException{intsum=0;while(values.hasNext()){sum+=values.next().get();}output.collect(key,newIntWritable(sum));}}计算结果为:SUM5blue2high-white2low-blue2low-pink1man-blue2man-white1middle-white1old-blue2pink1white2woman-pink1woman-white1yonng-white1young-pink1根据朴素贝叶斯分类法那么有(|)()(|)(|)(|)()同理(|)()(|)()我们分类选择White。这里只是举例子,所以数据元组很少出现概率为零的可能比较大,元组多时会有改善,或者使用拉普拉斯校准的方法尽量避免出现概率为零的问题。