[分类算法] :SVM支持向量机

时间:2022-08-12 15:10:26

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

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

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

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

原理概况:

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

[分类算法] :SVM支持向量机

  2. 最大化间隔

  3. 线性问题求解:

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

4. 非线性问题

          [分类算法] :SVM支持向量机

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

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

例子:

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)