Spark MLlib 机器学习之SVM支持向量机算法

 支持向量机(support vector machine),简称SVM。简单来讲,它是一种二类分类模型,能够将不同类的样本在样本空间中进行分隔。其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

算法简介

SVM从线性可分情况下的最优分类面发展而来。最优分类面就是要求分类线不但能将两类正确分开,且使分类间隔最大。SVM的实质就是找出一个能将某个值最大化的超平面,这个值就是超平面离所有训练样本的最小距离。术语表示为“间隔”(margin)

Spark MLlib 机器学习之SVM支持向量机算法_第1张图片

 超平面可以用分类函数表示 ,在进行分类的时候,遇到一个新的数据点x,将x代入f(x) 中,如果f(x)小于0则将x的类别赋为-1,如果f(x)大于0则将x的类别赋为1。

实现步骤

  • 用数学定义要求解的问题

     SVM求一个平面S:y=,即求解参数w与b。如何判断w,b构成的平面最优为约束条件

  • 转化为二次凸函数+约束条件优化问题

     拉格朗日优化理论

  • 拉格朗日优化+对偶特性构建方程

      将w,b的优化转化为对参数alpha的优化(alpha是拉格朗日约束函数的参数)

  • SMO(最小序列优化算法)求解alpha的最优值

      =<>+b

对于新点的预测,只要计算它与训练数据点的内积即可。

注:MLlib SVM算法只能处理线性的情况

运行步骤

数据说明

数据格式为:标签 特征ID:特征值…

注:SVM中label的标签只能是{0,1}

代码说明

import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.log4j.{Level, Logger}
object svm {
  def main(args: Array[String]): Unit = {
    //创建Spark对象
    val conf=new SparkConf().setAppName("svm")
    val sc=new SparkContext(conf)
    //设置日志输出级别
    Logger.getRootLogger.setLevel(Level.WARN)
    //读取样本数据,格式为 libsvm
    val data = MLUtils.loadLibSVMFile(sc,"/home/hadoop/test/svm/sample_libsvm_data.txt")
    //样本数据划分为训练样本和测试样本
    val splits= data.randomSplit(Array(0.6,0.4), seed =11L)
    val training =splits(0).cache()
    val test=splits(1)
    //创建逻辑回归模型并训练
    val numIterations=100//迭代次数
    val model=SVMWithSGD.train(training,numIterations)
    //对测试样本进行测试
    val predictionAndLabel=test.map {point=>
      val score=model.predict(point.features)
          (score,point.label)
      }
    val print_predict=predictionAndLabel.take(20)
    // 打印输出结果
    println("prediction"+"\t"+"label")
    for (i<- 0 to print_predict.length - 1)
    {
      println(print_predict(i)._1+"\t"+print_predict(i)._2)
    }
    //误差计算
    val accuracy =1.0 *predictionAndLabel.filter(x => x._1 == x._2).count() / test.count()
    println("Area under Roc = "+accuracy)
    //保存模型
    val ModelPath="/home/hadoop/test/svm/svm_model"
    model.save(sc,ModelPath)
  }

}

 结果

Spark MLlib 机器学习之SVM支持向量机算法_第2张图片

你可能感兴趣的:(Spark,大数据)