机器学习(13)--支持向量机

目录

一、支持向量机概述

二、Sklearn中的SVM概述

三、线性SVM损失函数

四、sklearn中进行可视化

1、导入模块

2、实例化数据集,可视化

3、网格点制作

4、建立模型并绘制决策边界和超平面

5、常用接口

6、如果数据是环形呢? 

五、核函数

1、概述

2、在不同类型数据集下使用不同核函数,进行可视化

3、核函数调参

4、惩罚项系数C


一、支持向量机概述

        支持向量机(SVM)是按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面,可以将问题转换为一个求解凸二次规划的问题。

        在线性可分情况下,要在原空间中寻找两类样本最优分类超平面,选出决策边界。在线性不可分情况下,需要加入松弛变量,通过使用非线性映射规则将空间样本升维到高维度空间,来变为线性可分,这样就可以在特征空间中寻找最优分类超平面。

        SVM在各种实际问题上都表现优秀,在手写体识别和人脸识别应用广泛,在文本和超文本分类上,因为可以大量减少标准归纳和转换设置中对标记训练实例的需求,也是举足轻重的存在。另外,SVM也被用在图像分类,图像分割系统,在生物学和其他科学上SVM也备受青睐。

支持向量机的不同功能

功能
监督学习       

线性二分类与多分类(Linear Support Vector Classfication)

非线性二分类与多分类(Support Vector Classfication,SVC)

普通连续型变量的回归(SVR)

概率型连续变量的回归(Bayesian SVM)

无监督学习

支持向量聚类(Support Vector Clustering)

异常值检测(One-class SVM)

半监督学习转导支持向量机(Transductive Support Vector Machines,TSVM)

支持向量机如何工作?

        支持向量机通过在一组分布中找出一个超平面作为决策边界,使模型在数据上的分类误差尽量小,尤其是在未知的数据集上的分类误差(泛化误差)尽量小。

        决策边界向两个簇平移,直到碰到距离这个决策边界最近的点时停下,形成两个新的超平面,即图中的两条虚线,而虚线间的距离,即蓝色箭头的距离,则为决策边界的边际d。

        边际自然是越大越好,如果说边际小,在训练集上可能score很高,但是在测试集上可能出现个别点分类错误的现象,即过拟合现象。

二、Sklearn中的SVM概述

        在sklearn中的SVM也有类和函数两种表示方法。线性类LinearSVC和LinearSVC只能支持线性,而其他的类都是可以支持线性和非线性的。

含义
svm.LinearSVC线性支持向量分类
svm.LinearSVR线性支持向量回归
svm.SVC非线性支持向量分类
svm.SVR非线性支持向量回归
svm.NuSVCNu支持向量分类
svm.NuSVRNu支持向量回归
svm.OneClassSVM无监督异常值检测
svm.l1_min_c返回参数C的最低边际
函数含义
svm.libsvm.cross_validationSVM专用的交叉验证
svm.libsvm.decision_functionSVM专用的预测边际函数
svm.libsvm.fit使用libsvm训练模型
svm.libsvm.predict给定模型预测X的目标值
svm.libsvm.predict_proba预测概率

 

三、线性SVM损失函数

         问题的关键:就是扩大边际d。

         w是参数,垂直与决策边界,x是特征向量,与数据集有关,b是截距。

为什么这三条线的右侧是1,0,-1?

        由于w和b都是参数,所以为了使式子更加简洁,两侧同时除以常数,参数只是做了一个变换。新w和新b仍然可以做为变量。

         通过一定的数学推导可以求出来,边际d=\frac{2}{||w||},而边际越大越好,所以有了损失函数f(w)=\frac{||w||^2}{2}越小越好,如果不加平方,取模运算会导致计算量变大,所以增加了平方的运算。

        损失函数计算公式:

        \underset{w,b}{min}\frac{||w||^2}{2}

subject \ to \ y_i(\mathbf{w}\cdot \mathbf{x_i}+b)\geqslant 1,i=1,2,\cdots N.

         约束条件形式:(\alpha_i是拉格朗日乘数)

         拉格朗日乘数的求解需要转化为对偶问题,这一部分过难,先不写了,晕。

        决策函数:

         其中x_{test}作为测试样本,sign函数其实就是sgn函数,括号内大于0时返回1,小于0时返回-1。

四、sklearn中进行可视化

1、导入模块

from sklearn.datasets import make_blobs   #生成聚类数据集
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

2、实例化数据集,可视化

x,y=make_blobs(n_samples=100,centers=2,random_state=0,cluster_std=0.6)
plt.scatter(x[:,0],x[:,1],c=y,s=50,cmap='rainbow')
plt.show()

3、网格点制作

        制作若干个连续的固定的网格点,为了方便后续决策边界的计算和可视化。

xlim=ax.get_xlim()    #返回上面图的x轴的最小值和最大值
ylim=ax.get_ylim()    #返回上面图的y轴的最小值和最大值#print(xlim,ylim)    #(-0.7425578984849813, 3.3721920271976598) (-0.41872382476349596, 5.754870487889891)axisx=np.linspace(xlim[0],xlim[1],30)          #根据xlim和ylim绘制网格点
axisy=np.linspace(ylim[0],ylim[1],30)
print(axisx,axisy)axisx,axisy=np.meshgrid(axisx,axisy)           #将axisx和axisy分别向y轴和x轴进行扩充(广播)xy=np.vstack([axisx.ravel(),axisy.ravel()]).T  #扩充为30*30的坐标点,后面基于这900个点绘制决策边界plt.scatter(xy[:,0],xy[:,1],s=1,cmap="rainbow")
plt.show()

4、建立模型并绘制决策边界和超平面

clf=SVC(kernel='linear').fit(x,y)                #建模
z=clf.decision_function(xy).reshape(axisx.shape) #每个样本所对应的到决策边界的距离ax=plt.gca()                                     #如果不写将不会生成决策边界
ax.contour(axisx,axisy,z,colors='k',levels=[-1,0,1],                      #代表两个过支持向量的超平面和决策边界alpha=0.5, linestyles=['--','-','--'])           #超平面使用虚线--,决策边界使用实线-ax.set_xlim(xlim)
ax.set_ylim(ylim)plt.scatter(x[:,0],x[:,1],c=y,s=50,cmap='rainbow') 
plt.show()

        可以对制作网格点和绘制决策边界和超平面做一个封装函数。

def plot_svc_decision_funtion(model,ax=None):if ax is None:ax=plt.gca()xlim = ax.get_xlim()ylim = ax.get_ylim()x=np.linspace(xlim[0],xlim[1],30)y=np.linspace(ylim[0],ylim[1],30)y,x=np.meshgrid(y,x)xy=np.vstack([x.ravel(),y.ravel()]).TP = model.decision_function(xy).reshape(x.shape)ax.contour(x,y,P,colors='k',levels=[-1,0,1],alpha=0.5,linestyles=['--','-','--'])ax.set_xlim(xlim)ax.set_ylim(ylim)plt.show()

        当建模,并绘图时只需要使用如下的代码:

plt.scatter(x[:,0],x[:,1],c=y,s=50,cmap='rainbow')
plot_svc_decision_funtion(clf)

        绘制效果:

5、常用接口

clf.predict(x)               #返回预测的label
clf.score(x,y)               #评分(建模时要分训练集和测试集,要不然分数是1)
clf.support_vectors_         #返回支持向量的坐标(说白了就是在-1和1的超平面线上的点)
clf.n_support_               #返回在两个分类下的支持向量个数

6、如果数据是环形呢? 

        环形数据如果使用线性SVM进行分类,效果非常的差,引出核函数。

x,y=make_circles(n_samples=50,factor=0.1,random_state=0,noise=0.1)
plt.scatter(x[:,0],x[:,1],c=y,s=50,cmap='rainbow')
plt.show()

五、核函数

1、概述

        核函数可以将m维空间的内积运算转化为低维空间的核函数计算,从而解决了在高维特征空间上计算“维度诅咒”的灾难。

        在Sklearn中就是参数kernel,常用的核函数有Linear线性,poly多项式,rbf径向基核函数,sigmoid核函数等。

常见的核函数计算公式:

线性核函数:k(x,y)=x^Ty+c

多项式核函数:k(x,y)=(ax^Ty+c)^d

径向基核函数:k(x,y)=exp(-\gamma||x-y||^2)=exp(-\frac{||x-y||^2}{2\sigma^2})

Sigmoid核函数:k(x,y)=tanh(ax^T+c)

不同核函数的特点:

线性核函数:简单,求解快,奥卡姆剃刀,可解释性强

多项式核函数:可解决非线性问题,参数较多,对大数量级特征不适用

径向基核函数:可以映射到无限维,决策边界更多样,只有一个参数,更容易选择,特征多时会选用。但可解释性差,容易过拟合,计算速度较慢。

Sigmoid核函数:主要用于神经网络。

如果发现径向基核函数,在多特征下效果不明显,可以descripe数据集,数据集可能有量纲不统一或者偏态问题,可以对数据集进行归一化处理,使数据集保证正态分布。

2、在不同类型数据集下使用不同核函数,进行可视化

2.1建立不同类型数据集

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap       #绘图
from sklearn.svm import SVC
from sklearn.datasets import make_circles ,make_moons,make_blobs,make_classificationn_samples=100
#建立月亮型,环形,聚类,二分类型数据集
datasets=[make_moons(n_samples=n_samples,noise=0.2,random_state=0),make_circles(n_samples=n_samples,noise=0.2,random_state=1),make_blobs(n_samples=n_samples,centers=2,random_state=5),make_classification(n_samples=n_samples,n_features=2,n_informative=2,n_redundant=0,random_state=5)#n_informative:相关特征 n_redundant:冗余特征
]

2.2建立20个子图

nrows=len(datasets)     #4
ncols=len(Kernel)+1     #5fig,axes=plt.subplots(nrows,ncols,figsize=(16,12))   #4行5列的20个子图

2.3使用不同核函数建模后可视化

for ds_cnt,(x,y) in enumerate(datasets):#第一层循环,绘制数据集的分散情况ax=axes[ds_cnt,0]if ds_cnt ==0:                   #只在第一列的第一个图上添加标题ax.set_title('Input data')ax.scatter(x[:,0],x[:,1],c=y,zorder=10,cmap=plt.cm.Paired,edgecolors='k')    #plt.cm.Paired配对颜色映射,对比度极强ax.set_xticks(())ax.set_yticks(())#第二层循环,在不同核函数下进行循环,绘图在第二列到第五列for est_idx,kernel in enumerate(Kernel):#定义子图位置ax=axes[ds_cnt,est_idx+1]#建立模型svc,计算评分clf=SVC(kernel=kernel,gamma=2).fit(x,y)score=clf.score(x,y)#绘制数据本身分布散点图ax.scatter(x[:,0],x[:,1],c=y,zorder=10,cmap=plt.cm.Paired,edgecolors='k')#绘制支持向量ax.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=50,facecolors='none',zorder=10,edgecolors='k')#绘制决策边界x_min, x_max = x[:, 0].min() - .5, x[:, 0].max() + .5   #决策边界略大于所有的点围成的区域边界y_min, y_max = x[:, 1].min() - .5, x[:, 1].max() + .5#若干个坐标点,mgrid合并了linspace和meshgrid,表示为[min,max,step]xx,yy=np.mgrid[x_min:x_max:200j,y_min:y_max:200j]#np.c_类似于np.vstackz=clf.decision_function(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)#填充等高线不同颜色ax.pcolormesh(xx,yy,z>0,cmap=plt.cm.Paired)#绘制等高线ax.contour(xx,yy,z,colors='k',linestyles=['--','-','--'],levels=[-1,0,1])#坐标轴不显示ax.set_xticks(())ax.set_yticks(())#在第一行的图上打标签if ds_cnt == 0 :ax.set_title(kernel)#在图上加评分ax.text(0.95,0.06,('%.2f'%score).lstrip('0'),size=15,bbox=dict(boxstyle='round',alpha=0.8,facecolor='white'),   #填充白色0.8透明度圆框transform=ax.transAxes,                                    #保证坐标轴为原来坐标轴horizontalalignment='right')                               #水平靠右
plt.tight_layout()    #紧密排布子图
plt.show()

3、核函数调参

        核函数调参一般有gamma,degree,coef0三个参数,对于不同核函数在三个参数上也有不同的影响。

input表达式gammadegreecoef0
'linear'k(x,y)=x^TyNoNoNo
'poly'k(x,y)=(\gamma x^Ty+r)^dYesYesYes
'sigmoid'k(x,y)=tanh(\gamma x^T+r)YesNoYes
'rbf'k(x,y)=e^{(-\gamma||x-y||^2)}YesNoNo

        其中除了线性核函数以外,其他核函数还要受到gamma(\gamma),degree(d),coef0(常数r)的影响。

参数含义
degree整数,可不填,默认为3
gamma

浮点数,可不填,默认为'auto'

输入‘auto’,使用1/n_features

输入‘scale’,使用1/(n_features*x.std())

输入‘auto_deprecated’,表明没有传递明确gamma值

coef0

浮点数,可不填,默认为0.0

4、惩罚项系数C

        惩罚项系数C也作为SVM调参的重点,用于权衡‘训练样本正确分类’和‘决策函数的边际最大化’,C越高越会扩大化边界,决策功能更简单。浮点数,默认状况下为1,必须大于等于0,可以使用网格搜索或学习曲线来调整C的值。

参考视频:c7 2.3.2 重要参数C & 总结_哔哩哔哩_bilibili​​​​​​

参考书籍:《机器学习》周志华

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

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

相关文章

mysql什么情况下行锁(表锁)(锁的概念)

1:数据表aa的设计结构 2: 使用navicat编写手动控制事务 3:先选择开启事务和执行更新操作,where b1(表锁)是不带索引,不提交事务,(如果where b1,b是索引就行锁…

Spring MVC 系列2 -- 创建连接、获取与输出

上个系列总结了关于Spring MVC 项目的一些基础 ,Spring MVC就是在Spring Boot的基础上引入了Spring Web依赖.接下来就进行总结一下Spring MVC项目的创建,连接,获取参数,输出响应. 目录 1. Spring MVC 创建和连接 1.1 创建Spring MVC 项目实现与浏览器互通 1.2 RequestMapping…

DEVICENET转ETHERNET/IP网关devicenet怎么读

远创智控YC-EIP-DNT,你听说过吗?这是一款自主研发的ETHERNET/IP从站功能的通讯网关,它能够连接DEVICENET总线和ETHERNET/IP网络,从而解决生产管理系统中协议不同造成的数据交换互通问题。 这款产品在工业自动化领域可谓是一大利…

【Linux】Linux工具

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 一、Linux安装软件: 1.yum安装 2.Linux和Windows文件互传 问题: 3.yum卸载软件 二、vim编辑器 1.命令模式 2.vim配置项说明 3.vim操作总结 一、Linux安装软件&#…

flask计算pin码

目录 Flask计算pin码 <1> 概念 什么是pin码&#xff1f; pin码生成条件&#xff1f; 读取相关文件绕过过滤 <2> 源码分析 werkzeug 1.0.x版本 计算PIN的源码 werkzeug 2.0.x版本 计算PIN的源码 <3> 计算生成pin的脚本 CTF中 flask-pin的应用 <1…

利用windows恶意软件获取windows主机shell

实验目的&#xff1a; 模拟黑客利用windows恶意软件获取windows主机shell权限的过程 熟悉操作使用的命令实验准备&#xff1a; kali 同网段的windows主机&#xff08;关闭防火墙&#xff09; msfvenom是一个Metasploit独立的有效负载生成器&#xff0c;也是msfpayload和msfenco…

科技成果鉴定报告的重要性

科技成果鉴定是评估科技成果价值、可行性和科学性的过程&#xff0c;鉴定结果直接关系到科技成果的应用和推广。科技成果鉴定报告是鉴定结果的呈现和总结&#xff0c;对于科技成果的评估和利用具有重要的价值和意义。 1、科技成果价值评估&#xff1a;在科技创新和技术发展中…

使用SpringBoot+React搭建一个Excel报表平台

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 Excel报表平台是一款功能强大、操作简单的系统平台&#xff0c;可以帮助用户上传…

漏洞复现 || eGroupWare spellchecker.php 远程命令执行漏洞

0x01 阅读须知 我爱林的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用…

多肽合成定制756500-22-8,cyclo(Arg-Gly-Asp-d-Phe-Glu),试剂信息说明

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 英文名称&#xff1a;cyclo(Arg-Gly-Asp-d-Phe-Glu) 规格标准&#xff1a;1g、5g、10g CAS&#xff1a;756500-22-8 分子式&#xff1a;C26H36N8O9 分子量&#xff1a;604.61 ------cyclo(Arg-Gly-Asp-d-Phe-Glu)结构式-…

windows安装使用 tesseract-ocr

OCR&#xff08;Optical character recognition&#xff0c;光学字符识别&#xff09;是一种将图像中的手写字或者印刷文本转换为机器编码文本的技术。 tesseract-ocr 是由Google开发&#xff0c;支持100多种语言 文档 tessdoc&#xff1a; https://tesseract-ocr.github.io…

【LeetCode】HOT 100(26)

题单介绍&#xff1a; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数据结构的新手和想要在短时间内高效提升的人&#xff0c;熟练掌握这 100 道题&#xff0c;你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…