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表示在分割面之下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM