机器学习——SVM(支持向量机)

0、前言:

  • SVM应用:主要针对小样本数据进行学习、分类和回归(预测),能解决神经网络不能解决的过学习问题,有很好的泛化能力。(注意:SVM算法的数学原理涉及知识点比较多,所以应用比理解更重要)
  • 原理:由二分类问题引出,如下图,问题是找到一条最宽的路劲划分两种分类,且路径1/2处的直线就是最优的直线。
    在这里插入图片描述
    进而将问题由二维(x轴和y轴)特征数据的分类拓展到更高维度的分类问题中,将问题转换为了多维问题,就会涉及向量和求极值,最终将支持向量的优化目标就由间隔最大化问题转化为了标准凸优化问题(标准凸优化是计算机当中数学问题的描述),然后就可以得到支持向量机算法。
  • 支持向量机算法:
    输入:m条训练数据S = {(x1,y1),(x2,y2),…,(xm,ym)}
    前提:训练数据中正负采样存在分离平面
    模型假设:H (关于w,x,b)
    计算w和b的最优解
    输出模型:H
  • 支持向量机的对偶:将求解代约束的凸优化问题转化为求解它的对偶问题。然后借助拉格朗日求解对应的函数,这个函数的意义对于二维特征来说就是一条可以划分二分类问题的最优直线,对于三维特征来说就是一个可以划分空间中二分类问题的最优平面。
  • 如下图所示就是二维特征的SVM所求直线A
    在这里插入图片描述
  • 如下图就是多维特征求最优划分的平面,因为在原始空间中,无法用一条直线划分,进而采用核技巧,将问题放到高维空间,进而划分数据,核技巧也称核变换是解决低纬度不可分问题的一个技巧。
    在这里插入图片描述
  • 支持向量机当中会有一些核函数,有线性核函数和高斯核函数。

1、支持向量机的分类示例:

  • 目的:通过sklearn.datasets中的make_blobs生成2个类型的聚类,然后用SVC模型训练数据,借助模型的属性生成分类最优分界线,同时生成支持向量对应的直线
  • 代码
# 导库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# SVM分类和回归库
from sklearn.svm import SVC,SVR
# 生成二分类数据
from sklearn.datasets import make_blobs
data,target = make_blobs(centers=2)
plt.scatter(data[:,0],data[:,1],c=target)
# 训练数据
# pd.DataFrame(data).head()
# data.shape,target.shape
sv = SVC(C=1,kernel='linear')
'''
SVC当中的参数说明:
1、C:越大表示约分类越严格,对于一些噪声就不%%sh略,可能会导致分类效果差
2、kernel:核函数,一般选默认的rbf(高斯核函数),建议使用默认,
此外还有:linear(线性核函数)、poly(多项式核函数)等
'''
sv.fit(data,target)# 画出通过SVM训练之后的最优分界线
# w1*x1+w2*x2+b=0
# 首先获取斜率和截距
# sv.coef_[0] # array([-0.69045562, -0.92961922])
# sv.coef_.shape # (1, 2)
w1,w2 = sv.coef_[0]
b = sv.intercept_[0]
# 画分界线
plt.scatter(data[:,0],data[:,1],c=target)
x1 = np.linspace(-7,-2,100)
x2 = -1 * (w1*x1+b)/w2
plt.plot(x1,x2,c='r')
# 画支持向量
x1_s = sv.support_vectors_[:,0]
x2_s = sv.support_vectors_[:,1]
plt.scatter(x1_s,x2_s,s=200,alpha=0.3,c='b')
# 画支持向量对应的直线,用虚线表示
b1 = -1*(w1*x1_s[1]+w2*x2_s[1])
b2 = -1*(w1*x1_s[2]+w2*x2_s[2])
x2_1 = -1 * (w1*x1+b1)/w2
x2_2 = -1 * (w1*x1+b2)/w2
plt.plot(x1,x2_1,linestyle='--',linewidth=5,c='r')
plt.plot(x1,x2_2,linestyle='--',linewidth=5,c='r')
  • 结果
    在这里插入图片描述

2、支持向量机回归示例:

  • 目的:用SVM算法中的SVR预测sin函数
  • 代码:
# 导包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.svm import SVR
# 制作训练数据
x = np.random.random(150)*10
y = np.sin(x)# 添加噪声
y[::5] += np.random.randn(30)*0.1plt.scatter(x,y)
# 制作测试数据
x_test = np.linspace(0,10,100)
# 训练数据
sv_line = SVR(kernel='linear')
sv_line.fit(x.reshape(-1,1),y)
y_line_pred = sv_line.predict(x_test.reshape(-1,1))sv_poly = SVR(kernel='poly')
sv_poly.fit(x.reshape(-1,1),y)
y_poly_pred = sv_poly.predict(x_test.reshape(-1,1))sv_rbf = SVR(kernel='rbf')
sv_rbf.fit(x.reshape(-1,1),y)
y_rbf_pred = sv_rbf.predict(x_test.reshape(-1,1))
# 画图
plt.scatter(x,y)
plt.plot(x_test,y_line_pred,label='line',c='r')
plt.plot(x_test,y_poly_pred,label='ploy')
plt.plot(x_test,y_rbf_pred,label='rbf')
plt.legend(loc='lower left')
  • 结果:
    在这里插入图片描述

总结:

  • 对应二维平面不可分的数据,使用高斯核函数(kernel=‘rbf’)是是最好的选择

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

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

相关文章

【ELFK】之消息队列kafka

一、kafka的定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列(MQ,Message Queue),主要应用于大数据实时处理领域。Kafka 是最初由 Linkedin 公司开发,是一个分布式、支持分区的(partition&#xff0…

复习Day03:数组part03:76 . 最小覆盖子串、438. 找到z字符串z中所有字母异位词

之前的blog链接:https://blog.csdn.net/weixin_43303286/article/details/131700482?spm1001.2014.3001.5501 我用的方法是在leetcode再过一遍例题,明显会的就复制粘贴,之前没写出来就重写,然后从拓展题目中找题目来写。辅以Lab…

中国城市政商关系健康总指数、方面指数及一级指标得分2018

中国城市政商关系健康总指数、方面指数及一级指标得分2018 1、指标:省份代码、省份、城市代码、城市名称、政商关系健康指数、亲近指数、清白指数、政府关心、政府服务、企业税负、政府廉洁度、政府透明度 2、范围:290个地级市 3、数据说明&#xff1…

pandas--->CSV / JSON

csv CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。 CSV 是一种通用的、相对简单的文…

数据集笔记:T-drive 北京出租车轨迹数据

数据地址:T-Drive trajectory data sample - Microsoft Research 1 数据描述 此数据集包含了2008年2月2日至2月8日在北京期间10,357辆出租车的GPS轨迹。此数据集中的总点数约为1500万,轨迹的总距离达到了900万公里。图1显示了两个连续点之间的时间间隔和…

多数据源Pagehelper怎么配置

1.遇到的问题 若依增加多数据源,分页报错,查了下pagehelper也要修改配置。 官方配置: 官方文档:连接多数据源sqlServer使用分页的情况下报错,不使用分页时正常。 Issue #I3NJMR 若依/RuoYi - Gitee.com 我的配置&a…

基于springboot+vue的校园资产管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

睿趣科技:抖音开通蓝V怎么操作的

在抖音这个充满创意和活力的社交媒体平台上,蓝V认证成为了许多用户的梦想之一。蓝V认证不仅是身份的象征,还可以增加用户的影响力和可信度。但是,要在抖音上获得蓝V认证并不是一件容易的事情。下面,我们将介绍一些操作步骤&#x…

Nginx负载均衡详解

一、负载均衡介绍 1、负载均衡的定义 单体服务器解决不了并发量大的请求,所以,我们可以横向增加服务器的数量(集群),然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多…

Linux 读写锁

读写锁是一把锁 /*读写锁的类型 pthread_rwlock_tpthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);int pthread_rwlock_destory(pthread_rwlock_t *rwlock);int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);int pt…

多台群晖实现按计划WOL网络自动唤醒数据冷备份

几年前买了2盘位的DS218,但是随着照片的增加已经不够用。年中购入了4盘位的群晖DS923、2块16T西数数企业级硬盘、1块2T intel企业级 SSD 1.什么是冷备份 冷备是离线备份,备份好的数据可以单独存取,定期冷备可以保证数据安全,适合…

设计模式篇---桥接模式

文章目录 概念结构实例总结 概念 桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。 毛笔和蜡笔都属于画笔,假设需要有大、中、小三种型号的画笔,绘画出12种颜色,蜡笔需要3*1236支,毛笔需要…

Unity当中的灯光类型

文章目录 前言一、Directional平行光二、Point点灯三、Spot 聚光灯四、Area面光灯,只用于烘培 前言 Unity当中的灯光类型 一、Directional平行光 Unity当中最重要的灯管类型,类似现实中的太阳光 二、Point点灯 类似现实中的灯泡,萤火虫&a…

java版网页代码生成器系统myeclipse定制开发mysql数据库网页模式java编程jdbc生成无框架java web网页

一、源码特点 java版网页代码生成器系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使…

力扣:105. 从前序与中序遍历序列构造二叉树(Python3)

题目: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 来源:力扣(LeetCode) 链接:力扣&am…

指针笔试题讲解

文章目录 题目答案与解析1、234、5、6、7、8、 题目 int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; }//由于还没学习结构体,这里告知结构体的大小是20个字节 //由于还没学习结…

第十二届钧瓷文化旅游节主题曲:让世界看见钧瓷的魅力

下面大禹智库是以产业,古镇,营销为主题专门为第十二届钧瓷文化旅游节创作的《让世界看见钧瓷的魅力》的歌词。 编辑搜图 古镇千年的沉淀,窑火燃烧的传说 传承着古老的技艺,匠人们用心铸就 钧瓷的魅力,吸引着世界的目光 这里的风景,如诗如画,如梦如幻 编辑搜图 钧瓷文…

QT程序打包图片无法正常显示

QT程序打包图片无法正常显示 环境: QT4.8.2VS2017opencv3.416 问题: 本机测试正常,图片可正常显示功能也可正常进行,但打包发送给没有环境数据的电脑上进行测试就会出现图片无法显示的问题。 原因: 并没有找到理论支撑…

代码随想录第34天 | 343. 整数拆分 96.不同的二叉搜索树

343. 整数拆分 /*** param {number} n* return {number}*/ var integerBreak function(n) {let dpnew Array(n1)dp.fill(1)for(let i3;i<n;i)for(let j1;j<i/2;j){dp[i] max(dp[i],max(j*(i-j),dp[i-j]*j))} function max(a,b){return a>b?a:b }return dp[n] }; 想…

Linxu下c语言实现socket+openssl数据传输加密

文章目录 1. Socket连接建立流程2、SocketSSL的初始化流程3、初始化SSL环境&#xff0c;证书和密钥4、SocketSSL 的c语言实现4.1 编写SSL连接函数4.2 编写加密服务端server.c4.3 编写加密客户端client.c 5、使用tcpdump检验源码获取 在进行网络编程的时候&#xff0c;我们通常使…