机器学习笔记——支持向量机

支持向量机

  • 参数模型
  • 对分布需要假设(这也是与非参数模型的区别之一)
  • 间隔最大化,形式转化为凸二次规划问题

最大化间隔

间隔最大化是意思:对训练集有着充分大的确信度来分类训练数据,最难以分的点也有足够大的信度将其分开
间隔最大化的分离超平面的的求解怎么求呢?
最终的方法如下
1.线性可分的支持向量机的优化目标
其实就是找得到分离的的超平面
在这里插入图片描述
求得参数w和b的值就可以了
注意,最大间隔分离超平面是唯一的间隔叫硬间隔
1.1支持向量
对于一个样本,要么对应的参数a为0,要么与超平面的间隔为γ,将这些与超平面距离最小的向量x称为支持向量
也就是训练点到分离超平面距离最近的样本点就是支持向量

2. 线性支持向量机的目标函数
线性可分的问题对不可分不适用,因此需要将硬间隔改为软间隔在这里插入图片描述 这里的a是待求解的参数,梯度参数量是和规模m相关,数据的规模增大时,参数量也增多。 在这里插入图片描述
线性支持向量机包括了线性可分支持向量机

序列最小优化算法(SMO)

我们只需要用支持向量来进行分类,这样子减少了复杂度和时间消耗,但是优势不明显,因为参数a的求解需要的时间也很大,所以用到了序列最小优化算法来解决这个问题。
思想:同时优化所有的参数比较困难,因此选择部分参数来优化,选择两个固定其他的,然后再选两个固定其他的一直循环,直到更新参数的变化小于某个值就可以终止,或者固定迭代次数。

线性可分的代码实例

采用的linear.csv数据

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from tqdm import tqdm, trangedata = np.loadtxt('./data/linear.csv', delimiter=',')
print('数据集大小:', len(data))
x = data[:, :2]
y = data[:, 2]# 数据集可视化
plt.figure()
plt.scatter(x[y == -1, 0], x[y == -1, 1], color='red', label='y=-1')
plt.scatter(x[y == 1, 0], x[y == 1, 1], color='blue', marker='x', label='y=1')
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')
plt.legend()
plt.show()
#%%
def SMO(x, y, ker, C, max_iter):'''SMO算法x,y:样本的值和类别ker:核函数,与线性回归中核函数的含义相同C:惩罚系数max_iter:最大迭代次数'''# 初始化参数m = x.shape[0]alpha = np.zeros(m)# 预先计算所有向量的两两内积,减少重复计算K = np.zeros((m, m))for i in range(m):for j in range(m):K[i, j] = ker(x[i], x[j])for l in trange(max_iter):# 开始迭代for i in range(m):# 有m个参数,每一轮迭代中依次更新# 固定参数alpha_i与另一个随机参数alpha_j,并且保证i与j不相等j = np.random.choice([l for l in range(m) if l != i])# 用-b/2a更新alpha_i的值eta = K[j, j] + K[i, i] - 2 * K[i, j] # 分母e_i = np.sum(y * alpha * K[:, i]) - y[i] # 分子e_j = np.sum(y * alpha * K[:, j]) - y[j]alpha_i = alpha[i] + y[i] * (e_j - e_i) / (eta + 1e-5) # 防止除以0zeta = alpha[i] * y[i] + alpha[j] * y[j]# 将alpha_i和对应的alpha_j保持在[0,C]区间# 0 <= (zeta - y_j * alpha_j) / y_i <= Cif y[i] == y[j]:lower = max(0, zeta / y[i] - C)upper = min(C, zeta / y[i])else:lower = max(0, zeta / y[i])upper = min(C, zeta / y[i] + C)alpha_i = np.clip(alpha_i, lower, upper)alpha_j = (zeta - y[i] * alpha_i) / y[j]# 更新参数alpha[i], alpha[j] = alpha_i, alpha_jreturn alpha
#%%
# 设置超参数
C = 1e8 # 由于数据集完全线性可分,我们不引入松弛变量
max_iter = 1000
np.random.seed(0)alpha = SMO(x, y, ker=np.inner, C=C, max_iter=max_iter)
#%%
# 用alpha计算w,b和支持向量
sup_idx = alpha > 1e-5 # 支持向量的系数不为零
print('支持向量个数:', np.sum(sup_idx))
w = np.sum((alpha[sup_idx] * y[sup_idx]).reshape(-1, 1) * x[sup_idx], axis=0)
wx = x @ w.reshape(-1, 1)
b = -0.5 * (np.max(wx[y == -1]) + np.min(wx[y == 1]))
print('参数:', w, b)
#%%
# 绘图
X = np.linspace(np.min(x[:, 0]), np.max(x[:, 0]), 100)
Y = -(w[0] * X + b) / (w[1] + 1e-5)
plt.figure()
plt.scatter(x[y == -1, 0], x[y == -1, 1], color='red', label='y=-1')
plt.scatter(x[y == 1, 0], x[y == 1, 1], marker='x', color='blue', label='y=1')
plt.plot(X, Y, color='black')
# 用圆圈标记出支持向量
plt.scatter(x[sup_idx, 0], x[sup_idx, 1], marker='o', color='none',edgecolor='purple', s=150, label='support vectors')
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')
plt.legend()
plt.show()

线性不可分的

# 从sklearn.svm中导入SVM分类器
from sklearn.svm import SVCdata1=np.loadtxt('./data/spiral.csv',delimiter=',')
x=data[:,:2]
y=data[:,2]
# 定义SVM模型,包括定义使用的核函数与参数信息
model = SVC(kernel='rbf', gamma=50, tol=1e-6)
model.fit(x, y)# 绘制结果
fig = plt.figure(figsize=(6,6))
G = np.linspace(-1.5, 1.5, 100)
G = np.meshgrid(G, G)
X = np.array([G[0].flatten(), G[1].flatten()]).T # 转换为每行一个向量的形式
Y = model.predict(X)
Y = Y.reshape(G[0].shape)
plt.contourf(G[0], G[1], Y, cmap=cmap, alpha=0.5)
# 绘制原数据集的点
plt.scatter(x[y == -1, 0], x[y == -1, 1], color='red', label='y=-1')
plt.scatter(x[y == 1, 0], x[y == 1, 1], marker='x', color='blue', label='y=1')
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')
plt.legend()
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

68. UE5 RPG 处理多个角色后续bug

我们现在已经有了四个敌人角色&#xff0c;接下来&#xff0c;处理一下在战斗中遇到的问题。 处理角色死亡后还会攻击的问题 因为我们有角色溶解的效果&#xff0c;角色在死亡以后的5秒钟才会被销毁掉。所以在这五秒钟之内&#xff0c;角色其实还是会攻击。主要时因为AI行为树…

AI 大模型重点行业应用情况

1、AI 大模型重点行业应用情况总览 AI大模型将率先在互联网办公、金融等数字化程度较高的行业快速渗透&#xff0c;医疗、交通、 制造等行业的潜在渗透空间大。 2、AI 大模型在金融行业应用情况 金融行业的应用场景丰富&#xff0c;是最早进行数字化转型的机构&#xff0c;因此…

一文了解SpringBoot

1 springboot介绍 1)springboot是什么? Spring Boot是一个用于简化Java应用程序开发的框架。它基于Spring框架,继承了Spring框架原有的优秀特性,比如IOC、AOP等, 他并不是用来代替Spring的解决方案,而是和Spring框架紧密结合,进一步简化了Spring应用的整个搭建和开发过程…

angular2开发知识点

目录 文章目录 一、API 网关地址 配置二、服务注册使用三、模块组件注册使用四、html中style类动态绑定1. 单个类的绑定&#xff1a;[class.special]"isSpecial"2. 多个类的绑定&#xff1a;[ngClass]"{selected:status ,saveable: this.canSave,}"3. 单个…

LLM Algorithms(1): Flash Attention

目录 Background Flash Attention Flash Attention Algorithm 参考 NIPS-2022: Flash Attention: Fast and Memory-Efficient Exact Attention with IO-Awareness idea&#xff1a;减少资源消耗&#xff0c;提升或保持模型性能。普通attention的空间复杂度是 --》降低到F…

数据结构复习笔记

简答题 (3) 顺序表和链表的概念及异同 顺序表: 把逻辑上相邻的结点储存在物理位置上的相邻储存单元中&#xff0c;结点的逻辑关系由储存单元的邻接关系来体现.链表: 逻辑上相邻的结点存储再物理位置上非连续非顺序的存储单元中, 结点的逻辑关系由指向下一个结点的指针确保.相…

抓包工具 HttpAnalyzerFull_V7.6.4 的下载、安装、使用

目录 一、简介二、下载和安装三、如何注册四、使用介绍4.1 开始、停止、清空监控内容4.2 筛选监控内容4.3 监控内容显示 一、简介 Http Analyzer 是一款功能强大的数据包分析工具&#xff0c;它可以实时监控服务器返回的消息&#xff0c;支持64位Windows系统&#xff0c;可以同…

kaggle竞赛实战9——模型融合

有三种方法&#xff0c; 第一种&#xff1a;均值融合&#xff0c;代码如下 data pd.read_csv(\ result/submission_randomforest.csv\ ) data[randomforest] data[target].values temp pd.read_csv(\ result/submission_lightgbm.csv\ ) …

C++必修:探索C++的内存管理

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. C/C的内存分布 我们首先来看一段代码及其相关问题 int globalVar 1; static…

微信小程序毕业设计-网吧在线选座系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

力扣 T62 不同路径

题目 连接 思路 思路1 &#xff1a; BFS爆搜 class Solution { public:queue<pair<int,int>>q;int uniquePaths(int m, int n) {q.push({1,1}); // 起始位置vector<pair<int, int>> actions;actions.push_back({0, 1}); // 向下actions.push_bac…

【网络编程开发】11.IO模型 12.IO多路复用

11.IO模型 什么是IO: IO 是 Input/Output 的缩写&#xff0c;指的是输入和输出。在计算机当中&#xff0c;IO 操作通常指将数据从一个设备或文件中读取到计算机内存中&#xff0c;或将内存中的数据写入设备或文件中。这些设备可以包括硬盘驱动器、网卡、键盘、屏幕等。 通常用…

selenium自动化测试入门 —— Alert/Confirm/Prompt 弹出窗口处理!

一、Alert/Confirm/Prompt弹出窗口特征说明 Alert弹出窗口&#xff1a; 提示用户信息只有确认按钮&#xff0c;无法通过页面元素定位&#xff0c;不关闭窗口无法在页面上做其他操作。 Confirm 弹出窗口&#xff1a; 有确认和取消按钮&#xff0c;该弹出窗口无法用页面元素定…

06_深度学习历史的里程碑--重读AlexNet

1.1 介绍 AlexNet是深度学习历史上一个非常重要的卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;模型&#xff0c;由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年设计并提出。它因在ImageNet大规模视觉识别挑战赛中的卓越表现而闻名&a…

2024世界技能大赛某省选拔赛“网络安全项目”B模块--数据包分析(jsp流量解密)

2024世界技能大赛某省选拔赛“网络安全项目”B模块--数据包分析② 任务一、网络数据包分析取证解析:任务一、网络数据包分析取证解析: A 集团的网络安全监控系统发现有恶意攻击者对集团官方网站进行攻击,并抓取了部分可疑流量包。请您根据捕捉到的流量包,搜寻出网络攻击线…

冯喜运:6.10周一黄金还会再次拉升吗?日内黄金原油操作策略

【黄金消息面分析】&#xff1a;周一(6月10日)亚市盘中&#xff0c;现货黄金交在上周五暴跌后仍然承压&#xff0c;目前金价位于2294美元/盎司左右。因强劲非农数据刺激美元大涨&#xff0c;现货黄金上周五出现暴跌。此外&#xff0c;上周五数据显示&#xff0c;最大黄金消费国…

在python中关于元组的操作

创建元组 如上图所示&#xff0c;a&#xff08;&#xff09;和b tuple(),,这两种方式都可以创建出元组。 在创建元组的时候&#xff0c;指定初始值 如上图所示&#xff0c;也可以在创建元组的时候&#xff0c;指定初始值。 同列表一样元组中的元素也可以是任意类型的。 同列…

Qt 布局管理

布局基础 1)Qt 布局管理系统使用的类的继承关系如下图: QLayout 和 QLayoutItem 这两个类是抽象类,当设计自定义的布局管理器时才会使用到,通常使用的是由 Qt 实现的 QLayout 的几个子类。 2)Qt 使用布局管理器的步骤如下: 首先创建一个布局管理器类的对象。然后使用该…

封装了一个简单理解的iOS竖直文字轮播

效果图 原理 就是持有两个视图&#xff0c;并且两个视图同时改变origin.y 动画结束之后&#xff0c;判断哪个视图是在上面并且看不到的&#xff0c; 则将该视图移动到底部&#xff0c;并且该视图展示下一跳内容 在开始下一轮动画 代码 - (void)startAnimationWithDuration:(…

【Linux】网络配置(静态/动态/手动/nmcli)

目录 一、手动修改网络配置文件&#xff1a;静态 二、手动修改网络配置文件&#xff1a;动态 三、nmcli工具命令修改网络配置文件&#xff1a;静态 四、nmcli工具命令修改网络配置文件&#xff1a;动态 错误排查分析&#xff1a;编辑虚拟网络编辑器不生效 1、排除VMware启…