机器学习第8天:SVM分类

文章目录

机器学习专栏

介绍

特征缩放

示例代码

硬间隔与软间隔分类

主要代码

代码解释

非线性SVM分类

结语


机器学习专栏

机器学习_Nowl的博客-CSDN博客

介绍

作用:判别种类

原理:找出一个决策边界,判断数据所处区域来识别种类

简单介绍一下SVM分类的思想,我们看下面这张图,两种分类都很不错,但是我们可以注意到第二种的决策边界与实例更远(它们之间的距离比较宽),而SVM分类就是一种寻找距每种实例最远的决策边界的算法


特征缩放

SVM算法对特征缩放很敏感(不处理算法效果会受很大影响)

特征缩放是什么意思呢,例如有身高数据和体重数据,若身高是m为单位,体重是g为单位,那么体重就比身高的数值大很多,有些机器学习算法就可能更关注某一个值,这时我们用特征缩放就可以把数据统一到相同的尺度上

示例代码

from sklearn.preprocessing import StandardScaler
import numpy as np# 创建一个示例数据集
data = np.array([[1.0, 2.0, 3.0],[4.0, 5.0, 6.0],[7.0, 8.0, 9.0]])# 创建StandardScaler对象
scaler = StandardScaler()# 对数据进行标准化
scaled_data = scaler.fit_transform(data)print("原始数据:\n", data)
print("\n标准化后的数据:\n", scaled_data)# 结果是
# [[-1.22474487 -1.22474487 -1.22474487]
#  [ 0.          0.          0.        ]
#  [ 1.22474487  1.22474487  1.22474487]]

 StandardScaler是一种数据标准化的方法,它对数据进行线性变换,使得数据的均值变为0,标准差变为1。 

解释上面的数据

在每列上进行标准化,即对每个特征进行独立的标准化。每个数值是通过减去该列的均值,然后除以该列的标准差得到的。

  • 第一列:(1−4)/9=−1.22474487(1−4)/9​=−1.22474487,(4−4)/9=0(4−4)/9​=0,(7−4)/9=1.22474487(7−4)/9​=1.22474487。
  • 第二列:(2−5)/9=−1.22474487(2−5)/9​=−1.22474487,(5−5)/9=0(5−5)/9​=0,(8−5)/9=1.22474487(8−5)/9​=1.22474487。
  • 第三列:(3−6)/9=−1.22474487(3−6)/9​=−1.22474487,(6−6)/9=0(6−6)/9​=0,(9−6)/9=1.22474487(9−6)/9​=1.22474487。

这样,标准化后的数据集就符合标准正态分布,每个特征的均值为0,标准差为1。


硬间隔与软间隔分类

硬间隔分类就是完全将不同的个体区分在不同的区域(不能有一点误差)

软间隔分类就是允许一些偏差(图中绿和红色的点都有一些出现在了对方的分区里)

硬间隔分类往往会出现一些问题,例如有时候模型不可能完全分成两类,同时,硬间隔分类往往可能导致过拟合,而软间隔分类的泛化能力就比硬间隔分类好很多


主要代码

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVCmodel = Pipeline([("scaler", StandardScaler()),("linear_svc", LinearSVC(C=1, loss="hinge"))
])model.fit(x, y)

代码解释

在这里,Pipeline的构造函数接受一个由元组组成的列表。每个元组的第一个元素是该步骤的名称(字符串),第二个元素是该步骤的实例。在这个例子中,第一个步骤是数据标准化,使用StandardScaler,命名为"scaler";第二个步骤是线性支持向量机,使用LinearSVC,命名为"linear_svc"。这两个步骤会按照列表中的顺序依次执行。

参数C是正则程度,hinge是SVM分类算法的损失函数,用来训练模型


非线性SVM分类

上述方法都是在数据集可线性分离时用到的,当数据集呈非线性怎么办,我们在回归任务中讲过一个思想,用PolynomialFeatures来产生多项式,再对每个项进行线性拟合,最后结合在一起得出决策边界

具体代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import PolynomialFeatures
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score# 生成非线性数据集
X, y = datasets.make_circles(n_samples=100, factor=0.5, noise=0.1, random_state=42)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 使用多项式特征和线性SVM
degree = 3  # 多项式的次数
svm_classifier = make_pipeline(StandardScaler(), PolynomialFeatures(degree), SVC(kernel='linear', C=1))
svm_classifier.fit(X_train, y_train)# 预测并计算准确率
y_pred = svm_classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)# 绘制决策边界
def plot_decision_boundary(X, y, model, ax):h = .02x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))Z = model.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)ax.contourf(xx, yy, Z, alpha=0.8)ax.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o', s=80, linewidth=0.5)ax.set_xlim(xx.min(), xx.max())ax.set_ylim(yy.min(), yy.max())# 绘制结果
fig, ax = plt.subplots(figsize=(8, 6))
plot_decision_boundary(X_train, y_train, svm_classifier, ax)
ax.set_title('Polynomial SVM Decision Boundary')
plt.show()

运行结果


结语

SVM分类是一种经典的分类算法,也叫大间隔分类算法。它可以用来线性分类,也可以非线性分类(可以与PolynomialFeatures结合,当然还有其他方法,我们之后再说)

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

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

相关文章

在js中a标签加入单击事件屏蔽href跳转页面

在JS中,我们可以通过添加单击事件来屏蔽a标签的href跳转页面。下面是实现这个功能的完整攻略: 1.使用addEventListener函数添加单击事件 我们可以通过addEventListener函数来为a标签添加单击事件,代码如下: document.querySele…

2311rust,到43版本更新

1.38.0 流水编译 要编译仓库,编译器不需要完全构建依赖项.相反,只需要它们的"元数据"(即类型,依赖关系,导出列表). 在编译过程的早期生成此元数据.从Rust1.38.0开始,Cargo利用这一点,在准备好元数据后立即自动开始构建依赖的仓库. 检查错误使用mem::{uninitialize…

【灾备】灾难恢复

文章目录 概述灾备指标虚拟化恢复灾难恢复计划四种方式灾难恢复相关技术来源 概述 灾难恢复(Disaster recovery,也称灾备),指自然或人为灾害后,重新启用信息系统的数据、硬件及软体设备,恢复正常商业运作的…

Matlab通信仿真系列——图形处理函数

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、plot函数 (1)绘制一…

振弦式渗压计与振弦采集仪组成大坝水库安全监测的案例

振弦式渗压计与振弦采集仪组成大坝水库安全监测的案例 振弦式渗压计是一种常用的水文地质监测仪器,主要用于测量土体中的渗流压力、水位变化等参数。而振弦采集仪则是一种数据采集和传输装置,可以将振弦式渗压计采集到的数据进行处理和传输。 在大坝水库…

以makefile的方式在linux上编译代码(小白级别)

作者:爱塔居 作者简介:大四学生,分享自己的学习片段~ 目录 前言 一、创建主要文件 二、makefile 前言 多有不足,以供参考,欢迎大佬们指点。我是在虚拟机上执行的,应该都一样。我用的VirtualBox,…

【18年扬大真题】定义一个Point类,要求如下所述。(1)用构造函数初始化Point类的对象(2)定义函数Distance,计算平面上两点之间的距离

【18年扬大真题】定义一个Point类&#xff0c;要求如下所述。 &#xff08;1&#xff09;用构造函数初始化Point类的对象 &#xff08;2&#xff09;定义函数Distance&#xff0c;计算平面上两点之间的距离 #include<stdio.h> #include<math.h> typedef struct {d…

Proxmox download

Proxmox VE proxmox Virtual Environment是一个基于 QEMU/KVM 和 LXC 的开源服务器虚拟化管理解决方案。您可以使用集成的、易于使用的 Web 界面或通过 CLI 管理虚拟机、容器、高可用性集群、存储和网络。Proxmox VE 代码根据 GNU Affero 通用公共许可证第 3 版获得许可 Prox…

LeetCode7-整数反转

需要判断整数溢出,我这里的思路就是判断新的ans的值是否与(ans-mod)/10相等,如果溢出了,必然不相等,这是代码简洁且时间复杂度最快的做法! class Solution {public int reverse(int x) {if(x0){return 0;}boolean negativefalse;if(x<0){negativetrue;x-x;}int ans0;while(…

使用SpringBoot Actuator监控应用

使用SpringBootActuator监控应用 微服务的特点决定了功能模块的部署是分布式的&#xff0c;大部分功能模块都是运行在不同的机器上&#xff0c;彼此通过服务调用进 行交互&#xff0c;前后台的业务流会经过很多个微服务的处理和传递&#xff0c;出现了异常如何快速定位是哪个…

Python大数据之linux学习总结——day11_ZooKeeper

ZooKeeper ZK概述 ZooKeeper概念: Zookeeper是一个分布式协调服务的开源框架。本质上是一个分布式的小文件存储系统 ZooKeeper作用: 主要用来解决分布式集群中应用系统的一致性问题。 ZooKeeper结构: 采用树形层次结构&#xff0c;ZooKeeper树中的每个节点被称为—Znode。且树…

Python scipy.spatial.distance.squareform() 函数的用法

scipy.spatial.distance.squareform 调用方法注意示例1 调用方法 from scipy.spatial.distance import pdist, squareformscipy.spatial.distance.squareform(X, forceno, checksTrue)各个参数意义&#xff1a; X&#xff1a;一个压缩或冗余的距离矩阵。 force&#xff1a;可以…

万字解析设计模式之 适配器模式

一、 适配器模式 1.1概述 将一个接口转换成客户希望的另一个接口&#xff0c;适配器模式使接口不兼容的那些类可以一起工作。 适配器模式分为类适配器模式和对象适配器模式&#xff0c;前者类之间的耦合度比后者高&#xff0c;且要求程序员了解现有组件库中的相关组件的内部结…

spring面试题合集介绍

订阅本合集&#xff0c;您将学习到一下内容&#xff1a; 一、Spring Framework 1.谈谈你对Spring的理解 2.Spring的优缺点是什么&#xff1f; 二、Spring IOC 3.什么是Spring IOC 容器&#xff1f;有什么作用&#xff1f; 4.Spring IoC 的实现机制是什么&#xff1f; 5.什么…

目标分割技术-语义分割总览

前言 博主现任高级人工智能工程师&#xff0c;曾发表多篇SCI且获得过多次国际竞赛奖项&#xff0c;理解各类模型原理以及每种模型的建模流程和各类题目分析方法。目的就是为了让零基础快速使用各类代码模型&#xff0c;每一篇文章都包含实战项目以及可运行代码。欢迎大家订阅一…

2023年度注册电气工程师(供配电)执业资格考试专业考试规范及设计手册

一&#xff0e;规程、规范&#xff1a; 1&#xff0e;《防止静电事故通用导则》GB 12158-2006&#xff1b; 2&#xff0e;《电能质量 供电电压偏差》GB/T 12325-2008&#xff1b; 3&#xff0e;《电能质量 电压波动和闪变》GB/T 12326-2008&#xff1b; 4&#xff0e;《电流…

录制第一个jmeter性能测试脚本2(http协议)——webtour

我们手工编写了一个测试计划&#xff0c;现在我们通过录制的方式来实现那个测试计划。也就是说‘’测试计划目标和上一节类似&#xff1a;让5个用户在2s内登录webtour&#xff0c;然后进入 页面进行查看。 目录 欢迎访问我的免费课程 PPT、安装包、视频应有尽有&#xff01; …

C#类有析构函数吗

在C#中&#xff0c;类不具有析构函数(destructor)的概念&#xff0c;而是有一种叫做终结器(finalizer)的东西&#xff0c;这在某种程度上和C的析构函数相似。终结器在对象不再需要时由垃圾收集器自动调用&#xff0c;用于释放非托管资源。在C#中&#xff0c;你不能直接调用终结…

leetcode:交叉链表

题目描述 题目链接&#xff1a;160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 题目分析 我们先要搞清楚一个概念&#xff0c;单链表可以相交&#xff0c;但绝对不会交叉 原因如下&#xff1a; 单链表中&#xff0c;多个结点可以存一个结点的地址&#xff0c;但是一…

【算法挨揍日记】day22——面试题 17.16. 按摩师、213. 打家劫舍 II

面试题 17.16. 按摩师 面试题 17.16. 按摩师 题目描述&#xff1a; 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时间&#xff0c;因此她不能接受相邻的预约。给定一个预约请求序列&#xff0c;替按摩师找…