【367】通过 python 实现 SVM 硬边界 算法
参考: 支持向量机整理
SVM 硬边界的结果如下:
$$
min \quad \frac{1}{2} \sum_{i=1}^m\sum_{j=1}^m \alpha_i\alpha_jy_iy_j \vec x_i \vec x_j - \sum_{i=1}^m\alpha_i
\\
s.t. \quad \alpha_i\ge0 \quad i=1...m
\\
\quad \sum_{i=1}^m \alpha_i y_i=0
$$
一. 数据准备
测试数据如下所示, 前两个为 -1, 后面三个为 1, 如下图可以看到分割线即为:
$$
y = x + 1
$$
import numpy as np
import matplotlib.pyplot as plt X = np.array([[1,3],
[0,2],
[0,0],
[2,0],
[2,2]]) x = np.linspace(-2, 3, 100) y = np.array([-1,-1,1,1,1]) plt.figure()
plt.scatter(X[:2,0],X[:2,1])
plt.scatter(X[2:,0],X[2:,1])
plt.plot(x, x+1)
plt.show()

二. 获取 QP 的参数并计算α
将下面的结果带入到二次规划问题中分别求得 P/p/G/h/A/b 的值.
这个过程不是很容易, 虽然数据量这么少, 我反反复复弄了好几遍最终才做对.
$$
min \quad \frac{1}{2} \sum_{i=1}^m\sum_{j=1}^m \alpha_i\alpha_jy_iy_j \vec x_i \vec x_j - \sum_{i=1}^m\alpha_i
\\
s.t. \quad \alpha_i\ge0 \quad i=1...m
\\
\quad \sum_{i=1}^m \alpha_i y_i=0
$$
按照下面的形式进行获取参数.
$$
min \quad \frac{1}{2}x^TPx + q^Tx\\
s.t. \quad Gx \le h\\
\quad\quad Ax = b
$$
# 需要将 X 中的数据彼此相乘, 得到一个 5*5 的矩阵
# 同时需要注意 y 的符号会影响
P = matrix([[10.0,6.0,0.0,-2.0,-8.0],
[6.0,4.0,0.0,0.0,-4.0],
[0.0,0.0,0.0,0.0,0.0],
[-2.0,0.0,0.0,4.0,4.0],
[-8.0,-4.0,0.0,4.0,8.0]]) # 为了得到一个常数, q 为 5*1 的矩阵, 转置后正好可以用
q = matrix(-1.0, (5,1)) # 首先将 ≥ 调整为 ≤, 然后按照向量的形式表示
# 结果 h 为 5*1 的矩阵
# 因此 G 为 5*5 的矩阵(α 是 5*1 矩阵)
G = matrix([[-1.0,0.0,0.0,0.0,0.0],
[0.0,-1.0,0.0,0.0,0.0],
[0.0,0.0,-1.0,0.0,0.0],
[0.0,0.0,0.0,-1.0,0.0],
[0.0,0.0,0.0,0.0,-1.0]]) h = matrix(0.0, (5,1)) # 结果为常数的形式, 因此 A 是一个 1*5 矩阵
A = matrix([1.0,1.0,-1.0,-1.0,-1.0]).T b = matrix(0.0, (1,1))
将上面的内容带入到二次规划的函数中进行求解.
sol = solvers.qp(P,q,G,h,A,b)
alpha = sol['x']
print(alpha)
pcost dcost gap pres dres
0: -1.4151e+00 -3.0463e+00 1e+01 3e+00 2e+00
1: -3.4780e-01 -2.4147e+00 2e+00 7e-16 8e-16
2: -9.2882e-01 -1.0856e+00 2e-01 3e-16 5e-16
3: -9.9882e-01 -1.0010e+00 2e-03 2e-16 3e-16
4: -9.9999e-01 -1.0000e+00 2e-05 1e-16 3e-16
5: -1.0000e+00 -1.0000e+00 2e-07 2e-16 2e-16
Optimal solution found.
[ 4.31e-01]
[ 5.69e-01]
[ 2.84e-01]
[ 5.88e-08]
[ 7.16e-01]
三. 根据α来计算w
目前已经求出了所有的$\alpha$, 根据下面的公式将所有的样本点数据带入求得$\vec w$. 根据$\alpha$的结果可以判断哪些是支持向量, 包括 index = 0, 1, 2, 4 都满足.
$$
\vec w=\sum_{i=1}^m \alpha_i y_i \vec x_i
$$
X0 = X[:,0].flatten()
X1 = X[:,1].flatten() w1 = (w*y*X0).sum()
w2 = (w*y*X1).sum() W = np.array([w1,w2]) print("w1=", w1)
print("w2=", w2)
w1= 1.0000000446896518
w2= -1.000000054585139
四. 根据w来求b
$\vec w$已经求出了, 这时候只要带入任何一个支持向量里面即可, 公式如下:
$$
y_i(\vec w ^T\vec x_i+b) = 1
$$
化简后得到:
$$
b = y_i - \vec w^T\vec x_i
$$
由上面计算可知, 第一个点在支持向量上面, 因此可以计算获得b值.
$$
b = y_1 - \vec w^T\vec x_1
$$
W = np.mat(W)
xx = np.mat(X[1,:].T)
xx = xx.T b = int(-1 - W*xx)
print("b=", b)
b= 1
所以最终的结果就是:
$$
x_1 - x_2 + 1 = 0
$$
将$x_1$换成$x$, 将$x_2$换成$y$, 则得到:
$$
y = x + 1
$$
【367】通过 python 实现 SVM 硬边界 算法的更多相关文章
- Python机器学习笔记 K-近邻算法
K近邻(KNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一. 所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.KNN算法的 ...
- SVM之SMO算法(转)
支持向量机(Support Vector Machine)-----SVM之SMO算法(转) 此文转自两篇博文 有修改 序列最小优化算法(英语:Sequential minimal optimizat ...
- 小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码)
小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码) Python 被称为是最接近 AI 的语言.最近一位名叫Anna-Lena Popkes的小姐姐在GitHub上分享了自己如何使用P ...
- Python实现SVM(支持向量机)
Python实现SVM(支持向量机) 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=>end ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- 使用python进行加密解密AES算法
使用python进行加密解密AES算法-代码分享-PYTHON开发者社区-pythoner.org 使用python进行加密解密AES算法 TY 发布于 2011-09-26 21:36:53,分类: ...
- 基于Python使用SVM识别简单的字符验证码的完整代码开源分享
关键字:Python,SVM,字符验证码,机器学习,验证码识别 1 概述 基于Python使用SVM识别简单的验证字符串的完整代码开源分享. 因为目前有了更厉害的新技术来解决这类问题了,但是本文作 ...
- Python实现图像直方图均衡化算法
title: "Python实现图像直方图均衡化算法" date: 2018-06-12T17:10:48+08:00 tags: [""] categorie ...
- 用Python从零开始实现K近邻算法
KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...
随机推荐
- nginx file not found 错误处理小记
安装完php php-fpm nginx 后访问php出现file not found错误,html就没问题配置文件server 段如下 server { listen 80; server_name ...
- [电脑知识点]Excel取消受保护视图
- 使用UtraISO为U盘制作系统启动盘
安装最新的Ubuntu18.04操作系统: 1.在utraiso软件中打开系统的iso文件: 2.插入U盘: 3.点击[启动]选项卡,选择[写入硬盘映像]: 4.最关键的一步: 刻录校验:打上对勾: ...
- Hiveserver2高可用实现
在生产环境中使用Hive,强烈建议使用HiveServer2来提供服务,好处有: 在应用端不用部署Hadoop和Hive客户端: 相比hive-cli方式,HiveServer2不用直接将HDFS和M ...
- Windows向虚拟机Linux传输文件方法
在Windows中装了个centOS,进行文件操作时,把mv写成了rm,然后就悲剧了.. 赶紧从网上找来文件的具体内容,然后由Windows向Linux挂载共享文件夹. 具体做法: 在Windows中 ...
- (转)C#串口SerialPort常用属性方法
SerialPort(): //属性 .BaudRate;获取或设置波特率 .BytesToRead;得到 接收到数据的字节数 .BytesToWrites;得到送往串口的字节数 .DataBits; ...
- [Unity插件]Lua行为树(七):行为树嵌套
在上一篇的基础上,可以测试下行为树的嵌套,所谓的行为树嵌套,就是在一棵行为树下的某一个分支,接入另一棵行为树. 以下面这棵行为树为例: TestBehaviorTree2.lua TestBehavi ...
- 1.正则re
正则 :规则表达式 一般在匹配非结构化的数据时用的比较多,结构化的数据一般用xpath,bs4.但具体使用起来都是视情况而定,相对而言.正则规则平时涉及最多也就是匹配邮箱,电话,及特殊字符串.规则相对 ...
- jquery小效果:新浪游戏右侧导航菜单 (页面效果)
偷盗:新浪游戏右侧导航菜单 http://games.sina.com.cn 效果: 随着页面的滚动,左侧页面的内容,和右侧的导航菜单的按钮文字对应: 点击右侧的导航按钮,左侧页面滚动到相应的内容 2 ...
- [多线程]多线程(Thread、Runnable、Callable)
1.继承Thread类,重写run方法 线程 是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程.每个线程都可以或不 ...