spark算法实现——svm支持向量机

svm是一种分类算法,一般先分为两类,再向多类推广一生二,二生三,三生。。。

大致可分为:

线性可分支持向量机
 硬间隔最大化hard margin maximization
 硬间隔支持向量机
 线性支持向量机
 软间隔最大化soft margin maximization
 软间隔支持向量机
 非线性支持向量机
 核函数kernel function

基本概念:

分割超平面

设C和D为两不相交的凸集,则存在超平面P,
P可以将C和D分离。

 

线性可分支持向量机

SVM从线性可分情况下的最优分类面发展而来。最优分类面就是要求分类线不但能将两类正确分开(训练错误率为0),且使分类间隔最大

 给定线性可分训练数据集,通过
间隔最大化得到的分离超平面为
相应的分类决策函数
该决策函数称为线性可分支持向量机。
 φ(x)是某个确定的特征空间转换函数,它的作用是
将x映射到(更高的)维度。

 

线性支持向量机

分类线能将两类分开(训练错误率大于0,存在个别样本点分错),且使分类间隔最大

非线性支持向量机

存在非线性分割超平面,讲样本分开

 sparkmllib代码实现

package mllib

import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD}
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkContext, SparkConf}


//二分类
object SVMwithSGD {
    def main(args: Array[String]) {
        val conf = new SparkConf().setAppName("test").setMaster("local")
        val sc = new SparkContext(conf)
        val sql  = new SQLContext(sc);
        val data: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "svm.txt")
        val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)
        val training = splits(0).cache()
        val test = splits(1)
//        data.foreach( x => println(x.toString()))
//        data.foreach( x => println(x.label))
        data.foreach( x => println(x.features))
        val numIterations = 100
        val model: SVMModel = SVMWithSGD.train(training, numIterations)
        model.clearThreshold()//为了模型拿到评分 不是处理过之后的分类结果

        val scoreAndLabels: RDD[(Double, Double)] = test.map { point =>
//                大于0 小于0 两类
            val score = model.predict(point.features)
            (score, point.label)
        }
        scoreAndLabels.foreach(println)

    }

}

 

评分>0表示样本点在分割面之上,<0表示在分割面之下

posted @ 2017-06-01 11:41  亢奋的小马哥  阅读(2469)  评论(0编辑  收藏  举报