机器学习——朴素贝叶斯
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
运用场景
医生对病人进行诊断就是一个典型的分类过程,任何一个医生都无法直接看到病人的病情,只能观察病人表现出的症状和各种化验检测数据来推断病情,这时医生就 好比一个分类器,而这个医生诊断的准确率,与他当初受到的教育方式(构造方法)、病人的症状是否突出(待分类数据的特性)以及医生的经验多少(训练样本数 量)都有密切关系。
应用案例
数据:天气情况和每天是否踢足球的记录表
将上面数据转换成空间向量, 含义分别为是否去踢球,天气,温度,湿度,风速
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实现
运行结果:
运行结果与我们计算的一样不去踢球。
贝叶斯定理
已知某条件概率,如何得到两个事件交换后的概率,也就是在已知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))); } }
运行结果:
运行结果与我们计算的一样不去踢球。
相关文章推荐
- 华为Quidway交换机DHCP IP地址排除
- 使用Hystrix对Dubbo消费者提供线程隔离保护
- Scala学习记录-Scala入门资源
- 使用collections工具类实现斗地主中的洗牌和发牌过程
- Spring MVC @ModelAttribute
- a jni error has occurred
- TurboMail邮件系统资深技术支持杨工专访(二)
- jeesite文件上传使用笔记
- 下拉菜单(纯CSS完成)
- 变换菜单
- MYSQL迁移到PostgreSQL
- 定位元素
- 【自用】Android 改变Bitmap图片资源为指定大小
- Linux系统Nginx+Tomcat+Redis实现Session共享
- Linux系统Gradle构建工具安装
- Navicat中常用到的实用工具
- 详解 Navicat for MySQL 用户设计器
- laydate日期组件增加初始时间设置
- SMTP 发送内嵌图片 邮件
- 蜂窝教育iOS培训助我提升职业技能