机器学习篇-day09-支持向量机SVM

news2024/10/21 13:38:21

一. 支持向量机介绍

支持向量机

介绍

SVM全称是Supported Vector Machine(支持向量机)

即寻找到一个超平面使样本分成两类,并且间隔最大。

是一种监督学习算法,主要用于分类,也可用于回归

与逻辑回归和决策树等其他分类器相比,SVM 提供了非常高的准确度

优缺点

优点:

适合小样本、高纬度数据,比较强泛化能力

可有效地处理高维数据;可使用不同的核函数来适应不同的数据类型

缺点:

计算复杂度较高,对于大规模数据的处理可能会存在困难

超平面最大间隔

名词解释

硬间隔

如果样本线性可分,在所有样本分类都正确的情况下,寻找最大间隔,这就是硬间隔

如果出现异常值、或者样本不能线性可分,此时硬间隔无法实现。

软间隔

允许部分样本,在最大间隔之内,甚至在错误的一边,寻找最大间隔,这就是软间隔

目标是尽可能在保持间隔宽阔和限制间隔违例之间找到良好的平衡。

通过惩罚系数C来控制这个平衡:C值越小,则间隔越宽,但是间隔违例也会越多

核函数

核函数将原始输入空间映射到新的特征空间,使得原本线性不可分的样本在核空间可分

总结

1、下列关于SVM的描述错误的是?(单选题)

A)它的全称为支撑向量机(SupportedVector Machine)

B)它的主要任务是找到一个超平面将不同的样本划分开来

C)硬间隔和软间隔都是SVM分割超平面中的一种

D)SVM模型可以通过调小C参数的取值,来减少间隔违例

答案解析: C值越小,间隔违例越多

答案:D

二. 支持向量机API的使用

API

初步代码演示

plot_util工具

import numpy as np
import matplotlib.pyplot as plt
​
​
def plot_decision_boundary(model, axis):
    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)
    )
    X_new = np.c_[x0.ravel(), x1.ravel()]
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)
​
    from matplotlib.colors import ListedColormap
    custom_map = ListedColormap(["#EF9A9A", "#FFF59D", "#90CAF9"])
​
    # plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_map)
    plt.contourf(x0, x1, zz, cmap=custom_map)
​
​
def plot_decision_boundary_svc(model, axis):
    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)
    )
    X_new = np.c_[x0.ravel(), x1.ravel()]
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)
​
    from matplotlib.colors import ListedColormap
    custom_map = ListedColormap(["#EF9A9A", "#FFF59D", "#90CAF9"])
​
    # plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_map)
    plt.contourf(x0, x1, zz, cmap=custom_map)
​
    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)
    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]
    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="black")
    plt.plot(plot_x[down_index], down_y[down_index], color="black")

代码

import matplotlib.pyplot as plt
from plot_util import plot_decision_boundary
​
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
​
​
def demo01_svm():
    # 获取数据
    data, label = load_iris(return_X_y=True)
    # print(data.shape)
    # print(label.shape)
    # print(pd.DataFrame(
    #     data,
    #     columns=[
    #         '花萼长度',
    #         '花萼宽度',
    #         '花瓣长度',
    #         '花瓣宽度']
    # ).head())
​
    # 数据基本处理
    # 特征和标签
    data_sub = data[label < 2, :2]
    label_sub = label[label < 2]
    print(data_sub.shape)
    print(label_sub.shape)
​
    # 数据可视化
    # plt.figure(figsize=(10, 5), dpi=100)
    # plt.scatter(data_sub[label_sub == 0, 0], data_sub[label_sub == 0, 1], c='r')
    # plt.scatter(data_sub[label_sub == 1, 0], data_sub[label_sub == 1, 1], c='c')
    # plt.show()
​
    # 特征工程
    transfer = StandardScaler()
    data_sub = transfer.fit_transform(data_sub)
​
    # 模型训练
    model = LinearSVC(C=100)
    model.fit(data_sub, label_sub)
    y_pred = model.predict(data_sub)
    print(y_pred)
​
    # 绘制模型的边界
    plot_decision_boundary(model, axis=[-3, 3, -3, 3])
    plt.scatter(data_sub[label_sub == 0, 0], data_sub[label_sub == 0, 1], c='r')
    plt.scatter(data_sub[label_sub == 1, 0], data_sub[label_sub == 1, 1], c='b')
    plt.show()
​
​
if __name__ == '__main__':
    demo01_svm()

结果图

惩罚参数的影响

代码

import matplotlib.pyplot as plt
from plot_util import plot_decision_boundary
​
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
​
​
def demo01_svm():
    # 获取数据
    data, label = load_iris(return_X_y=True)
    # print(data.shape)
    # print(label.shape)
​
    # 数据基本处理
    # 特征和标签
    data_sub = data[label < 2, :2]
    label_sub = label[label < 2]
    print(data_sub.shape)
    print(label_sub.shape)
​
    # 数据可视化
    # plt.figure(figsize=(10, 5), dpi=100)
    # plt.scatter(data_sub[label_sub == 0, 0], data_sub[label_sub == 0, 1], c='r')
    # plt.scatter(data_sub[label_sub == 1, 0], data_sub[label_sub == 1, 1], c='c')
    # plt.show()
​
    # 特征工程
    transfer = StandardScaler()
    data_sub = transfer.fit_transform(data_sub)
​
    # C=100
    # 模型训练
    model1 = LinearSVC(C=100, dual='auto')
    model1.fit(data_sub, label_sub)
    y_pred = model1.predict(data_sub)
    print(y_pred)
​
    # 绘制模型的边界
    plot_decision_boundary(model1, axis=[-3, 3, -3, 3])
    plt.scatter(data_sub[label_sub == 0, 0], data_sub[label_sub == 0, 1], c='r')
    plt.scatter(data_sub[label_sub == 1, 0], data_sub[label_sub == 1, 1], c='b')
    plt.show()
​
    # C=0.1
    # 模型训练
    model2 = LinearSVC(C=0.1, dual='auto')
    model2.fit(data_sub, label_sub)
    y_pred = model2.predict(data_sub)
    print(y_pred)
​
    # 绘制模型的边界
    plot_decision_boundary(model2, axis=[-3, 3, -3, 3])
    plt.scatter(data_sub[label_sub == 0, 0], data_sub[label_sub == 0, 1], c='r')
    plt.scatter(data_sub[label_sub == 1, 0], data_sub[label_sub == 1, 1], c='b')
    plt.show()
​
​
if __name__ == '__main__':
    demo01_svm()

结果图

三. SVM算法原理

SVM思想:要去求一组参数(w,b),使其构建的超平面函数能够最优地分离两个集合。

求解w和b最小

求解最终超平面

四. 核函数

核函数的作用

将原始输入空间映射到的新的特征空间, 从而, 使原本的线性不可分的样本, 可能在核空间可分

核函数分类

线性核:一般是不增加数据维度,而是预先计算内积,提高速度

多项式核:一般是通过增加多项式特征,提升数据维度,并计算内积

高斯核(RBF、径向基函数):产生将样本投射到无限维空间的运算效果,使得原来不可分的数据变得可分。使用最多其他了解即可

高斯核函数基本原理

高斯核函数API

gama值越大越容易过拟合, gama值与拟合成正比

模型API

解释gama函数

代码演示

# 1.导入依赖包
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from plot_util import plot_decision_boundary

# 2.获取数据
x, y = make_moons(noise=0.15)
plt.scatter(x[y == 0, 0], x[y == 0, 1])
plt.scatter(x[y == 1, 0], x[y == 1, 1])
plt.show()


# 3.构建函数
def RBFsvm(gamma=0.1):
    return Pipeline(
        [
            ('std_scalar', StandardScaler()),
            ('svc', SVC(kernel='rbf', gamma=gamma))
        ]
    )


## 4.实验测试【0.5,1.0,100,0.1】,模型训练
# svc1 = RBFsvm(0.5)
# x_std=svc1['std_scalar'].fit_transform(x)
# svc1.fit(x_std,y)
# plot_decision_boundary(svc1,axis=[-3,3,-3,3])
# plt.scatter(x_std[y==0,0],x_std[y==0,1])
# plt.scatter(x_std[y==1,0],x_std[y==1,1])
# plt.show()

svc1 = RBFsvm(1.0)
svc1.fit(x, y)
plot_decision_boundary(svc1, axis=[-1.5, 2.5, -1, 1.5])
plt.scatter(x[y == 0, 0], x[y == 0, 1])
plt.scatter(x[y == 1, 0], x[y == 1, 1])
plt.title("gamma=1.0")
plt.show()

svc2 = RBFsvm(100)
svc2.fit(x, y)
plot_decision_boundary(svc2, axis=[-1.5, 2.5, -1, 1.5])
plt.scatter(x[y == 0, 0], x[y == 0, 1])
plt.scatter(x[y == 1, 0], x[y == 1, 1])
plt.title("gamma=100")
plt.show()

svc3 = RBFsvm(0.1)
svc3.fit(x, y)
plot_decision_boundary(svc3, axis=[-1.5, 2.5, -1, 1.5])
plt.scatter(x[y == 0, 0], x[y == 0, 1])
plt.scatter(x[y == 1, 0], x[y == 1, 1])
plt.title("gamma=0.1")
plt.show()

结果图

原数据

模型训练后

总结

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

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

相关文章

Android摄像头Camera2和Camera1的一些总结

Android 系统对摄像头的同时使用有限制&#xff0c;不能同时使用摄像头进行预览或者录制音视频。 例如&#xff1a;界面上有两个SurfaceView, 这两个SurfaceView不能同时预览或者录制音视频&#xff0c;只能有一个正常工作&#xff08;一个SurfaceView预览前置摄像头&#xff…

Linux 问题故障定位的技巧大全

1、背景 有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源。这时候就需要登录服务器进一步深入分析问题的根源。那么分析问题需要有一定的技术经验积累,并且有些问题涉及到的领域非常广,才能定位到问题。所以,分析问题和踩坑是非常锻炼一个人的成长和提…

Mybatis day 1020

ok了这周学习了mybatis框架&#xff0c;今天最后一天&#xff0c;加油各位&#xff01;&#xff01;&#xff01;(接上文) 八.MyBatis扩展 8.1 Mapper批量映射优化 需求 Mapper 配置文件很多时&#xff0c;在全局配置文件中一个一个注册太 麻烦&#xff0c;希望有一个办法…

MFC工控项目实例二十六创建数据库

承接专栏《MFC工控项目实例二十五多媒体定时计时器》 用选取的型号为文件名建立文件夹&#xff0c;再在下面用测试的当天的时间创建文件夹&#xff0c;在这个文件中用测试的时/分/秒为数据库名创建Adcess数据库。 1、在StdAfx.h文件最下面添加代码 #import "C:/Program F…

Ubuntu下安装Bochs2.7

文章目录 前言下载安装在Bochs实现最简单的操作系统创建软盘编写并编译汇编指令编写bochs配置文件将操作系统写入到软盘启动操作系统 前言 通过自带软件库sudo apt-get install bochs bochs-x安装的Bochs运行时不显示任何内容&#xff0c;这里选用源码安装方式。 下载安装 …

Atlas800昇腾服务器(型号:3000)—AIPP加速前处理(四)

服务器配置如下&#xff1a; CPU/NPU&#xff1a;鲲鹏 CPU&#xff08;ARM64&#xff09;A300I pro推理卡 系统&#xff1a;Kylin V10 SP1【下载链接】【安装链接】 驱动与固件版本版本&#xff1a; Ascend-hdk-310p-npu-driver_23.0.1_linux-aarch64.run【下载链接】 Ascend-…

CSS 居中那些事

一、父子元素高度确定 简单粗暴, 直接通过设置合适的 padding 或 margin 实现居中 <style>.p {padding: 20px 0;background: rgba(255, 0, 0, 0.1);}.c {width: 40px;height: 20px;background: blue;} </style> <div class"p"><div class"…

服务器模块测试

目录 测试逻辑 测试工具 测试 测试逻辑 我们可以使用一个简单的业务处理逻辑来进行测试。 最简单的&#xff0c;我们业务逻辑就直接返回一个固定的字符串 void Message(const PtrConnection&con,Buffer* inbuffer) //模拟用户新数据回调 {inbuffer->MoveReadOf…

Vite 前端开发的超级加速器 - 从入门到精通

大家好&#xff01;今天我们来聊聊前端开发中的一个革命性工具 - Vite。如果你觉得你的前端开发速度慢得像蜗牛爬&#xff0c;那么Vite就是为你量身打造的超级加速器&#xff01; 一、什么是Vite&#xff1f; Vite&#xff08;法语意为"快速"&#xff09;是一个现代化…

LDR6500芯片:引领USB-C拓展坞转接器新风

在当今这个数字化浪潮汹涌澎湃的时代&#xff0c;手机和电脑已然深深融入我们生活的每一个角落&#xff0c;成为了不可或缺的关键工具。然而&#xff0c;不得不承认的是&#xff0c;它们所配备的接口数量往往有限&#xff0c;难以充分满足我们日益多样化、丰富化的需求。正因如…

5G 现网信令参数学习(1) - MIB

MIB消息中的参数 systemFrameNumber 000101B, subCarrierSpacingCommon scs30or120, ssb-SubcarrierOffset 6, dmrs-TypeA-Position pos2, pdcch-ConfigSIB1 { controlResourceSetZero 10, searchSpaceZero 4 }, cellBarred notBarred, intraFreqReselection allowed, sp…

nginx解决非人类使用http打开的443,解决网安漏扫时误扫443端口带来的问题

一、问题描述 正常访问https的站点时&#xff0c;使用网址https://www.baidu.com&#xff0c;但会有一种错误的访问请求http://www.baidu.com:443&#xff0c;一般都是非人类所为&#xff0c;如漏洞扫描工具&#xff0c;那么请求以后带来的后果是个错误页面 400 Bad Request T…

Vue及项目结构介绍

今天滴学习目标&#xff01;&#xff01;&#xff01; 项目结构介绍1.Vue 项目文件结构2. 文件结构详解2.1 index.html2.2 src/main.js2.3 src/App.vue2.4 src/components/2.5 src/assets/2.6 package.json 3. 项目启动 首先我们先学习Vue项目结构&#xff0c;我们创建Vue项目时…

【专题】计算机网络之物理层

计算机网络体系结构&#xff1a; 1. 物理层的基本概念 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 作用&#xff1a;尽可能屏蔽掉不同传输媒体和通信手段的差异。 用于物理层的协议也常称为物理层规程 (procedu…

js.矩阵置零

链接&#xff1a;73. 矩阵置零 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],…

如何使用Java语言调用API数据

在当今的数据驱动世界中&#xff0c;API&#xff08;应用程序编程接口&#xff09;成为了连接不同服务和数据源的桥梁。无论是社交媒体数据、金融市场信息还是地理位置服务&#xff0c;API都能提供一种便捷的方式来获取这些数据。Java&#xff0c;作为最受欢迎的编程语言之一&a…

无mac电脑在苹果开发者上传构建版本

我们登录苹果开发者网站的后台&#xff0c;进入app store后&#xff0c;发现上架的页面需要上传一个构建版本。 这个构建版本的意思就是我们的应用二进制文件&#xff0c;是上架最重要的文件。但是在苹果开发者后台是无法直接上传这个文件的&#xff0c;它提示我们可以使用xco…

VSCODE c++不能自动补全的问题

最近安装了vscode&#xff0c;配置了C/C扩展&#xff0c;也按照网上说的配置了头文件路径 我发现有部分头文件是没办法解析的&#xff0c;只要包含这些头文件中的一个或者多个&#xff0c;就没有代码高亮和代码自动补全了&#xff0c;确定路径配置是没问题的&#xff0c;因为鼠…

Caffeine Cache解析(一):接口设计与TinyLFU

Caffeine is a high performance Java caching library providing a near optimal hit rate. 自动加载value, 支持异步加载基于size的eviction&#xff1a;frequency and recency基于时间的过期策略&#xff1a;last access or last write异步更新valuekey支持weak referenceva…

RK3588部署及其RKNPU工具链使用学习

文章目录 RKNPU 推理框架推理软件框架RKNPU 硬件层&#xff1a;RKNPU 驱动层&#xff1a;RKNPU 应用层 RKNN 模型RKNN 的工具链介绍RKNN 软件栈整体介绍RKNN-Toolkit2 功能介绍RKNPU2-SDK总结 开发环境搭建PC 端采用 虚拟机上的 Ubunt20.04 系统安装 anconda通过 conda 创建虚拟…