支持向量机(Support Vector Machine,SVM)详细解释(带示例)

目录

基本概念

线性可分情况

线性不可分情况

工作原理

示例

[Python 案例](#Python 案例)

代码解释


基本概念

支持向量机是一种有监督的机器学习算法,可用于分类和回归任务。在分类问题中,SVM 的目标是找到一个最优的超平面,将不同类别的样本分隔开来,并且使得两类样本到该超平面的间隔最大。这个超平面被称为最大间隔超平面,而那些离超平面最近的样本点被称为支持向量,它们决定了超平面的位置和方向。

线性可分情况

当数据是线性可分的,即存在一个超平面能够完全将不同类别的样本分开时,SVM 会寻找一个具有最大间隔的超平面。假设我们有一个二维数据集,包含两类样本,此时的超平面就是一条直线。SVM 会找到这样一条直线,使得两类样本到该直线的距离(间隔)最大。

线性不可分情况

在实际应用中,数据往往是线性不可分的,即不存在一个超平面能够完美地将不同类别的样本分开。为了解决这个问题,SVM 引入了核函数和软间隔的概念。

  • 核函数:通过将原始数据映射到一个更高维的特征空间,使得数据在新的空间中变得线性可分。常见的核函数有线性核、多项式核、高斯核(RBF 核)等。
  • 软间隔:允许部分样本点落在间隔带内甚至错误分类,通过引入一个惩罚参数 C 来控制这种错误分类的程度。 C 值越大,对错误分类的惩罚越严重; C 值越小,允许更多的样本点被错误分类。
工作原理

SVM 的核心是求解一个凸二次规划问题,以找到最优的超平面。对于线性可分问题,其目标是最大化间隔;对于线性不可分问题,目标是在最大化间隔的同时,最小化错误分类的样本数量。

示例

假设我们有一个简单的二维数据集,包含两类样本:红色点和蓝色点。在二维平面上,这些点可能分布得比较杂乱,无法用一条直线直接将它们分开。通过使用核函数(如高斯核),我们可以将这些二维数据映射到一个更高维的空间中,在这个高维空间中,可能就存在一个超平面能够将红色点和蓝色点分开。

Python 案例

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
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.3, random_state=42)

# 创建 SVM 分类器,使用径向基核函数(RBF)
svm_classifier = SVC(kernel='rbf', C=1.0, gamma='scale')

# 训练模型
svm_classifier.fit(X_train, y_train)

# 预测测试集
y_pred = svm_classifier.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"支持向量机模型的准确率: {accuracy:.2f}")

# 可视化决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))
Z = svm_classifier.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('SVM Decision Boundary')
plt.show()

代码解释

  1. 数据加载与预处理 :使用 datasets.load_iris() 加载鸢尾花数据集,并只选取前两个特征用于可视化。然后使用 train_test_split 函数将数据集划分为训练集和测试集。
  2. 模型创建与训练 :创建一个 SVM 分类器 SVC,使用径向基核函数(RBF),并设置惩罚参数 C=1.0 和核系数 gamma='scale'。然后使用训练集数据对模型进行训练。
  3. 模型预测与评估 :使用训练好的模型对测试集进行预测,并使用 accuracy_score 函数计算预测结果的准确率。
  4. 可视化决策边界:通过生成网格点,使用训练好的模型对网格点进行预测,然后绘制决策边界和样本点,直观展示 SVM 的分类效果。
相关推荐
蚍蜉撼树谈何易36 分钟前
机器学习的定义及分类
人工智能·机器学习·分类
f狐0狸x2 小时前
【蓝桥杯每日一题】4.1
c语言·c++·算法·蓝桥杯
ん贤2 小时前
2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题&题解)(C++/Java题解)
java·c语言·数据结构·c++·算法·蓝桥杯
梭七y2 小时前
【力扣hot100题】(022)反转链表
算法·leetcode·链表
威视锐科技5 小时前
软件定义无线电36
网络·网络协议·算法·fpga开发·架构·信息与通信
牧歌悠悠5 小时前
【Python 算法】动态规划
python·算法·动态规划
JINX的诅咒5 小时前
CORDIC算法:三角函数的硬件加速革命——从数学原理到FPGA实现的超高效计算方案
算法·数学建模·fpga开发·架构·信号处理·硬件加速器
明天不下雨(牛客同名)6 小时前
为什么 ThreadLocalMap 的 key 是弱引用 value是强引用
java·jvm·算法
lisw057 小时前
DeepSeek原生稀疏注意力(Native Sparse Attention, NSA)算法介绍
人工智能·深度学习·算法
喝拿铁写前端8 小时前
SmartField AI:让每个字段都找到归属!
前端·算法