Spark 实现 朴素贝叶斯(naiveBayes)


输入数据说明

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

日期 踢足球 天气 温度 湿度 风速
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)



数据抽象为如下,含义为是否会去踢球,天气,温度,湿度,风速
 

如果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

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


流程图



 

 

代码:
 
import org.apache.spark.mllib.classification.NaiveBayes
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.{SparkContext,SparkConf}

/**
* Created by yuejianjun on 16/5/18.
*/
object NaiveBayesExample1 {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("NaiveBayesExample1").setMaster("local")
val sc =new SparkContext(conf)

//读入数据
val data = sc.textFile("/user/spark/sparkApp/src/main/resources/MLFile/tmp_naive_bayes/naive_bayes_data.txt")

val parsedData =data.map { line =>
val parts =line.split(',')
LabeledPoint(parts(0).toDouble,Vectors.dense(parts(1).split(' ').map(_.toDouble)))
}
// 把数据的60%作为训练集,40%作为测试集.
val splits = parsedData.randomSplit(Array(0.6,0.4),seed = 11L)
val training =splits(0)
val test =splits(1)


//获得训练模型,第一个参数为数据,第二个参数为平滑参数,默认为1,可改
val model =NaiveBayes.train(training,lambda = 1.0)

//对模型进行准确度分析
val predictionAndLabel= test.map(p => (model.predict(p.features),p.label))
val accuracy =1.0 *predictionAndLabel.filter(x => x._1 == x._2).count() / test.count()

println("accuracy-->"+accuracy)
println("Predictionof (0.0, 2.0, 0.0, 1.0):"+model.predict(Vectors.dense(0.0,2.0,0.0,1.0)))
}
}
 

输出结果说明:   

accuracy-->0.42857142857142855
 准确度为42%,这里是因为测试集数据量比较小的原因,所以偏差较大。


Predictionof (0.0, 2.0, 0.0, 1.0):0.0

可以从结果看到对15号的预测为不会踢球,和我们数学计算的结果一致。

 

转:http://www.aboutyun.com/thread-12853-1-1.html

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM