当前位置:文档之家› 朴素贝叶斯分类算法及其MapReduce实现

朴素贝叶斯分类算法及其MapReduce实现

最近发现很多公司招聘数据挖掘的职位都提到贝叶斯分类,其实我不太清楚他们是要求理解贝叶斯分类算法,还是要求只需要通过工具(SPSS,SAS,Mahout)使用贝叶斯分类算法进行分类。

反正不管是需求什么都最好是了解其原理,才能知其然,还知其所以然。

我尽量简单的描述贝叶斯定义和分类算法,复杂而有全面的描述参考“数据挖掘:概念与技术”。

贝叶斯是一个人,叫(Thomas Bayes),下面这哥们就是。

本文介绍了贝叶斯定理,朴素贝叶斯分类算法及其使用MapReduce实现。

贝叶斯定理
首先了解下贝叶斯定理
P X H P(H)
P H X=
是不是有感觉都是符号看起来真复杂,我们根据下图理解贝叶斯定理。

这里D是所有顾客(全集),H是购买H商品的顾客,X是购买X商品的顾客。

自然X∩H是即购买X又购买H的顾客。

P(X) 指先验概率,指所有顾客中购买X的概率。

同理P(H)指的是所有顾客中购买H 的概率,见下式。

X
P X=
H
P H=
P(H|X) 指后验概率,在购买X商品的顾客,购买H的概率。

同理P(X|H)指的是购买H商品的顾客购买X的概率,见下式。

X∩H
P H|X=
X∩H
P X|H=
将这些公式带入上面贝叶斯定理自然就成立了。

朴素贝叶斯分类
分类算法有很多,基本上决策树,贝叶斯分类和神经网络是齐名的。

朴素贝叶斯分类假定一个属性值对给定分类的影响独立于其他属性值。

描述:
这里有个例子假定我们有一个顾客X(age = middle,income=high,sex =man):∙年龄(age)取值可以是:小(young),中(middle),大(old)
∙收入(income)取值可以是:低(low),中(average),高(high)
∙性别(sex)取值可以是:男(man),女(woman)
其选择电脑颜色的分类标号H:白色(white),蓝色(blue),粉色(pink)
问题:
用朴素贝叶斯分类法预测顾客X,选择哪个颜色的分类标号,也就是预测X属于具有最高后验概率的分类。

解答:
Step 1
也就是说我们要分别计算X选择分类标号为白色(white),蓝色(blue),粉色(pink)的后验概率,然后进行比较取其中最大值。

根据贝叶斯定理
P H white X=P X H white P(H white)
P(X)
同理
P H blue X=P X H blue P(H blue)
P(X)
P H pink X=P X H pink P(H pink)
P(X)
Step 2
其中P(X)为常数。

D为全集元组数,H white,D为全集中分类标号为white的元组数。

P H white=H white,D
D
同理
P H blue=H blue,D D
P H pink=H pink,D D
Step 3
那么只需计算P X H white就可以了。

P X H blue,P X H pink同理就不在进行阐述。

对于许多属性的集,P X H white有可能是缺失的,对于多个X的计算开销可能非
常大,那么根据朴素贝叶斯分类假定一个属性值对给定类的影响独立于其他属性值。

P X H white
=P x1H white
3
k=1
=P x age=middle H white×P x income=high H white×P x sex=man H white 可以很容易的由训练元组得出:
P x age=middle H white
P x income=high H white
P x sex=man H white
Step 4
P H white X,,P H blue X,,P H pink X后验概率中最大的,那么它的分类标号就是X的分类标号。

改进
1,目前X(年龄 = 中,收入 = 高,性别 = 男)中的属性都是分类属性,而不是连续值属性,我们要处理连续值属性可以使用如下方法:
P x age=middle H white
=g x age=middle,μwhite,σwhite
=1
2πσ

(x−μ)2
2σ2
连续值属性x age=middle服从均值为μ,标准差为σ的高斯分布。

2,如果遇到零概率值怎么办?比如在训练元组中P x sex=man H white为零,可以使用拉普拉斯校准的方法避免该问题。

朴素贝叶斯分类的MapReduce实现
我们通过MapReduce计算X(age = middle,income=high,sex =man)的分类标号。

根据上面的推导,P(X)为常数只需计算P X H white P(H white),P X H blue P(H blue),
P X H pink P(H pink)最大值即可。

源文件为
old:low:man:blue
middle:high:man:white
old:low:man:blue
yonng:high:woman:white
young:low:woman:pink
那么如何使用一次MapReduce就计算出P(H white),P x age H white,
P x income H white,P x sex H white等等
MapClass为
public static class MapClass extends MapReduceBase
implements Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException {
String line = 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为:
public static class Reduce extends MapReduceBase
implements Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
计算结果为:
SUM 5
blue 2
high-white 2
low-blue 2
low-pink 1
man-blue 2
man-white 1
middle-white 1
old-blue 2
pink 1
white 2
woman-pink 1
woman-white 1
yonng-white 1
young-pink 1
根据朴素贝叶斯分类法那么有
P X H white P H white
=P x age=middle H white×P x income=high H white×P x sex=man H white×P H white
=1
×
2
×
1
×
2 =
1
同理
P X H blue P H blue=0
P X H pink P H pink=0
我们分类选择White。

这里只是举例子,所以数据元组很少出现概率为零的可能比较大,元组多时会有改善,或者使用拉普拉斯校准的方法尽量避免出现概率为零的问题。

相关主题