[编程]-机器学习-SVM

Posted 乔峰编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[编程]-机器学习-SVM相关的知识,希望对你有一定的参考价值。

*** SVM还值得学吗?*** 概要...*** 分3种情况:...*** 硬间隔...*** 软间隔...

*** svm还值得学吗?

svm有着优美的数学理论(拉格朗日对偶、凸优化等),也有优雅的实际应用,虽然完全用svm的场景不是很多了,但也是值得爱美之人学习的。


svm也是面试常问到的。


*** 概要

SVM 是一种二类分类模型。它的基本思想是在特征空间中寻找间隔最大的分离超平面使数据得到高效的二分类


SVMs are sensitive to the feature scales,

对特征缩放敏感

看左图,两个画小圈的点,垂直距离10,大于水平距离4


*** 分3种情况:

当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;


当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;


当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。(用到核方法、核技巧时才是非线性的)


*** 硬间隔

硬间隔分类的局限:

>样本线性可分时才有效

>对异常值(oulier)很敏感


*** 软间隔

于是催生了软间隔:

既保证间隔尽量大,又尽量避免margin violation(即让在间隔中的实例尽量少,分错类的实例也尽量少)


SciKit-Learn中用C超参数来实现

C越小,间隔越大

过拟合时可以降低C



import numpy as npfrom sklearn import datasetsfrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.svm import LinearSVC
iris = datasets.load_iris()X = iris["data"][:, (2, 3)] # petal length, petal widthy = (iris["target"] == 2).astype(np.float64) # Iris-Virginicasvm_clf = Pipeline(( ("scaler", StandardScaler()), ("linear_svc", LinearSVC(C=1, loss="hinge")), ))svm_clf.fit(X, y)#书中是svm_clf.fit(X_scaled, y), 但是X_scaled未定义svm_clf.predict(5.5, 1.7)


LinearSVC模型的问题是比较慢,特别是在训练集比较大时,故一般不推荐。


大训练集时更好的选择是随机梯度下降: SGDClassifier(loss="hinge",alpha=1/(m*C)).

SGDClassifier虽然收敛不如LinearSVC快,但是更适用于大训练集的核外训练,以及需要在线训练的情况。


以上是关于[编程]-机器学习-SVM的主要内容,如果未能解决你的问题,请参考以下文章

FPGA教程案例95机器学习2——基于FPGA的SVM支持向量机二分类系统实现之Verilog编程设计

机器学习:支持向量机SVM

机器学习SVM多分类问题及基于sklearn的Python代码实现

机器学习速成宝典模型篇08支持向量机SVM(附python代码)

stanford coursera 机器学习编程作业 exercise 6(支持向量机-support vector machines)

机器学习---支持向量机(SVM)