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.rhkb.cn/news/458489.html

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

相关文章

Windows/Linux(服务器)查看显卡的名称

文章目录 1. 使用 nvidia-smi(适用于 NVIDIA 显卡)2. 使用 wmic 命令(Windows) 1. 使用 nvidia-smi(适用于 NVIDIA 显卡) 如果服务器上安装了 NVIDIA 驱动程序,可以使用 nvidia-smi 工具来查看…

vue使用xlsx以及file-saver进行下载xlsx文件以及Unit8Array、ArrayBuffer、charCodeAt的使用

先说Unit8Array、ArrayBuffer、charCodeAt的使用下面会用到这三个 Unit8Array:数组类型表示一个 8 位无符号整型数组,创建时内容被初始化为 0。创建完后,可以以对象的方式或使用数组下标索引的方式引用数组中的元素。 new Uint8Array(); //…

Docker中如何控制服务启动顺序实现探讨

文章目录 一、Docker概述二、Docker三剑客1. Compose2. Machine3. Swarm 三、简要需求1. 样例工程2. 代码模块3. 调用方向4. 期望启动顺序 四、思路分析1.各走各路1.)docker-compose -f指定不同配置文件2.)docker-compose up -d service-name指定服务名3…

【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则(上篇) 8.1.1 图层的定义(上篇)8.1.2 图层的…

巡飞单机多旋翼无人机技术详解

巡飞单机多旋翼无人机技术是一种集成了多种先进技术的无人机系统,它具备自主飞行、长续航、高精度控制以及多任务负载能力等特点。以下是对巡飞单机多旋翼无人机技术的详细解析: 一、机架与结构设计 1.材料选择:为了确保无人机能够承载足够…

cmake命令使用

有关cmake的入门简介可参见 CMake入门教程_cmake静态test.c编译-CSDN博客 本文是进一步对cmake常用命令做进一步详述 配置项目 cmake_minimum_required 作用 配置cmake最低版本 用法 cmake_minimum_required(VERSION 3.0) project 作用:设置预设变量 PROJEC…

深度学习(一)基础:神经网络、训练过程与激活函数(1/10)

深度学习基础:神经网络、训练过程与激活函数 引言: 深度学习作为机器学习的一个子领域,近年来在人工智能的发展中扮演了举足轻重的角色。它通过模仿人脑的神经网络结构,使得计算机能够从数据中学习复杂的模式和特征,…

dmsql日志分析工具部署与使用DM8/DM7

dmsql日志分析工具部署与使用DM8/DM7 1 环境介绍2 JAVA 环境变量配置2.1 Os Kylin 10 JAVA 环境变量配置2.2 Windos7 JAVA环境变量配置 3 数据库配置3.1 数据库初始化参数3.2 数据库创建表 4 配置DMLOG日志分析工具4.1 Kylin v10 配置DMLOG日志分析工具4.2 执行日志分析4.3 Win…

linux面试题复习

前言 现在只是初版,很多格式我还没有改好,会慢慢修改订正。 可能用到的网址:在线 EXCEL 到 MARKDOWN 转换器。 参考了很多网上的面试题和外网上的面试题: 参考文档: 程序员的50大Linux面试问题及答案 Top 60 Linux …

MySQL——test4(综合练习)

目录 建库建表(题目)处理表1. 修改student 表中年龄(sage)字段属性,数据类型由int 改变为smallint2. 为Course表中Cno 课程号字段设置索引,并查看索引3. 为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引,索引名为SC_INDE…

数据结构:“小猫钓鱼游戏”

一:题目 栈和队列的综合应用:“小猫钓鱼”的游戏规则是:将一副扑克牌平均分成两份,每人拿一份。玩家甲先拿出手中的第一张扑克牌放在桌上,然后玩家乙也拿出手中的第一张扑克牌,并放在玩家甲刚打出的扑克牌的…

前端算法:树(力扣144、94、145、100、104题)

目录 一、树(Tree) 1.介绍 2.特点 3.基本术语 4.种类 二、树之操作 1.遍历 前序遍历(Pre-order Traversal):访问根节点 -> 遍历左子树 -> 遍历右子树。 中序遍历(In-order Traversal&#xf…

STM32L476芯片在KEIL环境下BOOT跳转APP注意事项

BOOT工程 分配BOOT程序地址、设置参数地址、APP程序地址、下载缓冲区地址 #define BOOT_SECTOR_ADDR 0x08000000 #define BOOT_SECTOR_SIZE 0x0000A000 #define SETTING_SECTOR_ADDR 0x0800A000 #define SETTING_SECTOR_SIZE 0x00002000 #define APP_S…

R语言 | paletteer包:拥有2100多个调色板!

看到 PMID:39024031 文章的代码中&#xff0c;有颜色设置的语句&#xff1a; pal <- paletteer_d("ggsci::category20_d3")[c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)]DimPlot(MM,reduction umap,group.by "sample",label F,pt.size 0.1,c…

从零开始机器学习——基于PyTorch构建你的第一个线性回归模型

随着人工智能技术的迅猛发展&#xff0c;机器学习成为了现代科技领域中最炙手可热的话题之一。然而&#xff0c;对于初学者来说&#xff0c;机器学习似乎总是充满了复杂的理论和难以理解的概念。本文将带你从零开始&#xff0c;使用PyTorch深度学习框架&#xff0c;构建一个最简…

【设计模式系列】代理模式(八)

一、什么是代理模式 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下&#xff0c;提供了对目标对象的间接访问。通过引入一个代理对象来间接操作实际对…

layui扩展组件之----右键菜单

源码&#xff1a;rightmenu.js layui.define([element], function (exports) {let element layui.element;const $ layui.jquery;let MOD_NAME rightmenu;let RIGHTMENUMOD function () {this.v 1.0.0;this.author raowenjing;};String.prototype.format function () {…

检索引擎Elasticsearch

一.为什么要用Elasticsearch 由于我们在运行我们的项目的时候通常都是将数据存到mysql或者sql serve等数据库中&#xff0c;在进行数据搜索时使用sql 语句 like进行模糊匹配查询&#xff0c;其一&#xff1a;虽然可以查到数据&#xff0c;但是它模糊匹配查询速度较慢&#xff0…

世优科技“AI+空间计算”推动消费行业向智能化升级

人工智能的演进正从初期的技术探索阶段&#xff0c;转向技术应用阶段&#xff0c;在此趋势下&#xff0c;融合了多模态大模型、虚拟现实、空间计算等前沿技术的人工智能应用新方向&#xff0c;展现出了巨大的潜力和商业价值。 10月19日&#xff0c;2024北京朝阳国际灯光节全新…

[C++11] 右值引⽤与移动语义

文章目录 左值和右值左值&#xff08;Lvalue&#xff09;右值&#xff08;Rvalue&#xff09;区别 左值引⽤和右值引⽤左值引用&#xff08;Lvalue Reference&#xff09;右值引用&#xff08;Rvalue Reference&#xff09;右值引用的特点 右值引用延长生命周期右值引⽤和移动语…