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

目录

一、支持向量机概述

二、Sklearn中的SVM概述

三、线性SVM损失函数

四、sklearn中进行可视化

1、导入模块

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

3、网格点制作

4、建立模型并绘制决策边

目录

一、支持向量机概述

二、Sklearn中的SVM概述

三、线性SVM损失函数

四、sklearn中进行可视化

1、导入模块

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

3、网格点制作

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

5、常用接口

6、如果数据是环形呢? 

五、核函数

1、概述

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

3、核函数调参

4、惩罚项系数C

六、相关评估指标

1、混淆矩阵

2、精确率

3、准确率和召回率

4、特异性与FPR

5、F1-score和Fβ-score

6、ROC和AUC

7、sklearn中的指标 


一、支持向量机概述

        支持向量机(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的值。

六、相关评估指标

1、混淆矩阵

        在机器学习中,混淆矩阵(confusion matrix)主要用于比较分类结果和实际预测值,可以把分类的结果的精度显示在一个混淆矩阵中。

        TP(True Positive)真正类,样本真实类别为正,预测为正。

        FP(False Positive)假正类,样本真实类别为负,预测为正。

        TN(True Negative)真负类,样本真实类别为正,预测为负。

        FN(False Negative)假负类,样本真实类别为负,预测为负。

真实值
10
预测值1TPFP
0FNTN

2、精确率

        精确率是最常用的分类性能指标,可以用来表示模型的精度,模型的精度越高,说明模型的效果越好。

        Accuracy=(TP+TN)/(TP+FN+TN+FP)

3、准确率和召回率

        准确率(Precision):表示样本预测为正类中,样本真实类别为正类的比例。准确率越高,模型效果越好。

        Precision=TP/(TP+FP)

        召回率(Recall):表示真实类别为正类中,样本预测为正类的比例。召回率越高,模型效果越好。

        Recall=TP/(TP+FN)

4、特异性与FPR

        特异性(Specificity):表示样本预测为负类中,样本真实为负类的比例。

        FPR:模型识别为正类的负类样本中占所有负类样本的比例,FPR越低越好。

        FPR=FP/(TN+FP)=1-Specificity

5、F1-score和Fβ-score

        Fβ-score:对于准确率和召回率的加权平均,召回率是准确率的β倍

        F\beta-Score=(1+\beta^2)\frac{Precision\cdot Recall}{(\beta^2\cdot Precision)+Recall}

        常用的F1-score,是将参数β=1时的取值,是统计学中用来衡量二分类模型精确度的一种指标,被定义为正确率和召回率的调和平均数,取值范围是0-1,越接近1,模型效果越好。

        F1-Score=\frac{2 \cdot Precision \cdot Recall}{Precision+Recall}

6、ROC和AUC

        ROC曲线(接收者操作特征Receiver operating charcteristic),横坐标为负正类率(FPR),纵坐标为真正类率(TPR),可以根据测试样本上表现的TPR和FPR对调整分类时所指定的阈值。

        AUC(Area under roc curve)代表ROC曲线与横纵坐标轴所围成的面积,面积一般介于0.5-1.0之间(优于随机猜测),AUC的面积越大,ROC曲线越靠近(0,1)点,更加弯曲,远离角分线,则模型的效果越好。AUC==0.5时为随机猜测时的面积,即y=x曲线。

        

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

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

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

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

相关文章

机器学习技术(三)——机器学习实践案例总体流程

机器学习实践案例总体流程 文章目录 机器学习实践案例总体流程一、引言二、案例1、决策树对鸢尾花分类1.数据来源2.数据导入及描述3.数据划分与特征处理4.建模预测 2、各类回归波士顿房价预测1.案例数据2.导入所需的包和数据集3.载入数据集,查看数据属性&#xff0c…

四个按键控制led的四种变化(按键控制led)(附源码)

文章目录 一、实验任务二、系统框图三、代码实现四、引脚分配五、总结 一、实验任务 使用开发板上的四个按键控制四个LED灯。按下不同的按键时,四个LED灯显示不同效果。本实验是在EP4CE6F17C8开发板上实现,仿真请用modelsim Altera 二、系统框图 三、代…

揭秘GPT-4;Adobe Firefly AI 扩大测试规模

🦉 AI新闻 🚀 Adobe Firefly AI 扩大测试规模,支持100多种语言的输入 摘要:Adobe宣布扩大测试规模,Adobe Firefly AI现在支持100多种语言的 prompts 输入。网页测试版Firefly已经扩充了罗马尼亚语等多种语言&#xf…

MacOS使用USB接口与IPhone进行Socket通信

演示效果如下: 开源地址: GitHub - rsms/peertalk: iOS and Mac Cocoa library for communicating over USB 克隆源码: git clone https://github.com/rsms/peertalk.git 克隆后打开peertalk然后启动xcode工程 先启动MacOS服务端工程,再启动iOS客户端工程 客户端 服务端

微信小程序安装和使用 Vant Weapp 组件库

微信小程序安装和使用 Vant Weapp 组件库 1. Vant Weapp 介绍2. Vant Weapp 的 安装2.1. 通过npm安装2.2. 构建npm2.3. 修改 app.json2.4. 修改 project.congfig.json2.5. 测试一下,使用Vant Weapp提供的组件 1. Vant Weapp 介绍 Vant 是一个轻量、可靠的移动端组件…

极智开发 | ubuntu交叉编译aarch64 boost

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文介绍一下 ubuntu交叉编译aarch64 boost。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接&#xf…

opencv -10 基础运算之 图像加权和(图像融合图像修复视频合成)

什么是图像加权和? 所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为: dst saturate(src1 𝛼 src2 𝛽 𝛾)式中,satu…

C# Linq 详解二

目录 概述 七、OrderBy 八、OrderByDescending 九、Skip 十、Take 十一、Any 十二、All C# Linq 详解一 1.Where 2.Select 3.GroupBy 4.First / FirstOrDefault 5.Last / LastOrDefault C# Linq 详解二 1.OrderBy 2.OrderByDescending 3.Skip 4.Take 5.Any 6.All C#…

arm day2

汇编实现1到100的累加 .text .global _start_start:mov r0,#0loop:add r0,#1add r1,r0cmp r0,#100blne loopstop:b stop结果为0x13ba等于5050

python的魔法函数

一、介绍 在Python中,魔法函数是以双下划线__开头和结尾的特殊函数。它们在类定义中用于实现特定的行为,例如运算符重载、属性访问、迭代等。 以下是一些常见的Python魔法函数: __init__: 这是一个特殊的构造函数,在创建类的实例…

Web_php_include

代码审计 进入环境&#xff0c;根据题目的提示&#xff0c;本题考察文件包含漏洞 <?php show_source(__FILE__); echo $_GET[hello]; $page$_GET[page]; while (strstr($page, "php://")) {$pagestr_replace("php://", "", $page); } incl…

解决Ruoyi单体版本集成Echarts多图表时在Tab模式下不展示问题

目录 背景 一、Tab拆分后无法展示 1、环境简介 2、原始报表功能说明 3、tab切分遇到的问题 二、问题分析及解决 1、问题分析 2、问题解决 3、初始化时图表渲染 4、Tab切换时重渲 总结 背景 最近在使用ruoyi的单体化版本进行Echarts多图表展示时遇到一个问题&#xff0c;r…

苍穹外卖day03——菜品管理业务代码开发

目录 公共字段自动填充——问题分析和实现思路 公共字段自动填充——代码实现(1) 公共字段自动填充——代码实现完善(2) 新增菜品——需求分析与设计 产品原型 ​编辑 接口设计 ​编辑 数据库设计 新增菜品——代码开发1(文件上传接口) 配置文件 Controller层代码 前后…

Java经典面试解析:服务器卡顿、CPU飙升、接口负载剧增

01 线上服务器CPU飙升&#xff0c;如何定位到Java代码 解决这个问题的关键是要找到Java代码的位置。下面分享一下排查思路&#xff0c;以CentOS为例&#xff0c;总结为4步。 第1步&#xff0c;使用top命令找到占用CPU高的进程。 第2步&#xff0c;使用ps –mp命令找到进程下…

无线电音频-BPA600蓝牙协议分析仪名词解析

1 介绍 2 Baseband基带分析 (1)Delta 是什么含义? "Delta" 有多个含义,取决于上下文。以下是常见的几种含义: 希腊字母:Delta&#x

Linux(centos7)下安装mariadb10详解

MariaDB 和 MySQL 之间存在紧密的关系。 起源&#xff1a;MariaDB 最初是作为 MySQL 的一个分支而创建的。它的初始目标是保持与 MySQL 的兼容性&#xff0c;并提供额外的功能和性能改进。 共同的代码基础&#xff1a;MariaDB 使用了 MySQL 的代码基础&#xff0c;并在此基础上…

Docker 常用命令

docker命令大全 命令说明docker attach将本地标准输入、输出和错误流附加到正在运行的容器docker build从 Dockerfile 构建镜像docker builder管理构建docker checkpoint管理检查点docker commit从容器的更改中创建新图像docker config管理 Docker 配置docker container管理容器…

如何清除视频和照片中水印的几种方式

文章目录 如何清除视频和照片中水印的几种方式一、清除视频中水印的几种方式1、截除水印区域2、模糊水印区域3、使用人工智能技术工具3.1 通过【iMyFone-MarkGo[^1]】消除水印3.2 通过【嗨格式视频转换器[^2]】消除水印3.3 通过【PR 视频编辑器】消除水印3.4 通过 【美图秀秀】…

【Linux】网络基础之UDP协议

目录 &#x1f308;前言&#x1f338;1、传输层&#x1f33a;2、重谈端口号&#x1f368;2.1、端口号范围划分&#x1f367;2.2、认识知名端口号 &#x1f340;3、UDP协议&#x1f368;3.1、UDP协议报文结构&#x1f369;3.2、UDP协议的特点&#x1f36a;3.3、基于UDP的应用层协…

openwrt 阿里云盘webdav 转成 samba4挂载

需要rclone 与samba4-server rclone 吧webdav挂载到openwrt的某个目录下。 然后通过samba-server 挂载出去。 安装rclone sudo -v ; curl https://rclone.org/install.sh | sudo bash 安装fuse opkg install fuse-utils 软连接 ln -s /usr/bin/fusermount /usr/bin/fuse…