机器学习之SVM分类器介绍——核函数、SVM分类器的使用

news2024/11/17 9:35:08

系类文章目录

机器学习算法——KD树算法介绍以及案例介绍

机器学习的一些常见算法介绍【线性回归,岭回归,套索回归,弹性网络】

文章目录

一、SVM支持向量机介绍

1.1、SVM介绍

1.2、几种核函数简介

a、sigmoid核函数

 b、非线性SVM与核函数

重要参数kernel作为SVC类最重要的参数之一,“kernel"在sklearn中可选以下几种选项:​编辑c、kernel=“poly”

d、kernel=“rbf” 和 gamma

二、SVM案例介绍

2.1、利用波斯顿房价数据对SVM支持向量机使用不同核函数处理数据

2.2、利用鸢尾花数据进行SVM分类

总结


前言

本文简单介绍SVM分类器、以及核函数、SVM分类器的应用。以下案例经供参考

一、SVM支持向量机介绍

1.1、SVM介绍

  • SVM是按照监督类学习方式进行运作的。即:数据当中含有目标值。
  • SVM采用监督学习方式,对数据进行二分类(这点跟逻辑回归一样)。但是,SVM和逻辑回归(LR)有有很多不同点。

两者的相同点

  • 二者都是线性分类器
  • 二者都是监督学习算法
  • 都属于判别模型(KNN, SVM, LR都属于判别模型),所谓判别模型就是指:通过决策函数,判别各个样本之间的差别来进行分类。
  • 二者的损失函数和目标函数不一样。
  • 二者对数据和参数的敏感度不同。SVM由于采用了类似于“过度边界”的方式,泛化能力更好

SVM可以作线性分类器,但是在引入核函数(Kernel Method)之后,也可以进行非线性分类

1.2、几种核函数简介

a、sigmoid核函数

 b、非线性SVM与核函数

重要参数kernel & degree & gamma

重要参数kernel
作为SVC类最重要的参数之一,“kernel"在sklearn中可选以下几种选项:
在这里插入图片描述c、kernel=“poly”

  • 方法一:

多项式思维:扩充原本的数据,制造新的多项式特征;(对每一个样本添加多项式特征)

步骤

  1. PolynomialFeatures(degree = degree):扩充原始数据,生成多项式特征;
  2. StandardScaler():标准化处理扩充后的数据;
  3. LinearSVC:使用 SVM 算法训练模型;
  • 方法二:

使用scikit-learn 中封装好的核函数: SVC(kernel=‘poly’, degree=degree, C=C)
**功能:**当 SVC() 的参数 kernel = ‘poly’ 时,直接使用多项式特征处理数据;
:使用 SVC() 前,也需要对数据进行标准化处理

d、kernel=“rbf” 和 gamma

1、高斯核函数、高斯函数
在这里插入图片描述

  • μ:期望值,均值,样本平均数;(决定告诉函数中心轴的位置:x = μ)
  • σ2:方差;(度量随机样本和平均值之间的偏离程度:为总体方差,为变量, 为总体均值, 为总体例数)
  1. 实际工作中,总体均数难以得到时,应用样本统计量代替总体参数,经校正后,样本方差计算公式:$S^2= \sum (X-μ)^2/(n-1) $为样本均值,n为样本例数。
  • σ:标准差;(反应样本数据分布的情况:σ 越小高斯分布越窄,样本分布越集中;σ 越大高斯分布越宽,样本分布越分散)
  • γ = 1 / (2 σ 2 σ^2σ2 ):γ 越大高斯分布越窄,样本分布越集中;γ 越小高斯分布越宽,样本分布越密集;

 超参数 γ 值越小模型复杂度越低,γ 值越大模型复杂度越高

Sigmoid核函数,它在非线性数据上强于两个线性核函数,但效果明显不如rbf,它在线性数据上完全比不上线性的核函数们,对扰动项的抵抗也比较弱,所以它功能比较弱小,很少被用到。

rbf,高斯径向基核函数基本在任何数据集上都表现不错,属于比较万能的核函数。我个人的经验是,无论如何先试试看高斯径向基核函数,它适用于核转换到很高的空间的情况,在各种情况下往往效果都很不错,如果rbf效果不好,那我们再试试看其他的核函数。另外,多项式核函数多被用于图像处理之中

1.线性核,尤其是多项式核函数在高次项时计算非常缓慢
2.rbf和多项式核函数都不擅长处理量纲不统一的数据集

二、SVM案例介绍

2.1、利用波斯顿房价数据对SVM支持向量机使用不同核函数处理数据

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
import warnings#引入警告信息库
warnings.filterwarnings('ignore')#过滤警告信息
#导入波斯顿房价数据
from sklearn.datasets import load_boston
boston = load_boston()
#导入数据集拆分工具
from sklearn.model_selection import train_test_split
#建立训练数据集和测试数据集
X,y = boston.data,boston.target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state = 8)
#打印训练集与测试集状态
print('train datasets size:',X_train.shape)
print('test datasets size:',X_test.shape)
print('\n')
from sklearn.svm import SVR
for kernel in ['linear','rbf','sigmoid']:
    svr = SVR(kernel = kernel,gamma = 'auto')
    svr.fit(X_train,y_train)
    print(kernel,'核函数的模型训练集得分:{:.3f}'.format(svr.score(X_train,y_train)))
    print(kernel,'核函数的模型测试集得分:{:.3f}\n'.format(svr.score(X_test,y_test)))
#导入数据预处理工具
from sklearn.preprocessing import StandardScaler
#对数据集进行数据预处理
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
#用预处理后的数据查询训练模型
for kernel in ['linear','rbf','sigmoid']:
    svr = SVR(kernel = kernel)
    svr.fit(X_train,y_train)
    print('数据预处理后',kernel,'核函数的模型训练集得分:{:.3f}'.format(svr.score(X_train,y_train)))
    print('数据预处理后',kernel,'核函数的模型测试集得分:{:.3f}\n'.format(svr.score(X_test,y_test)))
svr = SVR(C = 100,gamma = 0.1,kernel = 'rbf')
svr.fit(X_train_scaled,y_train)
print('调节参数后的''rbf内核的SVR模型训练集得分:{:.3f}'.format(svr.score(X_train_scaled,y_train)))
print('调节参数后的''rbf内核的SVR模型测试集得分:{:.3f}\n'.format(svr.score(X_test_scaled,y_test)))

程序运行结果:

train datasets size: (379, 13)
test datasets size: (127, 13)


linear 核函数的模型训练集得分:0.709
linear 核函数的模型测试集得分:0.696

rbf 核函数的模型训练集得分:0.145
rbf 核函数的模型测试集得分:0.001

sigmoid 核函数的模型训练集得分:-0.024
sigmoid 核函数的模型测试集得分:-0.027

数据预处理后 linear 核函数的模型训练集得分:0.709
数据预处理后 linear 核函数的模型测试集得分:0.696

数据预处理后 rbf 核函数的模型训练集得分:0.192
数据预处理后 rbf 核函数的模型测试集得分:0.222

数据预处理后 sigmoid 核函数的模型训练集得分:0.059
数据预处理后 sigmoid 核函数的模型测试集得分:0.075

调节参数后的rbf内核的SVR模型训练集得分:0.966
调节参数后的rbf内核的SVR模型测试集得分:0.894

2.2、利用鸢尾花数据进行SVM分类

#使用svm分类器实现鸢尾花数据的分类
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
from matplotlib.colors import ListedColormap
#import warnings#引入警告信息库
#warnings.filterwarnings('ignore')#过滤警告信息
#导入鸢尾花数据集,总共150
from sklearn import datasets
from sklearn import svm
from sklearn.linear_model import LogisticRegression

iris = datasets.load_iris()
x=iris.data[:,:2]
print("Train data size:",np.shape(x))
y=iris.target
plt.figure(2)
for i in range(len(y)):
    if y[i]==0:
        p0=plt.scatter(x[i,0],x[i,1],alpha=1,c='r',marker='s')
    elif y[i]==1:
        p1=plt.scatter(x[i,0],x[i,1],alpha=1,c='b',marker='*')
    else:
        p2=plt.scatter(x[i,0],x[i,1],alpha=1,c='green',marker='o')
plt.legend([p0,p1,p2],['0','1','2'],loc = 'upper left')
plt.title('鸢尾花样本分布图')
plt.show()
print(40*'*')


gamma=50
svc=svm.SVC(kernel='rbf',C=10,gamma=gamma)
svc.fit(x,y)
print('SV number:',svc.support_)
print('SV set:',svc.support_vectors_)
print('SVC score:',svc.score(x,y))
print(40*'*')
logi = LogisticRegression(C=1.0,penalty='l2',solver='sag',max_iter=1000)

svc_linear=svm.SVC(C=1.0,kernel="linear")

svc_poly=svm.SVC(C=1.0,kernel="poly",degree=7)

svc_rbf1=svm.SVC(C=1.0,kernel="rbf",gamma=0.5)

svc_rbf2=svm.SVC(C=1.0,kernel="rbf",gamma=50)
clfs=[logi,svc_linear,svc_poly,svc_rbf1,svc_rbf2]
titles=["逻辑斯蒂回归",'线性回归函数SVM','7阶多项式核函数SVM','RBF核函数(gamma=0.5)','RBF核函数(gamma=50)']

for clf,i in zip(clfs,range(len(clfs))):
    clf.fit(x,y)
    print(titles[i],'在全体样本集上的性能评分:',clf.score(x,y))
print(40*'*')
def plot_decision_regions(X,y,classifier,resolution = 0.01):
    markers = ('s','x','o','^','v')
    colors = ('r','b','green','k','ightgreen')
    #通过ListedColormap从颜色列表创建色度图,为每个分类分配一个颜色
    #用于将数字映射到颜色或者以以为颜色数组进行颜色规格转换
    #用于生成网格矩阵区域,程序中根据属性上下进行自动调整
    cmap = ListedColormap(colors[:len(np.unique(y))])
    x1_min = np.floor(X[:,0].min()-0.5)
    x1_max = np.ceil(X[:,0].max()+0.5)
    x2_min = np.floor(X[:,1].min()-0.5)
    x2_max = np.ceil(X[:,1].max()+0.5)
    #创建网格阵列
    xx1,xx2 = np.meshgrid(np.arange(x1_min,x1_max+resolution,resolution),np.arange(x2_min,x2_max+resolution,resolution))
    #xx1,xx2 = np.meshgrid(np.linspace(x1_min,x1_max,int((x1_max-x1_min)/resolution)),np.linspace(x2_min,x2_max,int((x1_max-x2_min)/resolution)))
    #用predict方法预测相关的网格点的分类标签
    Z = classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1,xx2,Z,alpha = 0.3,cmap = cmap)#画出函数的轮廓图
    plt.xlim(x1_min,x1_max)
    plt.ylim(x2_min,x2_max)
    for idx,cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y==cl,0],y=X[y==cl,1],alpha=1.0,c=colors[idx],label=cl)
for clf,i in zip(clfs,range(len(clfs))):
    clf.fit(x,y)
    plt.figure(i)
    plot_decision_regions(x,y,classifier=clf)
    plt.xlabel('Sepal Length')
    plt.ylabel('Sepal width')
    plt.title(titles[i])                
plt.show()

程序运行结果:

Train data size: (150, 2)

****************************************
SV number: [  3   4   6   8  10  13  14  15  16  17  18  21  22  23  24  25  26  27
  28  29  30  31  32  33  34  35  36  37  41  42  43  45  46  47  48  50
  51  52  53  54  56  57  58  59  60  61  62  64  65  67  68  69  70  72
  73  74  75  76  77  78  79  81  82  83  84  85  86  87  88  89  90  91
  92  93  94  95  97  98  99 100 101 102 103 104 105 106 107 108 109 110
 111 112 113 114 115 117 118 119 120 121 122 123 124 125 126 127 128 129
 130 131 132 134 135 136 137 138 139 140 141 142 144 145 146 147 148 149]
PS:此处我省略了一部分结果集
SVC score: 0.9266666666666666
****************************************
逻辑斯蒂回归 在全体样本集上的性能评分: 0.8133333333333334
线性回归函数SVM 在全体样本集上的性能评分: 0.82
7阶多项式核函数SVM 在全体样本集上的性能评分: 0.8266666666666667
RBF核函数(gamma=0.5) 在全体样本集上的性能评分: 0.8266666666666667
RBF核函数(gamma=50) 在全体样本集上的性能评分: 0.8933333333333333
****************************************

总结

以上就是对SVM分类器的部分介绍,希望对初学者有所帮助。

最后欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

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

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

相关文章

运行时内存数据区之堆(一)

堆(Heap) 堆的核心概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。《Java虚拟机规范》规定…

“行泊舱”+出海全面发力,这家ADAS厂商跑出规模化“新速度”

进入2023年,智能汽车市场已经由纯技术驱动迈入了市场驱动的新周期,接下来的市场竞争比拼的重点将是真正的规模化普及。 《高工智能汽车研究院》认为,中国乘用车市场已经来到了L2普及、L2冲刺发力以及L3/L4小规模落地的并行发展周期。对于智能…

AI工具应该成为开发者的帮手

前言 作为一名大前端开发者来说,最看重的就是web3.0的进一步发展以及推广速度。说到web3.0就不得不说元宇宙,就拿今年的支付宝集五福活动,就用到了元宇宙的功能:福气乐园,这也是为什么元宇宙越来越成为触手可及的&…

Ubuntu 自带截图工具快捷键盘

PrtSc – 获取整个屏幕的截图并保存到 Pictures 目录。 Shift PrtSc – 获取屏幕的某个区域截图并保存到 Pictures 目录。 Alt PrtSc –获取当前窗口的截图并保存到 Pictures 目录。 Ctrl PrtSc – 获取整个屏幕的截图并存放到剪贴板。 Shift Ctrl PrtSc – 获取屏幕的某个…

嚣张|微软“光明正大”要数据,Access用户怎么办?WPS笑了

微软“光明正大”要数据 继微软“数据门”事件之后,微软又开始出“幺蛾子”了。 最近,电脑是windows11会提示:你的数据将在所在国家或地区之外进行处理。 最让用户感到霸道的是,竟然没有“跳过”按钮。只能点击继续,…

MyBatis学习总结(五)逆向工程

MyBatis学习总结(五)逆向工程 一、MyBatis的逆向工程 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支持正向工 程的。逆向工程:先创建数据库表,由框架负责根据数据库表&am…

操作系统(四)——文件管理

文章目录 第四章 文件管理[4.1.1] 初识文件管理(一)文件的属性(二)文件内部的数据应该怎样组织起来(三)文件之间应该怎样组织起来(四)操作系统应该向上提供哪些功能(五&a…

geoserver发布矢量切片服务

以前切片服务只支持栅格切片,后来技术更新发展,也支持矢量切片了,好处是不失真,而且很快,geoserver本身也不支持这种服务,但是他提供了一个插件,去官网下载下来,放到lib文件夹里&…

2023/4/16周报

目录 摘要 论文阅读 1、标题和现存问题 2、模型构建 3、方法实现 4、实验结果 5、扩展实验 深度学习 1、GNN特点 2、原理 3、GNN数据处理 总结 摘要 本周在论文阅读上,阅读了一篇基于图神经网络的技术识别链接预测方研究论文。通过融合了时间特征的专利…

镭速Raysync v6.6.8.0版本发布

最近镭速发布了v6.6.8.0版本,已经发布上线了。主要更新内容有服务器下发任务支持指定客户端,客户端增加日志清理和日志压缩,自动删除源文件保持源目录结构,支持将文件投递给其他成员等功能,详细的更新内容如下&#xf…

ELK日志收集告警

elastic stack elastic search 日志持久化filebeats 日志收集kibana 日志展示elaticalert 日志告警 elastalert官网Elastic Observability APM 指标监控 java-agent 基于logback根据level进行日志的切分聚合宿主机上安装filebeats 配置inputs插件配置采集路径配置多行匹配规则…

第五天 CUDA Runtime API

图中可以看到,Runtime API 是基于 Driver API 之上开发的一套 APIDriver API 基本都是 cu 开头的,而Runtime API 基本都是以 cuda 开头的 Runtime API 概述 CUDA Runtime是封装了CUDA Driver的高级别更友好的APIcudaruntime需要引入cudart这个so文件上下…

系统分析师案例题【系统设计篇(Web开发)】

目录 1、Web综合知识考察 2、单台机器到数据库与Web服务器分离 3、应用服务器集群 3.1 负载均衡 3.2 Session 共享机制 3.3 有状态和无状态 4、持久化技术 5、数据库读写分离化 6、缓存技术 7、Redis 7.1 Redis集群切片与分片 7.2 Redis分布式存储 7.3 Redis数据类…

Windows使用ngrok实现本地程序外网域名访问-详细教程

需求分析 同事要求在外网以域名的方式,访问我本地的程序,故需要将localhost:8080映射到外网,让同事可以通过:域名/接口 的形式访问到本地程序的功能接口 安装 进入官网:https://ngrok.com/ 点击顶部Download&#x…

十三、市场活动:全部导出

功能需求:批量导出市场活动 用户在市场活动主页面,点击"批量导出"按钮,把所有市场活动生成一个excel文件,弹出文件下载的对话框; 用户选择要保存的目录,完成导出市场活动的功能. *导出成功之后,页面不刷新 功能分析:导出市场活动 1.给批量…

打卡Android学习—Compose 布局 和 修饰符

我们将通过解释 布局 和 修饰符 的基础知识 来开始我们的旅程。我们将介绍他们是如何协同工作的,Compose 提供了什么开箱即用的API,以及如何漂亮地设计您的UI 布局——因为 Compose 中的几乎所有内容都是布局 布局是Compose UI的核心组件,使…

( “树” 之 BST) 669. 修剪二叉搜索树 ——【Leetcode每日一题】

二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点。 二叉查找树中序遍历有序。 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&…

机器学习——核函数

问:已知三维空间中的两个样本点分别为(2,4,5)和(1,2,3),定义核函数表达式为:试计算这两个样本点映射到十维空间后的 答:首先计算两个样本点的平方内积2*14*25*325 然后代入核函数表…

互联网医院软件|互联网医院系统开发|在线问诊提高医疗效率

互联网医院系统源码开发设计理念是以患者为中心,将医院的各个科室、医生资源进行有效的整合和调配。互联网医院系统开发是基于最新的Web技术和云计算技术所构建的一种全新的医疗信息化平台,可以通过网页、小程序等多种方式,为患者提供在线预约…

Logstash:通过 lookups 来丰富数据

如果你想了解更多关于 lookup 的内容,请参阅文章 “Elastic:开发者上手指南” 中的 “丰富数据及 lookup” 章节。在今天的文章中,我来总结在 Logstash 中一些常用的 lookups。如下的这些插件可以帮助你使用附加信息丰富数据,例如…