前言:仅个人小记。问题来自李航的《统计学习方法》第二版中例题 7.1。

问题

如图,支持向量机的训练数据集为:正例点为 x1=(3,3),x2=(4,3)x_1=(3,3),x_2=(4,3)x1​=(3,3),x2​=(4,3),负例点为 x3=(1,1)x_3=(1,1)x3​=(1,1),求最大间隔分离超平面。

最大间隔法

输入: 线性可分训练数据集 T=(x1,y1),(x2,y2),...,(xN,yN)T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}T=(x1​,y1​),(x2​,y2​),...,(xN​,yN​),其中,yi∈{−1,+1}y_i\in \{-1,+1\}yi​∈{−1,+1}。
输出:最大分离超平面。
算法:

  • 构造并求解约束最优化问题min⁡w,b12∣∣w∣∣2s.t.yi(wxi+b)−1≥0\min_{\boldsymbol{w},b}\frac{1}{2}||w||^2 \\ s.t.\ \ y_i(\boldsymbol{w}\boldsymbol{x}_i+b)-1\geq 0w,bmin​21​∣∣w∣∣2s.t.  yi​(wxi​+b)−1≥0
    求解得到最优解w∗,b∗\boldsymbol{w}^*,b^*w∗,b∗。
  • 得到分离超平面w∗x+b∗=0\boldsymbol{w}^*\boldsymbol{x}+b^*=0w∗x+b∗=0

python 代码同步解释

载入题目中的数据集
import matplotlib.pyplot as plt
import cvxopt
import numpy as npT = [(3,3,1),(4,3,1),(1,1,-1)] # 数据集,格式为 (x1,x2,y),其中y 为标签,取值-1,+1
根据数据集确定最优化问题

min⁡w,b12(w12+w22)s.t.3w1+3w2+b≥14w1+3w2+b≥1−w1−w2−b≥1\min_{\boldsymbol{w},b}\frac{1}{2}(w_1^2+w_2^2)\\ s.t. \ \ 3w_1+3w_2+b\geq 1 \\ \ \ \ \ \ \ \ \ 4w_1+3w_2+b\geq 1 \\ \ \ \ \ \ \ \ \ -w_1-w_2-b\geq 1w,bmin​21​(w12​+w22​)s.t.  3w1​+3w2​+b≥1        4w1​+3w2​+b≥1        −w1​−w2​−b≥1

最优化问题表达为矩阵形式

目标函数的二次项部分表达为二次型矩阵(考虑变量bbb,共有333个变量)
P=[100010000]P=\begin{bmatrix} 1&0&0\\0&1&0\\0&0&0\end{bmatrix}P=⎣⎡​100​010​000​⎦⎤​
一次项部分表达为q=[0,0,0]q=\begin{bmatrix}0,0,0\end{bmatrix}q=[0,0,0​]
不等式左半部分表达为
G=[−3−3−1−4−3−1111]G=\begin{bmatrix} -3&-3&-1\\ -4& -3 & -1\\ 1 & 1 & 1 \end{bmatrix}G=⎣⎡​−3−41​−3−31​−1−11​⎦⎤​
不等式右半部分表达为
h=[−1,−1,−1]h=[-1,-1,-1]h=[−1,−1,−1]

## 下面使用cvxopt 包求解凸二次规划问题
# 首先要将凸二次规划问题表达为矩阵形式,具体要求参看 help(cvxopt.solver.qp) ,很详细清楚
m = len(T[0]) # 样本的维度P = np.identity(m) # 目标函数中二次部分,使用二次型表示
P[m-1][m-1] = 0
P = cvxopt.matrix(P)q = cvxopt.matrix([0.0]*m) # 目标函数中一次部分G =[] # 不等式部分
for j in range(m-1):G.append([-T[i][j]*T[i][-1] for i in range(len(T))])
G.append([-T[i][-1]*1.0 for i in range(len(T))])
G = cvxopt.matrix(G)h = cvxopt.matrix([[-1.0]*3])
使用工具包求解最优化问题
# 将参数传递给 cvxopt.solvers.qp ,返回最优解
sol = cvxopt.solvers.qp(P,q,G,h)
print(sol['x']) # w0,w1,b,
#[ 5.00e-01]
#[ 5.00e-01]
#[-2.00e+00]
# 0.5x1 + 0.5x2 - 2 = 0
得到最大间隔分离超平面

超平面以及数据点绘制部分
# 使用 https://blog.csdn.net/qq_25847123/article/details/90340526 中提供的绘图代码
# 将数据集格式进行简单转换,使其吻合drawScatterPointsAndLine函数输入要求
dataSet = np.array([list(T[i][0:-1]) for i in range(len(T))])
labels = np.array([T[i][-1] for i in range(len(T))])w = [sol['x'][0],sol['x'][1]]
b = sol['x'][2]drawScatterPointsAndLine(dataSet,labels,w,b)

其中 drawScatterPointsAndLine 绘图代码参看博客 https://blog.csdn.net/qq_25847123/article/details/90340526。

邮箱: officeforcsdn@163.com

线性可分支持向量机 凸二次规划解决原问题 python相关推荐

  1. 【机器学习基础】数学推导+纯Python实现机器学习算法8-9:线性可分支持向量机和线性支持向量机...

    Python机器学习算法实现 Author:louwill 前面两讲我们对感知机和神经网络进行了介绍.感知机作为一种线性分类模型,很难处理非线性问题.为了处理非线性的情况,在感知机模型的基础上有了两个 ...

  2. 统计学习方法笔记(五)-线性可分支持向量机原理及python实现

    支持向量机 支持向量机 线性可分支持向量机 最大间隔法 代码实现 案例地址 支持向量机 支持向量机(support vector machines,SVM)是一种二分类模型,它的基本类型是定义在特征空 ...

  3. 机器学习(7)——支持向量机(二):线性可分支持向量机到非线性支持向量机

    线性可分支持向量机 回顾 前面总结了线性可分支持向量机,知道了支持向量机的最终目的就是通过"间隔最大化" 得到最优分类器,能够使最难区分的样本点得到最大的分类确信度,而这些难区分的 ...

  4. SVM详解(一)线性可分支持向量机与硬间隔最大化

    文章目录 1. 引言 2. 函数间隔与几何间隔 3. 间隔最大化 4. 最大间隔分离超平面的存在唯一性 5. 支持向量和间隔边界 6. 学习的对偶算法 1. 引言 我们在介绍感知机的时候知道,对于线性 ...

  5. 线性可分支持向量机记录

    这里是引用 前言 小那近日因为工作需要,详细看了支持向量机的学习算法是如何玩转分类功能的.在程序员女朋友的无数次推荐下,青睐于手写笔记的小那开启了博客记录之行.这篇内容主要讲述了支持向量机的3种类别种 ...

  6. 【统计学习方法】线性可分支持向量机对鸢尾花(iris)数据集进行二分类

    本文摘要 · 理论来源:[统计学习方法]第七章 SVM · 技术支持:pandas(读csv).numpy.sklearn.svm.svm思想.matplotlib.pyplot(绘图) · 代码目的 ...

  7. 支持向量机——线性可分支持向量机

    文章目录 1 线性可分支持向量机 2 函数间隔和几何间隔 3 间隔最大化 4 学习的对偶算法 GitHub 简书 CSDN 1 线性可分支持向量机 支持向量机(Support vector machi ...

  8. 支持向量机之线性可分支持向量机(一)

    简介 支持向量机(support vector machines,SVM)是一种二分类分类模型.它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使得它有别于感知机:支持向量机还包括核技巧 ...

  9. 支持向量机(一)——线性可分支持向量机

    支持向量机(Support Vector Machine, SVM)是一种二分类模型.它的基本思想是间隔最大化. 1.线性可分支持向量机 给定训练集 T={(x1,y1),(x2,y2),...,(x ...

  10. 支持向量机专题——线性可分支持向量机

    原文 支持向量机(support vector machine, SVM)是一种经典的分类器,其主要思想是学习一个在特征空间上使间隔最大的分类器.支持向量机的学习可以看成是一个求解凸二次规划问题的过程 ...

最新文章

  1. C++:STL标准入门汇总
  2. 你还弄不懂的傅里叶变换,神经网络只用了30多行代码就学会了
  3. 玩转数据结构从入门到进阶四
  4. 更换桌面壁纸的小工具。
  5. C# 重绘tabControl,添加关闭按钮(续)
  6. oracle定时关闭job,Oracle 定时JOB
  7. 记录数据库内一条记录的更新时间
  8. 2020年python工资一般多少-武汉Python薪资一般是多少?真实数据告诉你
  9. O - Can you find it?
  10. 声纹技术(四):声纹识别的工程部署
  11. R语言如何做NMDS分析
  12. CoinCola研究院 | 从技术的角度解读BCH分叉升级
  13. React报错 Too many re-renders
  14. php 给视频打水印,如何给视频加表情 给视频局部画面加动态图片或水印
  15. suse linux 11 xdm图形化,suse xdm 设置
  16. CSS(3)教程 css的一般属性
  17. 深度学习中的BN_CBN_CmBN
  18. kubernetes简介
  19. 解决:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
  20. AutoCAD炸开轴号后文字会发生改变

热门文章

  1. Unity中音效插件
  2. 【新星计划】你真的了解计算机病毒吗?
  3. 计算机二级excel试题练习网盘,计算机二级练习试题excel
  4. 计算机科学导论整理知识点,计算机科学导论教程重点
  5. Gitea+Jenkins+webhooks-前端自动化部署
  6. Android应用程序开发以及背后的设计思想深度剖析(3)
  7. 解决Visual Studio 2019未能从“https://www.nuget.org/api/v2/package..“下载包问题
  8. 庖丁解牛之-Android平台RTSP|RTMP播放器设计
  9. css设置ios系统默认字体大小设置,iOS 自定义字体设置与系统自带的字体
  10. 欧姆龙cp1h指令讲解_OMRON CP1H脉冲指令说明总结