机器学习11支持向量机SVM(处理线性数据)

news2024/10/7 2:22:20

文章目录

  • 一、什么是支撑向量机?
  • 二、Hard Margin SVM思想逻辑推理
    • 点到直线的距离:
    • 推论:
    • 再推:
    • 换符号替代:
    • 最大化距离:
  • 三、Soft Margin SVM和SVM正则化
    • Hard Margin SVM缺点:
    • 所以我们必须思考一个机制,
  • 四、实际使用SVM

一、什么是支撑向量机?

support vector machine;
使用支撑向量机的思想既可以解决分类问题也可以解决回归问题,先记录分类问题的解决,之后再回归;
关于分类,决策边界有不唯一的问题,通常称为不适定问题。
机器学习很重要的一个特性就是算法的泛化能力,也就是说求出决策边界之后,这个决策边界对于带预测的样本是否是一个好的决策边界,能否非常好的预测未知数据相应的分类结果,要知道对未知数据进行预测分类是机器算法的最终目的;
故而关于决策边界的划分很重要;
我们期望决策边界离蓝色红色都尽可能远,同时还要很好的分别两个类别相应的数据点;
svm对于未来的泛化能力尽可能好的这种考量没有寄望在数据的预处理阶段或者是找到模型之后,再对模型进行正则化这样的方式,而是将对泛化能力的考量放在了算法内部,也就是我们要找到一条决策边界,这条决策边界离我们的分类样本都尽可能的远,直观来看这样的决策边界泛化能力相应的就是好的;这是可以数学严谨证明的,此处不详解;
在这里插入图片描述
在这里插入图片描述
svm尝试寻找一个最优的决策边界,距离两个类别的最近的样本最远;
到此为止解决的是线性可分的问题,线性可分就是对于所有样本点来说首先要存在一根直线或者在高维空间中存在一个超平面,可以将这些点划分,这种情况下我们才定义出这个margin;
这样的算法通常又称为是Hard Margin SVM也就是非常严格的切切实实的找到那个最优决策边界;
但是很多现实生活中数据是线性不可分的,那么在这种情况下SVM进一步改进得到Soft Margin SVM这样的算法;
在这里插入图片描述

二、Hard Margin SVM思想逻辑推理

点到直线的距离:

在这里插入图片描述

推论:

在这里插入图片描述

再推:

在这里插入图片描述

换符号替代:

在这里插入图片描述

最大化距离:

在第一行的限定条件下完成下面的最大化式子(有条件的最优化问题)
在这里插入图片描述

三、Soft Margin SVM和SVM正则化

Hard Margin SVM缺点:

在这里插入图片描述

在这里插入图片描述

所以我们必须思考一个机制,

对于这个机制来说我们SVM得到的决策边界要能够有一定的容错能力,在一些情况下它应该考虑到可以把一些点进行一些错误的分类,最终要达到的目的是希望结果的泛化能力更高;
那么不再严格要求大于等于1,给它一个宽松量,这就是Soft Margin SVM,当然它也有一个容忍度,要保证容忍度尽量的小即:其中C代表重要程度来平衡两部分,C越大代表容错空间越小,C趋于∞代表逼迫容错空间趋于0。
可以把加入的η项当作本身是一个正则化项,它在避免我们训练出来的模型像一个极端方向发展,把这个模型往回拉一拉;(L1正则化
在这里插入图片描述
L2正则化
在这里插入图片描述

四、实际使用SVM

和knn一样,要做数据处理,因为涉及距离,因为数据在不同尺度上可能量纲不同,会非常严重影响到;
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt


from sklearn import datasets
iris=datasets.load_iris()
x=iris.data
y=iris.target
x=x[y<2,:2]
y=y[y<2]#先搞二分类问题,也就是y=0=1这两个类别;同时为了方便可视化,特征x只取两个,前两个


plt.scatter(x[y==0,0],x[y==0,1],color='red')#X[y==0,0],是所有编号为0的X坐标;X[y==0,1]是所有编号为0的Y坐标
plt.scatter(x[y==1,0],x[y==1,1],color='blue')
plt.show()


from sklearn.preprocessing import StandardScaler
standarscaler=StandardScaler()
standarscaler.fit(x)
x_standard=standarscaler.transform(x)#数据标准化


from sklearn.svm import LinearSVC
svc=LinearSVC(C=1e9)#1e9 = 1*10^9 = 1000000000设置的非常大本身相当于hardmarginsvm了
svc.fit(x_standard,y)


# plot_decision_boundary()函数:绘制模型在二维特征空间的决策边界;
def plot_decision_boundary(model, axis):
    # model:算法模型;
    # axis:区域坐标轴的范围,其中 0,1,2,3 分别对应 x 轴和 y 轴的范围;
    
    # 1)将坐标轴等分为无数的小点,将 x、y 轴分别等分 (坐标轴范围最大值 - 坐标轴范围最小值)*100 份,
    # np.meshgrid():
    x0, x1 = np.meshgrid(
        np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1,1),
        np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1,1)
    )
    # np.c_():
    x_new = np.c_[x0.ravel(), x1.ravel()]
    
    # 2)model.predict(X_new):将分割出的所有的点,都使用模型预测
    y_predict = model.predict(x_new)
    zz = y_predict.reshape(x0.shape)
    
    # 3)绘制预测结果
    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
    
    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)


plot_decision_boundary(svc, axis=[-3, 3, -3,3])#x和y的范围都是在-3到3之间
plt.scatter(x_standard[y==0, 0], x_standard[y==0, 1])
plt.scatter(x_standard[y==1, 0], x_standard[y==1, 1])
plt.show()

在这里插入图片描述
在这里插入图片描述

svc2=LinearSVC(C=0.01)
svc2.fit(x_standard,y)


plot_decision_boundary(svc2, axis=[-3, 3, -3,3])#x和y的范围都是在-3到3之间
plt.scatter(x_standard[y==0, 0], x_standard[y==0, 1])
plt.scatter(x_standard[y==1, 0], x_standard[y==1, 1])
plt.show()


svc.coef_#特征有两个,每个特征都对应一个系数


svc.intercept_#途中只有一根直线只有一个截距

在这里插入图片描述

#改造
# plot_decision_boundary()函数:绘制模型在二维特征空间的决策边界;
def plot_svc_decision_boundary(model, axis):
    # model:算法模型;
    # axis:区域坐标轴的范围,其中 0,1,2,3 分别对应 x 轴和 y 轴的范围;
    
    # 1)将坐标轴等分为无数的小点,将 x、y 轴分别等分 (坐标轴范围最大值 - 坐标轴范围最小值)*100 份,
    # np.meshgrid():
    x0, x1 = np.meshgrid(
        np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1,1),
        np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1,1)
    )
    # np.c_():
    x_new = np.c_[x0.ravel(), x1.ravel()]
    
    # 2)model.predict(X_new):将分割出的所有的点,都使用模型预测
    y_predict = model.predict(x_new)
    zz = y_predict.reshape(x0.shape)
    
    # 3)绘制预测结果
    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
    
    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
    w=model.coef_[0]
    b=model.intercept_[0]
    #目前图中线为w0*x0+w1*x1+b=0
    #改写:x1=-w0/w1*x0-b/w1
    plot_x=np.linspace(axis[0],axis[1],200)#x的范围从axis0到1之间取200个点
    up_y=-w[0]/w[1]*plot_x-b/w[1]+1/w[1]
    down_y=-w[0]/w[1]*plot_x-b/w[1]-1/w[1]
    #将plot_x,up_y以折线图的方式表现出来;plot_x,down_y以折线图的方式表现出来
    #此处还有一个需要注意的地方就是此时求出的up_y和down_y有可能已经超过了我们传给这个函数中坐标axis规定的范围,这里要在做一个简单的过滤
    up_index=(up_y>=axis[2])&(up_y<=axis[3])
    down_index=(down_y>=axis[2])&(down_y<=axis[3])
    plt.plot(plot_x[up_index],up_y[up_index],color='yellow')#plot_x要在up_index这个范围中
    plt.plot(plot_x[down_index],down_y[down_index],color='yellow')

plot_svc_decision_boundary(svc, axis=[-3, 3, -3,3])#x和y的范围都是在-3到3之间
plt.scatter(x_standard[y==0, 0], x_standard[y==0, 1])
plt.scatter(x_standard[y==1, 0], x_standard[y==1, 1])
plt.show()

在这里插入图片描述

plot_svc_decision_boundary(svc2, axis=[-3, 3, -3,3])#x和y的范围都是在-3到3之间
plt.scatter(x_standard[y==0, 0], x_standard[y==0, 1])
plt.scatter(x_standard[y==1, 0], x_standard[y==1, 1])
plt.show()

在这里插入图片描述

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

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

相关文章

YOLO v1

参考 YOLO v1 - 云社区 - 腾讯云 摘要 我们提出了一种新的目标检测方法YOLO。 先前的目标检测工作重新利用分类器来执行检测。 相反&#xff0c;我们将对象检测作为空间分离的边界框和相关类概率的回归问题。 在一次评估中&#xff0c;一个单一的神经网络直接从完整的图像预…

内核态的文件操作函数:filp_open、filp_close、vfs_read、vfs_write、set_fs、get_fs

关于用户态的文件操作函数我们知道有open、read、write这些。但是这些的实现都是依赖于库的实现&#xff0c;但是在内核态是没有库函数可用的。最近做测试&#xff0c;在内核态中&#xff0c;需要学习一下在内核态里面的文件操作函数。分为三对出现。 感谢前辈的优秀文章&…

企业网站怎么建立?【企业网站的建设】

不少的实体企业都会考虑建立一个自己的企业网站&#xff0c;那么在企业网站的建设之前需要做好功课。那么企业网站怎么建立&#xff1f;下面给大家说说大概的流程。 1、申请域名 企业可以申请一个和自己企业名称相关的域名&#xff0c;而且域名尽量不要太长&#xff0c;否则难…

Java学习之多态数组

目录 一、定义 二、举例说明 要求1 父类-Person 子类-Student 子类-Teacher main类 运行结果 要求2 思路分析 main类中的代码 运行结果 一、定义 数组的定义类型为父类类型&#xff0c; 里面保存的实际元素类型为子类类型&#xff08;也可以有父类&#xff09; 二、…

Cat.1无线数据传输终端/Cat.1 DTU/LTE Cat.1 DTU/Cat 1模组功能

LTE Cat.1无线数传终端F2C16将借助成熟的LTE网络以更好的覆盖、更快的速度、更低的延时&#xff0c;完美取代传统2G/3G网络&#xff0c;为中低速率物联网行业提供优质的无线连接服务。 工业级芯片设计&#xff0c;设备稳定联网 ●全工业级芯片设计&#xff0c;宽温宽压&#xf…

「虚拟社交」爆火,资深玩家「当道」

⬆️“政企数智办公行业研究报告及融云新品发布会”明天直播&#xff01; 一切应用都将社交化。关注【融云全球互联网通信云】回复【融云】抽取高颜值大容量高端可乐保温杯哦~ 中国政企数智办公平台行业研究报告 融入社交能力&#xff0c;创造增长奇迹。激活用户在不同场景的社…

6个改善【客户体验】的自动电子邮件营销回复示例

关键词&#xff1a;客户体验、电子邮件营销 电子邮件自动回复器是将跨境电商的客户体验 (CX) 提升到一个新水平的一种方式。为了帮助跨境电商决定应该设置哪种自动电子邮件&#xff0c;我们汇总了对客户体验影响最大的 六个电子邮件自动回复示例。 这里有一些统计数据可以正确看…

国内各行业领域是否能通过与元宇宙和虚拟数字人的结合振兴数藏经济?

在过去几年&#xff0c; NFT和数字藏品已被广泛用于数字经济。 根据中国数字藏品行业协会早在2021年发布的市场发展报告中就指出了当年中国数字藏品市场规模达到2166亿元。 今年&#xff0c;国内元宇宙概念被炒得火热&#xff0c;从故宫博物院联合腾讯、网易等推出「故宫系列」…

关于C++11

文章目录&#x1f60d;C11优势&#x1f60e; 列表初始化&#x1f601;变量类型推导&#x1f44c;为什么需要类型推导&#x1f44d;decltype类型推导&#xff08;了解&#xff09;&#x1f61c;final 与 overridefinal&#x1f91e;override❤️默认成员函数控制&#x1f929;显…

TH10-数据统计与内容审核

TH10-数据统计与内容审核1、用户冻结解冻1.1 用户冻结ManageControllerManageService1.2 用户解冻ManageControllerManageService1.3 查询数据列表UserInfoManageService1.4 探花系统修改UserFreezeService2、数据统计2.1 数据采集2.1.1 部署RabbitMQ2.1.2 消息类型说明2.1.3 实…

使用dd+hexdump命令修改环境变量的值和升级uboot

前言 这篇写的较细&#xff0c;使用dd擦除emmc本来就是比较危险的事情&#xff0c;所以一定要细致。哪里没看明白的&#xff0c;赶紧留言问我&#xff0c;可不能存有侥幸心理。 思路大概就是&#xff1a; 1 先从emmc把数据读出来&#xff0c;放一个镜像文件里&#xff0c;使…

【整理】Python全栈技术学习路线

【整理】Python全栈技术学习路线【阶段一】Python基础Linux【阶段二】多任务编程服务器前端基础【阶段三】数据库mini Web框架【阶段四】Dhango框架美多商城项目【阶段五】DRF框架美多商城后台【阶段六】项目部署Flask框架Hm头条【阶段七】人工智能基础推荐系统基础Hm头条推荐系…

带你了解extern “C“

1.extern “C” 这个语法是c的语法。我们知道在一个.c文件中调用另一个.c中实现的函数是没有任何问题的&#xff0c;一个.cpp文件调用另一个.cpp文件中实现的函数也是没有问题的。但是我们如果想要在一个.cpp文件调用另一个.c文件中实现的函数&#xff0c;或者在一个.c文件中调…

双调序列

目录 双调序列 思路: 代码: 时间复杂度: 总结: 题目链接: 双调序列 题目描述&#xff1a; XJ编程小组的童鞋们经常玩一些智力小游戏&#xff0c;某月某日&#xff0c;小朋友们又发明了一种新的序列&#xff1a;双调序列&#xff0c;所谓的双调呢主要是满足如下条件描述…

TensorFlow之分类模型-2

1 基本概念 2 文本分类与情感分析 获取数据集 加载数据集 训练数据集 性能设置 为了提升训练过程中数据处理的性能&#xff0c;keras技术框架提供数据集缓存的功能&#xff0c;使用缓存可以避免读取磁盘数据集时由于IO消耗太多而出现性能瓶颈的问题&#xff0c;如果数据集…

操作系统的主要功能是什么

操作系统的主要功能是进程管理、存储管理、设备管理、文件管理、作业管理。 计算机系统的资源可分为设备资源和信息资源两大类。 操作系统位于底层硬件与用户之间&#xff0c;是两者沟通的桥梁。 1、进程管理&#xff0c;其工作主要是进程调度&#xff0c;在单用户单任务的情…

opcj2-盘点几个常见的Java开源脚手架

很多人抱怨自己是CURDer&#xff0c;很多时候就是在简单的修修改改。如果不书序SSM&#xff08;Spring、SpringMVC和Mybatis&#xff09;套路的人可能开始的时候会感觉非常吃力。但是熟悉之后发现其实就这么回事。SpringMVC负责响应对外接口&#xff0c;Mybatis负责数据库的访问…

TF4-圈子功能

TF4-圈子功能1、首页推荐1.1、接口分析1.2、功能实现1.2.1 controller1.2.2 service1.2.3 API接口1.2.4 请求dto对象2、MongoDB集群3、圈子功能2.1、功能说明1.2、实现方案分析1.3、技术方案(重点)1.4、表结构设计4、圈子实现3.1、环境搭建3.1.1、mongo主键自增3.1.2、实体类Mo…

基于matlab的SVM支持向量机分类仿真,核函数采用RBF函数

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 支持向量机&#xff08;support vector machines, SVM&#xff09;是二分类算法&#xff0c;所谓二分类即把具有多个特性&#xff08;属性&#xff09;的数据分为两类&#xff0c;目前主流机器学…

如何清理 docker 磁盘空间 附讲解(全)

目录前言1. Docker System 命令1.1 docker system df1.2 docker system prune2. 冗余容器或镜像3. 限制容器日志前言 补充docker知识点&#xff0c;可看我之前的文章&#xff1a;Docker零基础从入门到精通&#xff08;全&#xff09; docker 镜像特别容易占空间&#xff0c;稍…