文章目录

    • 1. 线性支持向量机分类
    • 2. 非线性支持向量机分类
      • 2.1 多项式核
      • 2.2 高斯 RBF 核
    • 3. 支持向量机回归
    • 4. 原理

本文为《机器学习实战:基于Scikit-Learn和TensorFlow》的读书笔记。
中文翻译参考

SVM 特别适合应用于复杂但中小规模数据集的分类问题。

可参考:《统计学习方法》支持向量机(Support Vector Machines,SVM) 笔记

1. 线性支持向量机分类

  • 硬间隔最大化:数据必须线性可分,间隔内无数据点
  • 软件间隔最大化:允许部分点在间隔内,甚至越过分类线,使用超参数 c 控制
    较小的 c:惩罚小,间隔更大,较大的 c:惩罚大,间隔小

如果 SVM 模型过拟合,可以尝试通过减小超参数C去调整

SVM 对特征缩放比较敏感

2. 非线性支持向量机分类

很多时候,数据是线性不可分的,我们可以增加特征,下图左侧数据线性不可分,增加 x2 项以后就可分了

import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC
from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
import numpy as npX, y = make_moons(n_samples=100, noise=0.15, random_state=1)
def plot_dataset(X, y, axes):plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bs")plt.plot(X[:, 0][y==1], X[:, 1][y==1], "g^")plt.axis(axes)plt.grid(True, which='both')plt.xlabel(r"$x_1$", fontsize=20)plt.ylabel(r"$x_2$", fontsize=20, rotation=0)plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
plt.show()

ploynomial_svm_clf = Pipeline((("ploy_features",PolynomialFeatures(degree=3)),("scaler",StandardScaler()),("svm_clf",LinearSVC(C=10, loss="hinge"))
))ploynomial_svm_clf.fit(X,y)
def plot_predictions(clf, axes):x0s = np.linspace(axes[0], axes[1], 100)x1s = np.linspace(axes[2], axes[3], 100)x0, x1 = np.meshgrid(x0s, x1s)X = np.c_[x0.ravel(), x1.ravel()]y_pred = clf.predict(X).reshape(x0.shape)y_decision = clf.decision_function(X).reshape(x0.shape) # 样本点到分割超平面的函数距离plt.contourf(x0, x1, y_pred, cmap=plt.cm.brg, alpha=0.2)plt.contourf(x0, x1, y_decision, cmap=plt.cm.brg, alpha=0.1)plot_predictions(ploynomial_svm_clf, [-1.5, 2.5, -1, 1.5])
plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])# save_fig("moons_polynomial_svc_plot")
plt.show()

2.1 多项式核

  • 添加多项式特征,产生了大量的特征,使模型变慢
  • 使用核技巧,可以取得同等的效果,同时没有特征组合爆炸
from sklearn.svm import SVCpoly_kernel_svm_clf = Pipeline([("scaler", StandardScaler()),("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))])
poly_kernel_svm_clf.fit(X, y)poly100_kernel_svm_clf = Pipeline([("scaler", StandardScaler()),("svm_clf", SVC(kernel="poly", degree=10, coef0=100, C=5))])
poly100_kernel_svm_clf.fit(X, y)plt.figure(figsize=(11, 4))
plt.subplot(121)
plot_predictions(poly_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
plt.title(r"$d=3, r=1, C=5$", fontsize=18)
plt.subplot(122)
plot_predictions(poly100_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
plt.title(r"$d=10, r=100, C=5$", fontsize=18)# save_fig("moons_kernelized_polynomial_svc_plot")
plt.show()

  • 如果模型过拟合,可以减小多项式核的阶数,欠拟合则增大阶数
  • 超参数 coef0 控制高阶多项式与低阶多项式对模型的影响

2.2 高斯 RBF 核

gamma1, gamma2 = 0.1, 5
C1, C2 = 0.001, 1000
hyperparams = (gamma1, C1), (gamma1, C2), (gamma2, C1), (gamma2, C2)svm_clfs = []
for gamma, C in hyperparams:rbf_kernel_svm_clf = Pipeline([("scaler", StandardScaler()),("svm_clf", SVC(kernel="rbf", gamma=gamma, C=C))])rbf_kernel_svm_clf.fit(X, y)svm_clfs.append(rbf_kernel_svm_clf)plt.figure(figsize=(11, 7))for i, svm_clf in enumerate(svm_clfs):plt.subplot(221 + i)plot_predictions(svm_clf, [-1.5, 2.5, -1, 1.5])plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])gamma, C = hyperparams[i]plt.title(r"$\gamma = {}, C = {}$".format(gamma, C), fontsize=16)plt.show()

  • 增大 γ 使钟型曲线更窄,在单个样本周围环绕
  • 较小 γ 使钟型曲线更宽,样本有更大的影响范围,判定边界最终则更加平滑
  • 如果模型过拟合,减小γ值,若欠拟合,增大γ

计算复杂度

3. 支持向量机回归

回归:在间隔内放置尽可能多的样本点

from sklearn.svm import LinearSVR
svm_reg = LinearSVR(epsilon=1.5, random_state=1)

间隔大小由 ϵ\epsilonϵ 控制

from sklearn.svm import SVR
svm_poly_reg1 = SVR(kernel="poly", degree=2, C=100, epsilon=0.1, gamma="auto")
svm_poly_reg2 = SVR(kernel="poly", degree=2, C=0.01, epsilon=0.1, gamma="auto")

多项式核化的非线性SVM

4. 原理

y^={0if wTx+b<01if wTx+b≥0\hat{y}=\left\{\begin{array}{l}0 \text { if } \mathbf{w}^{T} \mathbf{x}+b<0 \\ 1 \text { if } \mathbf{w}^{T} \mathbf{x}+b \geq 0\end{array}\right.y^​={0 if wTx+b<01 if wTx+b≥0​

  • 两个平面的交界线,决策边界
  • 虚线表示:决策函数等于 1 或 -1 的点:它们平行,且到决策边界的距离相等,形成一个间隔
  • 训练线性 SVM 分类器意味着找到w值和b值使得这一个间隔尽可能大,同时避免间隔违规(硬间隔)或限制它们(软间隔)

[Hands On ML] 5. 支持向量机相关推荐

  1. 支持向量机鸢尾花Iris数据集的SVM线性分类练习

    支持向量机&鸢尾花Iris数据集的SVM线性分类练习 摘要 一.SVM基础 1.三种支持向量机 2.非线性支持向量机 二.鸢尾花实例 1.认识鸢尾花 2.鸢尾花实例演示 3.使用多项式特征和核 ...

  2. 机器学习算法/模型——支持向量机

    支持向量机 0. 本质和概述 0.1 本质 0.2 概念/术语 1. 目标函数(损失函数) 2. 优化算法(求解) 拉格朗日乘子法 3. SVM软间隔 4. 核函数SVM模型 小结:三种支持向量机 5 ...

  3. 白话机器学习算法理论+实战之支持向量机(SVM)

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,比如我之前写过的一篇十大机器学习算法的小总结,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑 ...

  4. Opencv学习笔记 - OpenCV 4机器学习算法简介

    在机器学习中,一些比较流行方法的包括:支持向量机(SVM).人工神经网络(ANN).聚类.k-最近邻.决策树和深度学习.OpenCV支持并实现几乎所有这些方法,并有详细的文档说明(包含在Main mo ...

  5. python机器学习 | SVM算法介绍及实现

    本篇博客具体学习参考: 1 [机器学习]支持向量机SVM及实例应用 2 [ML]支持向量机(SVM)从入门到放弃再到掌握 这两篇文章讲得特别清楚,数学推导(第一篇)也能看明白,强烈推荐学习~~ 本篇博 ...

  6. 基于机器学习、人工智能和区块链技术的物联网安全

    物联网安全:基于机器学习.人工智能和区块链技术的挑战和解决方案 背景介绍 物联网 IoT基础设施 物联网协议 IoT 应用 物联网面临的攻击 三种技术下的物联网安全调研 区块链 机器学习 人工智能 物 ...

  7. OpenCV之ml 模块. 机器学习:支持向量机(SVM)介绍 支持向量机对线性不可分数据的处理

    支持向量机(SVM)介绍 目标 本文档尝试解答如下问题: 如何使用OpenCV函数 CvSVM::train 训练一个SVM分类器, 以及用 CvSVM::predict 测试训练结果. 什么是支持向 ...

  8. ML:基于自定义数据集利用Logistic、梯度下降算法GD、LoR逻辑回归、Perceptron感知器、SVM支持向量机、LDA线性判别分析算法进行二分类预测(决策边界可视化)

    ML:基于自定义数据集利用Logistic.梯度下降算法GD.LoR逻辑回归.Perceptron感知器.支持向量机(SVM_Linear.SVM_Rbf).LDA线性判别分析算法进行二分类预测(决策 ...

  9. ML之SVM:基于SVM(支持向量机)之SVC算法对手写数字图片识别进行预测

    ML之SVM:基于SVM(支持向量机)之SVC算法对手写数字图片识别进行预测 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 X_train = ss.fit_transform(X ...

最新文章

  1. 邮件客户端WebMail Pro v7.7.5发布,在线订购限时75折优惠!
  2. 面向对象葵花宝典:思想、技巧与实践(36) - 设计原则如何用?
  3. python爬取jsp网页_帮MM用python抓取index及一级目录下的所有符合要求的网页
  4. android 继承listview,Android listView 继承ListActivity的用法
  5. 文件跟随_不同类型的文件柜价格是否一样呢
  6. vm虚拟机安装gho系统_虚拟机怎么安装gho系统
  7. 友华PT925E,电信天翼网关3.0,光猫超级密码获取最简便方式
  8. java 栅栏_Java 并发工具类(栅栏 CyclicBarrier )
  9. 【历史上的今天】12 月 10 日:世界上第一位程序员诞生;Ada 语言发布;第一人称射击游戏的开拓者
  10. ssh、git环境配置
  11. java 关系运算符-逻辑运算符概述-逻辑运算符
  12. 荟聚新动能 数创新经济 2022全国工业App和信息消费大赛在湖南株洲举行
  13. android 服务保活之白名单,Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)...
  14. 福大软工1816 · 第一次作业——准备
  15. 我说CMMI2.0之管理性能和度量数据
  16. python中guess=-1是什么意思?
  17. 天龙八部ol卡彩色名字分析
  18. C++ 实现守护进程
  19. kaggle 欺诈信用卡预测——Smote+LR
  20. 手机端网页制作轮播图html怎么写,原生JS实现移动端web轮播图详解(结合Tween算法造轮子)...

热门文章

  1. Django的信号机制详解
  2. Exception in thread main java.lang.UnsupportedClassVersionError的另类解决办法
  3. 剑指offer:二叉树中和为某一值的路径
  4. shell 替换字符串的几种方法,变量替换${},sed,awk
  5. Dojo API中文 Dojo内容模块概览,初学者
  6. 完全理解Gson(1):简单入门
  7. Flume之核心架构深入解析
  8. 【BZOJ 3191】[JLOI2013]卡牌游戏
  9. Java中,String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?...
  10. stl algorithm -- sort ,unique