首页 > 技术文章 > [分类算法] :SVM支持向量机

skyEva 2016-06-27 15:53 原文

Support vector machines 支持向量机,简称SVM

  • 分类算法的目的是学会一个分类函数或者分类模型(分类器),能够把数据库中的数据项映射给定类别中的某一个,从而可以预测未知类别。
  • SVM是一种监督式学习的方法。
  • 支持向量:支持或支撑平面上把两类类别划分开来的超平面的向量点
  • 机:就是算法,机器学习常把一些算法看作是一个机器
  • SVM 其实就是一种很有用的二分类方法。
  • 超平面:

     n维空间中, 满足n元一次方程a1x1+a2x2+...+anxn=b的点(x1,x2,...,xn)的全体就叫空间的一张超平面(即广义平面)。

     具体到2维空间,就是一条直线,3维空间,就是一个平面。

 

原理概况:

  1. 线性可分:超平面分割(超平面是分割两类数据的最优的一个平面,下图的红线表示)

      

      2. 最大化间隔

      3. 线性问题求解:

      求解对偶问题得到最优解。(Lagrange 函数的对偶因子)

      4. 非线性问题

          

      通过选择一个核函数,将数据映射到高维空间(线性可分),从而来解决原有空间的线性不可分。

      核方法: 除了支持向量机外,任何把计算表示为数据点的内积的方法,都可以用核方法进行非线性扩展。

 

例子:

import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD}
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.spark.mllib.util.MLUtils

// Load training data in LIBSVM format.
val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")
// Split data into training (60%) and test (40%).
val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)
val training = splits(0).cache()
val test = splits(1)

// Run training algorithm to build the model
val numIterations = 100
val model = SVMWithSGD.train(training, numIterations)

// Clear the default threshold.
model.clearThreshold()

// Compute raw scores on the test set.
val scoreAndLabels = test.map { point =>
  val score = model.predict(point.features)
  (score, point.label)
}

// Get evaluation metrics.
val metrics = new BinaryClassificationMetrics(scoreAndLabels)
val auROC = metrics.areaUnderROC()
println("Area under ROC = " + auROC)

  

推荐阅读