Spark-Mllib中各分类算法的java实现(简易教程)

一.简述

  Spark是当下非常流行的数据分析框架,而其中的机器学习包Mllib也是其诸多亮点之一,相信很多人也像我那样想要快些上手spark。下面我将列出实现mllib分类的简明代码,代码中将简述训练集和样本集的结构,以及各分类算法的参数含义。分类模型包括朴素贝叶斯,SVM,决策树以及随机森林。

二.实现代码

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import java.util.LinkedList;
import java.util.List;

import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.mllib.regression.LabeledPoint;

import org.apache.spark.mllib.classification.NaiveBayes;
import org.apache.spark.mllib.classification.NaiveBayesModel;

import org.apache.spark.mllib.classification.SVMModel;
import org.apache.spark.mllib.classification.SVMWithSGD;

import java.util.HashMap;
import java.util.Map;
import org.apache.spark.mllib.tree.DecisionTree;
import org.apache.spark.mllib.tree.model.DecisionTreeModel;

import org.apache.spark.mllib.tree.RandomForest;
import org.apache.spark.mllib.tree.model.RandomForestModel;

public class test {
    public static void main(String[] arg){
       //生成spark对象
        SparkConf conf = new SparkConf();
        conf.set("spark.testing.memory","2147480000");  // spark的运行配置,意指占用内存2G
        JavaSparkContext sc = new JavaSparkContext("local[*]", "Spark", conf);      //第一个参数为本地模式,[*]尽可能地获取多的cpu;第二个是spark应用程序名,可以任意取;第三个为配置文件

        //训练集生成
        LabeledPoint pos = new LabeledPoint(1.0, Vectors.dense(2.0, 3.0, 3.0));//规定数据结构为LabeledPoint,1.0为类别标号,Vectors.dense(2.0, 3.0, 3.0)为特征向量
        LabeledPoint neg = new LabeledPoint(0.0, Vectors.sparse(3, new int[] {2, 1,1}, new double[] {1.0, 1.0,1.0}));//特征值稀疏时,利用sparse构建
       List l = new LinkedList();//利用List存放训练样本
        l.add(neg);
        l.add(pos);
        JavaRDD<LabeledPoint>training = sc.parallelize(l); //RDD化,泛化类型为LabeledPoint 而不是List
        final NaiveBayesModel nb_model = NaiveBayes.train(training.rdd());        

        //测试集生成
        double []  d = {1,1,2};
        Vector v =  Vectors.dense(d);//测试对象为单个vector,或者是RDD化后的vector

        //朴素贝叶斯
      System.out.println(nb_model.predict(v));// 分类结果
      System.out.println(nb_model.predictProbabilities(v)); // 计算概率值

      //支持向量机
      int numIterations = 100;//迭代次数
      final SVMModel svm_model = SVMWithSGD.train(training.rdd(), numIterations);//构建模型
      System.out.println(svm_model.predict(v));

      //决策树
      Integer numClasses = 2;//类别数量
      Map<Integer, Integer> categoricalFeaturesInfo = new HashMap();
      String impurity = "gini";//对于分类问题,我们可以用熵entropy或Gini来表示信息的无序程度 ,对于回归问题,我们用方差(Variance)来表示无序程度,方差越大,说明数据间差异越大
      Integer maxDepth = 5;//最大树深
      Integer maxBins = 32;//最大划分数
      final DecisionTreeModel tree_model = DecisionTree.trainClassifier(training, numClasses,categoricalFeaturesInfo, impurity, maxDepth, maxBins);//构建模型
      System.out.println("决策树分类结果:");
      System.out.println(tree_model.predict(v));

      //随机森林
      Integer numTrees = 3; // Use more in practice.
      String featureSubsetStrategy = "auto"; // Let the algorithm choose.
      Integer seed = 12345;
      // Train a RandomForest model.
      final RandomForestModel forest_model = RandomForest.trainRegressor(training,
        categoricalFeaturesInfo, numTrees, featureSubsetStrategy, impurity, maxDepth, maxBins, seed);//参数与决策数基本一致,除了seed
      System.out.println("随机森林结果:");
      System.out.println(forest_model.predict(v));
    }
  }

三.注意

1.利用spark进行数据分析时,数据一般要转化为RDD(利用spark所提供接口读取外部文件,一般会自动转化为RDD,通过MapReduce处理同样可以产生与接口匹配的训练集)

2.训练样本统一为标签向量(LabelPoint)。样本集为List,但是转化为RDD时,数据类型却为JavaRDD<LabeledPoint>(模型训练时,接口只接收数据类型为JavaRDD<LabeledPoint>)

3.分类predict返回结果为类别标签,贝叶斯模型可返回属于不同类的概率(python没用该接口)

时间: 2024-12-16 02:39:21

Spark-Mllib中各分类算法的java实现(简易教程)的相关文章

Spark MLlib中分类和回归算法

Spark MLlib中分类和回归算法: -分类算法: pyspark.mllib.classification -朴素贝叶斯 NaiveBayes -支持向量机(优化:随机梯度下降)SVMWithSGD -逻辑回归  LogisticRegressionWithSGD // 从Spark 2.0开始,官方推荐使用BFGS方式优化LR算法 LogisticRegressionWithBFGS // 针对流式数据实时模型训练算法 StreamingLogisticRegressionWithSGD

Spark MLlib Linear Regression线性回归算法

1.Spark MLlib Linear Regression线性回归算法 1.1 线性回归算法 1.1.1 基础理论 在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合. 回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析.如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间

Apache Spark源码走读之22 -- Spark MLLib中拟牛顿法L-BFGS的源码实现

欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就拟牛顿法L-BFGS的由来做一个简要的回顾,然后就其在spark mllib中的实现进行源码走读. 拟牛顿法 数学原理 代码实现 L-BFGS算法中使用到的正则化方法是SquaredL2Updater. 算法实现上使用到了由scalanlp的成员项目breeze库中的BreezeLBFGS函数,mllib中自定义了BreezeLBFGS所需要的DiffFunctions. runLBFGS函数的源码实现如下 def runLBFGS( data:

孙其功陪你学之——Spark MLlib之K-Means聚类算法

看到 程序员的自我修养 – SelfUp.cn 里面有Spark MLlib之K-Means聚类算法. 但是是java 语言的,于是我按照例程用Scala写了一个,分享在此. 由于在学习 spark mllib 但是如此详细的资料真的很难找,在此分享. 测试数据 0.0 0.0 0.0 0.1 0.1 0.1 0.2 0.2 0.2 9.0 9.0 9.0 9.1 9.1 9.1 9.2 9.2 9.2 15.1 15.1 15.1 18.0 17.0 19.0 20.0 21.0 22.0 p

spark.mllib源代码阅读-优化算法1-Gradient

Spark中定义的损失函数及梯度,在看源代码之前,先回想一下机器学习中定义了哪些损失函数,毕竟梯度求解是为优化求解损失函数服务的. 监督学习问题是在如果空间F中选取模型f作为决策函数.对于给定的输入X,由f(X)给出对应的输出Y,这个输出的预測值f(X)与真实值Y可能一致也可能不一致,用一个损失函数(lossfunction)或代价函数(cost function)来度量预測错误的程度.损失函数是f(X)和Y的非负实值函数,记作L(Y, f(X)). 统计学习中经常使用的损失函数有下面几种: (

Spark MLlib之水塘抽样算法(Reservoir Sampling)

1.理解 问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行? 首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个行数,从而随机的取出一行,但是,当前的情况是不知道行数,这样如何求呢?我们需要一个概念来帮助我们做出猜想,来使得对每一行取出的概率相等,也即随机.这个概念即蓄水池抽样(Reservoir Sampling). 水塘抽样算法(Reservoir Sampling)思想: 在序列流中取一个数,如

面试中常见的算法之Java中的递归

1.方法定义中调用方法本身的现象2.递归注意实现 1) 要有出口,否则就是死递归 2) 次数不能太多,否则就内存溢出 3) 构造方法不能递归使用3.递归解决问题的思想和图解: 分解和合并[先分解后合并] 1. 常见的斐波那契数列 1,1,2,3,5,8,13,21,...特征: 从第三个数开始,每个数是前两个数的和. int count = 0; private int getFibo(int i) { if (i == 1 || i == 2) { count = count+1; Syste

Spark MLlib算法调用展示平台及其实现过程

1. 软件版本: IDE:Intellij IDEA 14,Java:1.7,Scala:2.10.6:Tomcat:7,CDH:5.8.0: Spark:1.6.0-cdh5.8.0-hadoop2.6.0-cdh5.8.0 : Hadoop:hadoop2.6.0-cdh5.8.0:(使用的是CDH提供的虚拟机) 2. 工程下载及部署: Scala封装Spark算法工程:https://github.com/fansy1990/Spark_MLlib_Algorithm_1.6.0.git

用Spark学习矩阵分解推荐算法

在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib中,推荐算法这块只实现了基于矩阵分解的协同过滤推荐算法.而基于的算法是FunkSVD算法,即将m个用户和n个物品对应的评分矩阵M分解为两个低维的矩阵:$$M_{m \times n}=P_{m \times k}^TQ_{k \times n}$$ 其中k为分解成低维的维数,一般远比m和n小.如果大