支持向量机(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 的分类效果。
相关推荐
江畔柳前堤11 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore12 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考13 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX14 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面15 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号15 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽15 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI15 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者17 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者17 小时前
【征程6】校准量化中HistogramObserver解析
算法