【机器学习】自定义数据集 使用scikit-learn中svm的包实现svm分类

一、支持向量机(support vector machines. ,SVM)概念

1. SVM 绪论

支持向量机(SVM)的核心思想是找到一个最优的超平面,将不同类别的数据点分开。SVM 的关键特点包括:

① 分类与回归

  • SVM 可以用于分类(SVC, Support Vector Classification)和回归(SVR, Support Vector Regression)。

  • 分类任务中,SVM 通过找到一个超平面,最大化不同类别之间的间隔(margin)。

  • 回归任务中,SVM 通过找到一个超平面,使得数据点尽可能接近该超平面。

② 核函数(Kernel)

  • SVM 通过核函数将数据映射到高维空间,从而解决非线性问题。

  • 常用的核函数包括:

               线性核(linear

               多项式核(poly

               径向基核(RBF, rbf

               Sigmoid 核(sigmoid

③ 支持向量

  • 支持向量是离超平面最近的数据点,它们决定了超平面的位置和方向。

2. scikit-learn 中的SVM包

SVC

  • 用于分类任务的支持向量机。

  • 主要参数:

    kernel:核函数类型(如 'linear''rbf' 等)。

    C:正则化参数,控制模型的复杂度。

    gamma:核函数的系数(仅对 'rbf''poly' 和 'sigmoid' 核有效)。

SVR

  • 用于回归任务的支持向量机。

  • 主要参数与 SVC 类似。

LinearSVC

  • 线性支持向量分类器,专门用于线性核的 SVM。

  • 比 SVC(kernel='linear') 更高效。

④ LinearSVR

  • 线性支持向量回归器,专门用于线性核的 SVM 回归。

3. SVM包中的主要参数

kernel

  • 核函数类型,默认为 'rbf'

  • 可选值:'linear''poly''rbf''sigmoid' 或自定义核函数。

C

  • 正则化参数,默认为 1.0

  • 较小的 C 值表示更强的正则化,较大的 C 值表示更弱的正则化。

gamma

  • 核函数的系数,默认为 'scale'(即 1 / (n_features * X.var()))。

  • 较小的 gamma 值表示核函数的影响范围较大,较大的 gamma 值表示核函数的影响范围较小。

④ degree

  • 多项式核的阶数,默认为 3

  • 仅对 kernel='poly' 有效。

⑤ probability

  • 是否启用概率估计,默认为 False

  • 如果为 True,可以使用 predict_proba 方法获取类别概率。

4. SVM示例代码

import numpy as np
from sklearn.svm import SVC
import matplotlib.pyplot as plt# 1. 自定义数据集
np.random.seed(42)
X = np.random.randn(100, 2)  # 100 个样本,每个样本有 2 个特征
y = (X[:, 0] + X[:, 1] > 0).astype(np.int32)  # 根据特征的线性组合生成标签# 2. 初始化 SVM 模型
svm_model = SVC(kernel='linear', C=1.0, random_state=42)# 3. 训练模型
svm_model.fit(X, y)# 4. 可视化决策边界
def plot_decision_boundary(model, X, y):# 创建网格点x_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, 0.01),np.arange(y_min, y_max, 0.01))# 预测网格点的类别Z = model.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)# 绘制决策边界plt.contourf(xx, yy, Z, alpha=0.8, cmap='viridis')# 绘制样本点plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o', cmap='viridis')plt.title("SVM 决策边界")plt.xlabel("特征 1")plt.ylabel("特征 2")plt.show()# 可视化决策边界
plot_decision_boundary(svm_model, X, y)

二、SVM类型

1. 线性可分支持向量机(Linear Separable SVM)

① 定义

  • 适用于数据 线性可分 的情况,即存在一个超平面可以将不同类别的样本完全分开。

  • 目标是找到一个最优超平面,使得两类样本之间的间隔(margin)最大化。

② 数学形式

  • 超平面方程:w⋅x+b=0,其中:

        w 是法向量,决定了超平面的方向。

        b 是偏置项,决定了超平面的位置。

  • 优化目标:

\min_{\mathbf{w}, b} \frac{1}{2} \|\mathbf{w}\|^2

  • 约束条件:

y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1, \quad \forall i

        其中y_i \in \{-1, 1\} 是样本的类别标签。

③ 特点

  • 适用于数据完全线性可分的情况。

  • 通过最大化间隔,提高模型的泛化能力。

2. 线性支持向量机(Linear SVM)

① 定义

  • 适用于数据 近似线性可分 的情况,即数据中存在少量噪声或异常点,无法完全分开。

  • 引入 松弛变量(slack variables),允许部分样本违反间隔约束。

② 数学形式

  • 优化目标:

\min_{\mathbf{w}, b, \xi} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^n \xi_i

  • 约束条件:

y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0, \quad \forall i

        其中:

                \xi_i是松弛变量,表示第i个样本违反间隔约束的程度。

                C是正则化参数,控制模型对误分类的惩罚力度。

③ 特点

  • 通过引入松弛变量,允许部分样本误分类,提高模型的鲁棒性。

  • 适用于数据近似线性可分的情况。

3. 非线性支持向量机(Nonlinear SVM)

① 定义

  • 适用于数据 非线性可分 的情况,即无法通过一个超平面将不同类别的样本分开。

  • 通过 核函数(Kernel Function) 将数据映射到高维空间,使得数据在高维空间中线性可分。

② 数学形式

  • 核函数的作用是将原始特征空间映射到高维特征空间:

\phi: \mathbb{R}^d \to \mathbb{R}^D

        其中D > d,甚至可以是无限维。

  • 优化目标:

\min_{\mathbf{w}, b, \xi} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^n \xi_i

  • 约束条件:

y_i (\mathbf{w} \cdot \phi(\mathbf{x}_i) + b) \geq 1 - \xi_i, \quad \xi_i \geq 0, \quad \forall i

③ 常用核函数

  • 线性核(Linear Kernel)

K(\mathbf{x}_i, \mathbf{x}_j) = \mathbf{x}_i \cdot \mathbf{x}_j

  • 多项式核(Polynomial Kernel)

K(\mathbf{x}_i, \mathbf{x}_j) = (\gamma \mathbf{x}_i \cdot \mathbf{x}_j + r)^d

  • 径向基核(RBF Kernel)

K(\mathbf{x}_i, \mathbf{x}_j) = \exp(-\gamma \|\mathbf{x}_i - \mathbf{x}_j\|^2)

  • Sigmoid 核(Sigmoid Kernel)

K(\mathbf{x}_i, \mathbf{x}_j) = \tanh(\gamma \mathbf{x}_i \cdot \mathbf{x}_j + r)

④ 特点

  • 通过核函数,可以处理非线性可分的数据。

  • 核函数的选择对模型性能有重要影响。

4. 总结

类型适用场景核心思想关键参数/技术
线性可分支持向量机数据完全线性可分最大化间隔无松弛变量
线性支持向量机数据近似线性可分允许部分样本误分类松弛变量、正则化参数 C
非线性支持向量机数据非线性可分通过核函数映射到高维空间核函数、正则化参数 C
  • 线性可分支持向量机 是理想情况,现实中较少见。

  • 线性支持向量机 通过引入松弛变量,提高了模型的鲁棒性。

  • 非线性支持向量机 通过核函数,可以处理复杂的非线性问题。

三、自定义数据集 使用scikit-learn中svm的包实现svm分类

1. 代码示例

import numpy as np
from sklearn.svm import SVC
import matplotlib.pyplot as plt# 1. 自定义数据集
# 生成 200 个样本,每个样本有 2 个特征
np.random.seed(42)  # 设置随机种子以确保结果可重复
X = np.random.randn(200, 2).astype(np.float32)
# 根据特征的线性组合生成标签,大于 0 标记为 1,否则标记为 0
y = (2 * X[:, 0] + 3 * X[:, 1] > 0).astype(np.int32)# 2. 初始化 SVM 模型
# 使用线性核函数
svm_model = SVC(kernel='linear', random_state=42)# 3. 训练模型
svm_model.fit(X, y)# 4. 可视化决策边界和支持向量
def plot_decision_boundary(model, X, y):# 创建网格点x_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, 0.01),np.arange(y_min, y_max, 0.01))# 预测网格点的类别Z = model.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)# 绘制决策边界plt.contourf(xx, yy, Z, alpha=0.8, cmap='viridis')# 绘制样本点plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o', cmap='viridis')# 绘制支持向量plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1],s=100, facecolors='none', edgecolors='r', label='支持向量')plt.title("SVM 决策边界")plt.xlabel("特征 1")plt.ylabel("特征 2")plt.legend()plt.show()# 可视化训练集的决策边界和支持向量
plot_decision_boundary(svm_model, X, y)

2. 代码解释

① 自定义数据集

  • X = np.random.randn(200, 2).astype(np.float32)

         生成 200 个样本,每个样本有 2 个特征。

         使用 np.random.randn 生成符合标准正态分布的随机数。

   astype(np.float32) 将数据类型转换为 32 位浮点数。

  • y = (2 * X[:, 0] + 3 * X[:, 1] > 0).astype(np.int32)

         根据特征的线性组合生成标签。

         公式 2 * X[:, 0] + 3 * X[:, 1] > 0 表示特征的线性组合是否大于 0。

         大于 0 的样本标记为 1,否则标记为 0

   astype(np.int32) 将标签转换为 32 位整数。

② 初始化 SVM 模型

  • svm_model = SVC(kernel='linear', random_state=42)

         使用线性核函数初始化 SVM 模型。

         kernel='linear' 表示使用线性核函数。

         random_state=42 确保每次运行代码时结果一致。

③ 训练模型

  • svm_model.fit(X, y)

         使用训练集数据训练 SVM 模型。

④ 可视化决策边界和支持向量

  • plot_decision_boundary 函数:

        绘制 SVM 的决策边界和支持向量。

        使用 np.meshgrid 创建网格点,覆盖整个特征空间。

        使用 model.predict 预测网格点的类别。

        使用 plt.contourf 绘制决策边界。

        使用 plt.scatter 绘制样本点和支持向量。

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

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

相关文章

C++并行化编程

C并行化编程 C 简介 C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。 C 被认为是一种中级语言,它综合了高级语言和低级语言的特点。 C 是由 Bjarne Stroustrup 于 1979 年在新泽西州美…

记6(人工神经网络

目录 1、M-P神经元2、感知机3、Delta法则4、前馈型神经网络(Feedforward Neural Networks)5、鸢尾花数据集——单层前馈型神经网络:6、多层神经网络:增加隐含层7、实现异或运算(01、10为1,00、11为0)8、线性…

网工_HDLC协议

2025.01.25:网工老姜学习笔记 第9节 HDLC协议 9.1 HDLC高级数据链路控制9.2 HDLC帧格式(*控制字段)9.2.1 信息帧(承载用户数据,0开头)9.2.2 监督帧(帮助信息可靠传输,10开头&#xf…

CSS(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、什么是CSS?二、基本语法规范三、CSS选择器3.1 标签选择器3.2 id选择器3.3 class选择器3.4 通配符选择器3.5 复合选择器 四、常用CSS样式4.1 color4.2 font…

3.Spring-事务

一、隔离级别: 脏读: 一个事务访问到另外一个事务未提交的数据。 不可重复读: 事务内多次查询相同条件返回的结果不同。 幻读: 一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。 二…

C++STL之stack和queue容器(详细+通俗易懂)

前言:老铁们好,笔者好久没更新STL的容器了,今天,笔者接着之前的STL容器的内容继续更新,所以今天给老铁们分享的是STL里面的栈和队列的容器的知识。 1.栈的定义 老规矩,我们先来看看C的官网对stack的介绍文档。 然后…

DNS缓存详解(DNS Cache Detailed Explanation)

DNS缓存详解 清空DNS缓存可以让网页访问更快捷。本文将从什么是DNS缓存、为什么清空DNS缓存、如何清空DNS缓存、清空DNS缓存存在的问题四个方面详细阐述DNS缓存清空的相关知识。 一、什么是DNS缓存 1、DNS缓存的定义: DNS缓存是域名系统服务在遇到DNS查询时自动…

OFDM系统仿真

1️⃣ OFDM的原理 1.1 介绍 OFDM是一种多载波调制技术,将输入数据分配到多个子载波上,每个子载波上可以独立使用 QAM、PSK 等传统调制技术进行调制。这些子载波之间互相正交,从而可以有效利用频谱并减少干扰。 1.2 OFDM的核心 多载波调制…

第11章:根据 ShuffleNet V2 迁移学习医学图像分类任务:甲状腺结节检测

目录 1. Shufflenet V2 2. 甲状腺结节检测 2.1 数据集 2.2 训练参数 2.3 训练结果 2.4 可视化网页推理 3. 下载 1. Shufflenet V2 shufflenet v2 论文中提出衡量轻量级网络的性能不能仅仅依靠FLOPs计算量,还应该多方面的考虑,例如MAC(memory acc…

网络编程套接字(中)

文章目录 🍏简单的TCP网络程序服务端创建套接字服务端绑定服务端监听服务端获取连接服务端处理请求客户端创建套接字客户端连接服务器客户端发起请求服务器测试单执行流服务器的弊端 🍐多进程版的TCP网络程序捕捉SIGCHLD信号让孙子进程提供服务 &#x1…

happytime

happytime 一、查壳 无壳,64位 二、IDA分析 1.main 2.cry函数 总体:是魔改的XXTEA加密 在main中可以看到被加密且分段的flag在最后的循环中与V6进行比较,刚好和上面v6数组相同。 所以毫无疑问密文是v6. 而与flag一起进入加密函数的v5就…

DIFY源码解析

偶然发现Github上某位大佬开源的DIFY源码注释和解析,目前还处于陆续不断更新地更新过程中,为大佬的专业和开源贡献精神点赞。先收藏链接,后续慢慢学习。 相关链接如下: DIFY源码解析

Hot100之子串

560和为K的子数组 题目 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列 思路解析 ps:我们的presum【0】就是0,如果没有这个0的话我们的第一个元素就无法减去上…

网络工程师 (11)软件生命周期与开发模型

一、软件生命周期 前言 软件生命周期,也称为软件开发周期或软件开发生命周期,是指从软件项目的启动到软件不再被使用为止的整个期间。这个过程可以细分为多个阶段,每个阶段都有其特定的目标、任务和产出物。 1. 问题定义与需求分析 问题定义…

【Linux】使用管道实现一个简易版本的进程池

文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程: 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…

MYSQL--一条SQL执行的流程,分析MYSQL的架构

文章目录 第一步建立连接第二部解析 SQL第三步执行 sql预处理优化阶段执行阶段索引下推 执行一条select 语句中间会发生什么? 这个是对 mysql 架构的深入理解。 select * from product where id 1;对于mysql的架构分层: mysql 架构分成了 Server 层和存储引擎层&a…

基于Spring Security 6的OAuth2 系列之七 - 授权服务器--自定义数据库客户端信息

之所以想写这一系列,是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级…

深入剖析C语言字符串操作函数:my_strlen与my_strcpy

在C语言的编程世界里,字符串操作是日常开发中极为常见的任务。熟练掌握字符串操作函数,不仅能够提高代码的效率和可读性,还能为解决各种实际问题提供有力的支持。本文将深入剖析两个自定义的字符串操作函数: my_strlen 和 my_strc…

《苍穹外卖》项目学习记录-Day10来单提醒

type:用来标识消息的类型,比如说type1表示来单提醒,type2表示客户催单。 orderId:表示订单id,因为不管是来单提醒还是客户催单,这一次提醒都对应一个订单。是用户下了某个单或者催促某个订单,这…

数据结构与算法之栈: LeetCode 2042. 检查句子中的数字是否递增 (Ts版)

检查句子中的数字是否递增 https://leetcode.cn/problems/check-if-numbers-are-ascending-in-a-sentence/description/ 描述 句子是由若干 token 组成的一个列表,token 间用 单个 空格分隔,句子没有前导或尾随空格。每个 token 要么是一个由数字 0-9 …