Lucas带你手撕机器学习——SVM支持向量机

#1024程序员节|征文#

支持向量机(SVM)的详细讲解

什么是SVM?

支持向量机(Support Vector Machine,SVM)是一种用于分类和回归的监督学习算法。它的主要任务是从给定的数据中找到一个最佳的决策边界(超平面),将不同类别的数据分开。通过这个决策边界,SVM能够对新数据进行分类。
好的,让我们进一步深入探讨支持向量机(SVM)的各个方面,包括其工作原理、核函数的详细信息、调优技巧、以及在Sklearn和PyTorch中的更全面的实现示例。

SVM的详细工作原理

1. 数据准备与特征选择

在使用SVM之前,需要准备好数据。数据应该被整理为特征矩阵和目标标签:

  • 特征矩阵(X):每一行代表一个数据样本,每一列代表一个特征。
  • 目标标签(y):对应的标签,指明每个样本的类别。
2. 训练过程

在训练SVM模型时,算法会执行以下步骤:

  • 选择超平面:SVM会尝试不同的超平面,直到找到一个最佳超平面,使得支持向量的间隔最大化。

  • 优化问题:SVM的核心是一个优化问题,目的是最小化一个代价函数:

  • 在这里插入图片描述

    这确保了所有数据点都被正确分类,并且在超平面与数据点之间保持一定的间隔。
    在这里插入图片描述

3. 核函数的深入理解

核函数使得SVM能够处理非线性问题。通过使用核函数,SVM可以在低维空间中寻找线性超平面,从而在高维空间中实现非线性分离。常见的核函数包括:

  • 线性核:简单而高效,适用于线性可分的数据。公式为:

  • 多项式核:用于多项式关系的数据。公式为:
    在这里插入图片描述

    其中 (c) 是常数,(d) 是多项式的度数。

  • 径向基函数(RBF)核:非常流行,适合大多数非线性数据。公式为:
    在这里插入图片描述

    其中 (\gamma) 控制了高斯分布的宽度。

调优SVM模型

在使用SVM时,有几个关键参数需要调整以获得最佳性能:

  1. C参数

    • C是一个正则化参数,控制着分类器的复杂性。较小的C会导致一个较宽的间隔,可能会在某些训练数据上产生更多的错误分类;而较大的C会尽量减少分类错误,从而可能导致过拟合。
  2. 核函数选择

    • 根据数据的特性选择合适的核函数。对于线性可分数据,使用线性核;对于复杂的非线性数据,考虑使用RBF核。
  3. gamma参数(适用于RBF核)

    • gamma参数控制了单个训练样本的影响范围。较小的gamma会导致决策边界变得平滑,而较大的gamma则会导致决策边界变得复杂。

SVM在Sklearn中的实现

接下来是一个更全面的Sklearn SVM实现示例,包括参数调优的部分:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn import svm
from sklearn.metrics import classification_report, confusion_matrix# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只取前两个特征,便于可视化
y = iris.target# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 使用网格搜索进行参数调优
param_grid = {'C': [0.1, 1, 10],'kernel': ['linear', 'rbf'],  # 使用线性核和RBF核进行比较'gamma': [0.1, 1, 10]  # 仅在使用RBF核时考虑
}
grid_search = GridSearchCV(svm.SVC(), param_grid, cv=5)  # 5折交叉验证
grid_search.fit(X_train, y_train)# 输出最佳参数
print("Best parameters found: ", grid_search.best_params_)# 使用最佳参数训练模型
best_clf = grid_search.best_estimator_
y_pred = best_clf.predict(X_test)# 评估模型
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))
print("\nClassification Report:")
print(classification_report(y_test, y_pred))# 绘制结果
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, s=50, cmap='coolwarm', edgecolor='k')
plt.title('SVM Classification Result with Grid Search')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

SVM在PyTorch中的实现

在PyTorch中实现SVM通常涉及更底层的操作,下面是一个完整的示例,包括数据加载、模型定义、训练、以及评估:

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler# 定义SVM模型
class SVM(nn.Module):def __init__(self, input_size):super(SVM, self).__init__()self.linear = nn.Linear(input_size, 1)def forward(self, x):return self.linear(x)# 加载数据集
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只取前两个特征
y = iris.target
y[y == 2] = 1  # 将三分类问题简化为二分类问题# 标准化数据
scaler = StandardScaler()
X = scaler.fit_transform(X)# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 转换为PyTorch张量
X_train_tensor = torch.FloatTensor(X_train)
y_train_tensor = torch.FloatTensor(y_train).view(-1, 1)
X_test_tensor = torch.FloatTensor(X_test)# 初始化模型、损失函数和优化器
model = SVM(input_size=2)
criterion = nn.MarginRankingLoss(margin=1.0)  # 使用边际排名损失
optimizer = optim.SGD(model.parameters(), lr=0.01)# 训练模型
for epoch in range(100):model.train()optimizer.zero_grad()outputs = model(X_train_tensor)# SVM要求的标签格式targets = torch.FloatTensor([[1 if label == 1 else -1] for label in y_train])loss = criterion(outputs, torch.zeros_like(outputs), targets)loss.backward()optimizer.step()# 预测
model.eval()
with torch.no_grad():predictions = model(X_test_tensor)y_pred = (predictions.numpy() > 0).astype(int)# 绘制结果
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, s=50, cmap='coolwarm', edgecolor='k')
plt.title('SVM Classification Result in PyTorch')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()# 计算准确率
accuracy = np.mean(y_pred.flatten() == y_test)
print(f'Accuracy: {accuracy * 100:.2f}%')

总结

支持向量机(SVM)是一种非常强大且灵活的分类算法,适用于线性和非线性数据。通过选择适当的核函数、调节参数(如C和gamma),SVM可以在各种应用中表现出色。使用Sklearn提供的简单接口可以快速实现和评估SVM模型,而在PyTorch中,我们能够更细致地控制模型的结构和训练过程。无论是进行简单的分类任务,还是复杂的非线性数据分析,SVM都是一个值得考虑的选择。

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

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

相关文章

原来“有符号数变成无符号数,并不是-1变成1,-15变成15”!!

不怕大家伙笑话,我以前一直以为在C语言中,有符号变无符号仅仅就是去掉数字前面的符号就行,如今做了一道题,细细研究,才发现,原来不是! 如果你也感兴趣,那就学学今天这节吧~ 话不多说…

前端必知必会-JavaScript 简介

文章目录 JavaScript 简介JavaScript 可以更改 HTML 内容JavaScript 可以更改 HTML 属性值JavaScript 可以更改 HTML 样式 (CSS)JavaScript 可以隐藏 HTML 元素JavaScript 可以显示 HTML 元素 总结 JavaScript 简介 本页包含一些 JavaScript 功能的示例。 JavaScript 可以更改…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-20

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-20 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-20目录1. FLARE: Faithful Logic-Aided Reasoning and Exploration摘要研究背景问题与挑战如何解决创新点算法模型实验效果重要数…

多线程进阶——线程池的实现

什么是池化技术 池化技术是一种资源管理策略,它通过重复利用已存在的资源来减少资源的消耗,从而提高系统的性能和效率。在计算机编程中,池化技术通常用于管理线程、连接、数据库连接等资源。 我们会将可能使用的资源预先创建好,…

Ubuntu22.04虚拟机安装

一、安装介质下载: 在官网下载安装镜像,下载地址https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso 二、操作系统安装: step 1:进入ubuntu的安装界面,直接回车安装。 step 2:选择语言,直接回…

liunx线程互斥

临界资源和临界区 临界资源:多线程执行流共享的资源就叫临界资源。 临界区:每个线程中,访问临界区的代码,就叫临界区。 互斥:任何时候,互斥保证只有一个执行流进入临界区,访问临界资源&#…

NXP Smart Access Car-车用产品整合应用

在汽车技术不断进步的今天,智能化已成为汽车行业发展的主要趋势之一。本次研讨会将深入探讨NXP的Smart Access Car技术,说明如何通过NXP 产品设计提升汽车的安全性、便利性和使用者体验。研讨会将涵盖NXP MCU/NFC等方面的最新解决方案,并探讨…

Qt调用Yolov11导出的Onnx分类模型开发分类检测软件

软件视频地址:视频地址 代码开源地址 之前用Python配合YOLOV11开发一个了分类训练软件,软件只要准备好数据,然后导入就可以训练数据,训练完成后还可以验证,测试,但是要真正落地,还是有点欠缺。配合YOLOV1…

入门数据结构JAVADS——如何通过遍历顺序构建二叉树

目录 前言 构建二叉树的前提: 为什么需要两个不同类型的遍历: 前序遍历 中序遍历 我们的算法思路如下: 举例: 代码实现 后序遍历 中序遍历 结尾 前言 入门数据结构JAVA DS——二叉树的介绍 (构建,性质,基本操作等) (1)-CSDN博客 在上…

我毕业后的8年嵌入式工作

2015年毕业,2016年工作到现在已经过了8个年头,借着征文,做个简单的回顾与总结。 2015年从广州番禺职业技术学院毕业,学的是嵌入式技术与应用,我的下一届学弟学妹变物联网了,算是绝版专业了吧。出来后谨遵校…

07 设计模式-结构型模式-桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得…

JAVA单列集合

List系列集合:添加的元素是 有序、可重复、有索引 Set系列集合:添加的元素是 无序、不重复、无索引 Collection Collection是单列集合的接口,它的功能是全部单列集合都可以继承使用的 public boolean add(E e) 把给定的对象添加到当前集合中 public void …

Spring MVC(下)

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多JavaEE知识 目录 1.响应 1.1 返回静态页面 1.2 返回数据ResponseBody 1.3 返回HTML代码⽚段 1.4 返回JSON 1.5 设置状态码 1.6 设置Header 2 . …

【文献及模型、制图分享】基于国际湿地城市视角的常德市湿地保护修复成效与归因分析及其政策启示

文献介绍 《湿地公约》提出的“国际湿地城市”认证是促进湿地保护修复的新举措。以国际湿地城市常德市为例,基于2000—2022年15 m空间分辨率湿地分类数据,监测常德市湿地保护修复逐年动态变化,定量分析湿地保护修复驱动因素的重要性和贡献率…

K8s中TSL证书如何续期

TSL是什么 K8s中的作用是什么? 在 Kubernetes(K8s)中,TSL 指的是 Transport Layer Security,也就是传输层安全协议。它是用来保护在网络上传输的数据的安全性和隐私性。 TSL 在 Kubernetes 中的作用包括:…

第1讲(ASP.NET Core 6 Web Api 开发入门):第一个Web Api项目

一、运行模板项目 二、验证模板项目的api 法1:直接在网页上进行验证api 法2:通过命令行验证api 复制下图的Curl语句,打开命令行进行粘贴。(对于windows系统,需要把换成",再去掉所有的/,最…

一文了解AOSP是什么?

一文了解AOSP是什么? AOSP基本信息 基本定义 AOSP是Android Open Source Project的缩写,这是一个由Google维护的完全免费和开放的操作系统开发项目。它是Android系统的核心基础,提供了构建移动操作系统所需的基本组件。 主要特点 完全开源…

【景观生态学实验】实验一 ArcGIS地理数据处理及制图基础

实验目的 1.掌握ArcGIS软件基本操作:通过实验操作与学习,熟练掌握ArcGIS软件相关的基本操作,包括界面熟悉、工具栏使用、数据的加载和保存、基本数据处理操作等; 2.掌握如何使用ArcGIS进行影像拼接及裁剪:通过实验操作与学习&am…

传知代码-ChatGPT多模态命名实体识别

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 ChatGPT辅助细化知识增强! 多模态命名实体识别(MNER)最近引起了广泛关注。 用户在社交媒体上生成大量非结构化内容,主要由图像和文本组成。这些帖子具有与社交媒体相…

GISBox vs CesiumLab:哪款GIS工具更适合你的项目?

在地理信息系统(GIS)领域,越来越多的用户开始关注GIS工具箱的选择,其中GISBox和CesiumLab是两款备受推崇的产品。那么,哪一款更适合你的需求呢?本文将从功能、使用体验和应用场景等方面,对GISBo…