1. 程式人生 > >spark算法實現——svm支持向量機

spark算法實現——svm支持向量機

res 維度 mllib 數據集 txt 轉換函數 svm map 線性

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

spark算法實現——svm支持向量機