SparkMLlibJava朴素贝叶斯分类算法(NaiveBayes)

更新时间:2023-06-10 06:22:31 阅读: 评论:0

SparkMLlibJava朴素贝叶斯分类算法(NaiveBayes)
朴素贝叶斯分类基本理解:
狮子男性格
朴素贝叶斯法是基于贝叶斯定理与特征条件独⽴假设的分类⽅法。简单来说,朴素贝叶斯分类器假设样本每个特征与其他特征都不相关。举个例⼦,如果⼀种⽔果具有红,圆,直径⼤概4英⼨等特征,该⽔果可以被判定为是苹果。尽管这些特征相互依赖或者有些特征由其他特征决定,然⽽朴素贝叶斯分类器认为这些属性在判定该⽔果是否为苹果的概率分布上独⽴的。尽管是带着这些朴素思想和过于简单化的假设,但朴素贝叶斯分类器在很多复杂的现实情形中仍能够取得相当好的效果。朴素贝叶斯分类器的⼀个优势在于只需要根据少量的训练数据估计出必要的参数(离散型变量是先验概率和类条件概率,连续型变量是变量的均值和⽅差)。
二战战役NaiveBayes具体场景及其原理可参考:
SparkMLlib Java程序所⽤数据:
训练数据:C:\
该数据,逗号前为⽬标向量,逗号后为特征向量(空格隔开)。
测试数据:C:\
该数据为特征向量,空格隔开。
SparkMLlib NaiveBayes Java程序:
package MLlibTest;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.mllib.classification.NaiveBayes;
import org.apache.spark.mllib.classification.NaiveBayesModel;
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.ssion.LabeledPoint;
加鸡腿
import scala.Tuple2;
public class NaiveBayesTest {
public static void main(String[] args) {
SparkConf conf = new SparkConf().tAppName("NaiveBayesTest").tMaster("local[*]");
JavaSparkContext jsc = new JavaSparkContext(conf);
//读取⽂件的每⼀⾏到RDD
JavaRDD<String> lines = File("C://hello//");
//对每⼀⾏进⾏拆分,封装成LabeledPoint
JavaRDD<LabeledPoint> data = lines.map(new Function<String, LabeledPoint>() {
JavaRDD<LabeledPoint> data = lines.map(new Function<String, LabeledPoint>() {
private static final long rialVersionUID = 1L;
@Override
public LabeledPoint call(String str) throws Exception {
String[] t1 = str.split(",");
String[] t2 = t1[1].split(" ");
LabeledPoint a = new LabeledPoint(Double.parDouble(t1[0]),
Vectors.den(Double.parDouble(t2[0]), Double.parDouble(t2[1]), Double.parDouble(t2[2])));    return a;
}
});
如何种香菜//将所有LabeledPoint,随机分成7:3的两个切⽚
//⼩数据做练习时,这⼀步也可免去,全部作为训练数据得到模型。
JavaRDD<LabeledPoint>[] splits = data.randomSplit(new double[] { 0.7, 0.3 }, 11L);
JavaRDD<LabeledPoint> traindata = splits[0];
JavaRDD<LabeledPoint> testdata = splits[1];
//朴素贝叶斯模型训练
final NaiveBayesModel model = ain(traindata.rdd(), 1.0, "multinomial");
//测试model,若未切分数据,可免去。
JavaPairRDD<Double, Double> predictionAndLabel = testdata
.mapToPair(new PairFunction<LabeledPoint, Double, Double>() {
private static final long rialVersionUID = 1L;
@Override
public Tuple2<Double, Double> call(LabeledPoint p) {
return new Tuple2<Double, Double>(model.predict(p.features()), p.label());
公开发行股票}
});
//由测试数据得到模型分类精度
double accuracy = predictionAndLabel.filter(new Function<Tuple2<Double, Double>, Boolean>() {
大学生平均工资private static final long rialVersionUID = 1L;
@Override
public Boolean call(Tuple2<Double, Double> pl) {
圆孔方木return pl._1().equals(pl._2());
}
}).count() / (double) unt();
System.out.println("模型精度为:"+accuracy);
/
维c作用/⽅案⼀:直接利⽤模型计算答案
JavaRDD<String> testData = File("C://hello//");
JavaPairRDD<String, Double> res = testData.mapToPair(new PairFunction<String, String, Double>() {  private static final long rialVersionUID = 1L;
@Override
public Tuple2<String,Double> call(String line) throws Exception{
String[] t2 = line.split(" ");
Vector v = Vectors.den(Double.parDouble(t2[0]), Double.parDouble(t2[1]),
Double.parDouble(t2[2]));
double res = model.predict(v);
return new Tuple2<String,Double>(line,res);
}
});
res.saveAsTextFile("C://hello//res");
//⽅案⼆:保存模型后,导⼊模型,再计算,计算代码与⽅案⼀完全相同。
model.save(jsc.sc(), "C://hello//BayesModel");
NaiveBayesModel sameModel = NaiveBayesModel.load(jsc.sc(), "C://hello//BayesModel");
//代码与⽅案⼀相同
}
}
}
结语:
做的时间匆忙,错误之处,请⼤家指出批评,相互学习。

本文发布于:2023-06-10 06:22:31,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/917328.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:特征   数据   模型   变量   训练
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图