您的位置:首页 > 其它

机器学习——朴素贝叶斯

2016-05-13 00:00 169 查看
摘要: yesian算法是统计学的分类方法,它是一种利用概率统计知识进行分类的算法。在许多场合,朴素贝叶斯分类算法可以与决策树和神经网络分类算法想媲美,该算法能运用到大型数据库中,且方法简单,分类准确率高,速度快,这个算法是从贝叶斯定理的基础上发展而来的,贝叶斯定理假设不同属性值之间是不相关联的。但是现实说中的很多时候,这种假设是不成立的,从而导致该算法的准确性会有所下降。

贝叶斯定理

已知某条件概率,如何得到两个事件交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A)。
这里先解释什么是条件概率:
表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。
其基本求解公式为:



贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路。

下面直接给出贝叶斯定理:



例如:一座别墅在过去的 20 年里一共发生过 2 次被盗,别墅的主人有一条狗,狗平均每周晚上叫 3 次,在盗贼入侵时狗叫的概率被估计为 0.9,问题是:在狗叫的时候发生入侵的概率是多少?

我们假设 A 事件为狗在晚上叫,B 为盗贼入侵,则以天为单位统计,P(A) = 3/7,P(B) = 2/(20*365) = 2/7300,P(A|B) = 0.9,按照公式很容易得出结果:P(B|A) = 0.9*(2/7300) / (3/7) = 0.00058

运用场景

医生对病人进行诊断就是一个典型的分类过程,任何一个医生都无法直接看到病人的病情,只能观察病人表现出的症状和各种化验检测数据来推断病情,这时医生就 好比一个分类器,而这个医生诊断的准确率,与他当初受到的教育方式(构造方法)、病人的症状是否突出(待分类数据的特性)以及医生的经验多少(训练样本数 量)都有密切关系。

应用案例

数据:天气情况和每天是否踢足球的记录表

日期踢足球天气温度湿度风速
1号否(0)晴天(0)热(0)高(0)低(0)
2号否(0)晴天(0)热(0)高(0)高(1)
3号是(1)多云(1)热(0)高(0)低(0)
4号是(1)下雨(2)舒适(1)高(0)低(0)
5号是(1)下雨(2)凉爽(2)正常(1)低(0)
6号否(0)下雨(2)凉爽(2)正常(1)高(1)
7号是(1)多云(1)凉爽(2)正常(1)高(1)
8号否(0)晴天(0)舒适(1)高(0)低(0)
9号是(1)晴天(0)凉爽(2)正常(1)低(0)
10号是(1)下雨(2)舒适(1)正常(1)低(0)
11号是(1)晴天(0)舒适(1)正常(1)高(1)
12号是(1)多云(1)舒适(1)高(0)高(1)
13号是(1)多云(1)热(0)正常(1)低(0)
14号否(0)下雨(2)舒适(1)高(0)高(1)
15号晴天(0)凉爽(2)高(0)高(1)
将上面数据转换成空间向量, 含义分别为是否去踢球,天气,温度,湿度,风速

0,0 0 0 0
0,0 0 0 1
1,1 0 0 0
1,2 1 0 0
1,2 2 1 0
0,2 2 1 1
1,1 2 1 1
0,0 1 0 0
1,0 2 1 0
1,2 1 1 0
1,0 1 1 1
1,1 1 0 1
1,1 0 1 0
0,2 1 0 1

如果15号的天气为(晴天,凉爽,湿度高,风速高,预测他是否会踢足球)

计算过程

假设小明15号去踢球,踢球概率为:

P(踢)=9/14

P(晴天|踢)=2/9

P(凉爽|踢)=3/9

P(湿度高|踢)=3/9

P(风速高|踢)=3/9

P(踢)由踢的天数除以总天数得到,P(晴天|踢)为踢球的同事是晴天除以踢的天数得到,其他以此类推。

P(踢|晴天,凉爽,湿度高,风速高)=

P(踢)* P(晴天|踢)* P(凉爽|踢)* P(湿度高|踢) *P(风速高|踢)=

9/14*2/9*3/9*3/9*3/9=0.00529

假设小明15号不去踢球,概率为:

P(不踢)=5/14

P(晴天|不踢)=3/5

P(凉爽|不踢)=1/5

P(湿度高|不踢)=4/5

P(风速高|不踢)=3/5

P(不踢|晴天,凉爽,湿度高,风速高)=

P(不踢)* P(晴天|不踢)* P(凉爽|不踢)* P(湿度高|不踢) *P(风速高|不踢)=

5/14*3/5*1/5*4/5*3/5=0.02057

可以看到小明不去踢足球的概率比去踢足球的概率高。

贝叶斯的spark实现

object MyNaiveBayes {
def main(args: Array[String]) {
val conf=new SparkConf().setMaster("local").setAppName("myNaiveBayes")
val sc=new SparkContext(conf);
val data=sc.textFile("E:/sparkdata/naiveBayes.txt");
val parsedData=data.map{line =>
val parts=line.split(",")
LabeledPoint(parts(0).toDouble,Vectors.dense(parts(1).split(" ").map(_.toDouble)))};
// parsedData.foreach(println);
// 把数据的60%作为训练集,40%作为测试集.
val splits=parsedData.randomSplit(Array(0.6,0.4),11L);
// splits(1).foreach(println);
//获得训练模型,第一个参数为数据,第二个参数为平滑参数,默认为1,可改
val model=NaiveBayes.train(splits(0),lambda=1.0);
//对模型进行准确度分析
val predictionAndLlabel=splits(1).map(p => (model.predict(p.features),p.label));
// predictionAndLlabel.foreach(println);
val accuracy=1.0*predictionAndLlabel.filter(x =>x._1==x._2).count()/splits(1).count();
println("准确率:"+accuracy);
println("Predictionof (0.0, 2.0, 0.0, 1.0):"+model.predict(Vectors.dense(0.0, 2.0, 0.0, 1.0)));
}
}

运行结果:



运行结果与我们计算的一样不去踢球。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: