spark算法實現——svm支持向量機
阿新 • • 發佈:2017-06-01
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.RDDimport 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支持向量機