机器学习之支持向量机(SVM)算法详解

机器学习之支持向量机(SVM)算法详解

文章目录

引言

支持向量机(Support Vector Machine, SVM)是一种经典的监督学习算法,广泛应用于分类和回归问题。SVM以其强大的数学基础和优异的性能在机器学习领域占据重要地位。本文将详细介绍SVM的原理、数学推导、应用场景以及Python实现。

一、 什么是支持向量机(SVM)

支持向量机是一种二分类模型,其基本思想是找到一个超平面,将不同类别的数据分隔开,并且使得两类数据点到超平面的距离(即间隔)最大化。SVM不仅可以处理线性可分问题,还可以通过核函数处理非线性可分问题。

二、 SVM的基本原理

SVM的核心目标是找到一个最优超平面,使得两类数据点的间隔最大化。这个超平面可以表示为:

其中,(w) 是法向量,决定了超平面的方向;(b) 是偏置项,决定了超平面的位置。

对于线性可分的数据,SVM的目标是找到 (w) 和 (b),使得所有样本点满足:

在这里插入图片描述

其中,(yi) 是样本的标签(取值为 +1 或 -1),(xi) 是样本特征。

三、数学推导

1.线性可分情况

对于线性可分的数据,SVM的优化目标是最大化间隔。间隔的定义为:

在这里插入图片描述

因此,SVM的优化问题可以转化为:

在这里插入图片描述

这是一个凸二次规划问题,可以通过拉格朗日乘子法求解。

2. 非线性可分情况

对于非线性可分的数据,SVM引入松弛变量 (\xi_i),允许部分样本点不满足约束条件。此时,优化问题变为:

在这里插入图片描述

其中,(C) 是正则化参数,用于控制分类错误和间隔的平衡。

3. 核函数

对于非线性问题,SVM通过核函数将数据映射到高维空间,使其在高维空间中线性可分。常用的核函数包括:

  • 高斯核(RBF核):

多项式核:

在这里插入图片描述

线性核:

在这里插入图片描述

核函数的选择对SVM的性能有重要影响。

四、SVM的优缺点

优点:

  • 在高维空间中表现优异。
  • 适用于小样本数据集。
  • 通过核函数可以处理非线性问题。

缺点:

  • 对大规模数据集训练速度较慢。
  • 对参数和核函数的选择敏感。
  • 难以直接用于多分类问题(需要通过组合多个二分类器实现)。

五、 应用场景

SVM广泛应用于以下领域:

  • 文本分类(如垃圾邮件过滤)
  • 图像分类(如手写数字识别)
  • 生物信息学(如基因分类)
  • 金融风控(如信用评分)

六、 Python实现示例

以下是使用Python和Scikit-learn库实现SVM的示例代码:

import pandas as pd data = pd.read_csv("iris.csv",header=None)"""可视化原始数据""" import matplotlib.pyplot as plt data1 = data.iloc[:50, :] data2 = data.iloc[50:, :]# 原始数据是四维,无法展示,选择两个进行展示 plt.scatter(data1[1], data1[3], marker='+') plt.scatter(data2[1], data2[3], marker='o')"""使用SVM进行训练""" x = data.iloc[:, [1,3]] y = data.iloc[:, -1]# 标准化数据# from sklearn.preprocessing import StandardScaler# scaler = StandardScaler()# x = scaler.fit_transform(x) from sklearn.model_selection import train_test_split x_train,x_test,y_train,y_test =\ train_test_split(x,y,test_size=0.2,random_state=42) from sklearn.svm import SVC svm = SVC(kernel='linear',C=float('inf'),random_state=0) svm.fit(x_train,y_train)"""可视化SVM结果""" # 参数w[原始数据为二维数组] w = svm.coef_[0]# 偏置项[原始数据为一维数组] b = svm.intercept_[0]### w 和 b 决定了模型的决策边界import numpy as np x1 = np.linspace(0, 7, 300)# 在 0 到 7 之间生成 300 个等间距的点# 超平面方程 x2 = -(w[0] * x1 + b) / w[1]# 上超平面方程 x3 =(1 - (w[0] * x1 + b)) / w[1]# 下超平面方程 x4 =(-1 - (w[0] * x1 + b)) / w[1]# 可视化超平面 plt.plot(x1, x2, linewidth=2, color='r') plt.plot(x1, x3, linewidth=1, color='r', linestyle='--') plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')# 进行坐标轴限制 plt.xlim(4, 7) plt.ylim(0, 5)# 找到支持向量[二维数组]可视化支持向量# svm.support_vectors_是 SVM 模型中的一个属性,返回所有支持向量。# vets 是一个二维数组,每一行表示一个支持向量的特征值 vets = svm.support_vectors_ # vets[:, 0] 和 vets[:, 1] 分别表示支持向量的第一个和第二个特征值(假设数据是二维的)。 plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x') plt.show()

七、 总结

支持向量机是一种强大且灵活的机器学习算法,适用于多种分类和回归问题。通过核函数,SVM能够处理非线性数据,并在高维空间中表现出色。然而,SVM的训练速度较慢,且对参数选择敏感。在实际应用中,需要根据具体问题选择合适的核函数和参数。

希望本文能帮助你更好地理解SVM算法,并为你的机器学习之旅提供帮助!

Read more

Flutter 组件 graphql 的适配 鸿蒙Harmony 实战 - 驾驭标准化分布式图形协议、实现鸿蒙端实时订阅与高性能交互网关方案

Flutter 组件 graphql 的适配 鸿蒙Harmony 实战 - 驾驭标准化分布式图形协议、实现鸿蒙端实时订阅与高性能交互网关方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 graphql 的适配 鸿蒙Harmony 实战 - 驾驭标准化分布式图形协议、实现鸿蒙端实时订阅与高性能交互网关方案 前言 在鸿蒙(OpenHarmony)生态的万物互联、极繁交互中台、以及对数据获取灵活性有极致要求的现代应用研发中,“高效的数据检索协议”是应用响应速度的灵魂。面对复杂的社交网络关系查询、实时的行情推送、或是海量状态信息的聚合。如果仅仅依靠传统的 RESTful 接口,那么不仅会导致因为 Over-fetching(获取多余数据)导致的带宽浪费,更会因为频繁的 API 版本演进引入严重的跨端兼容性碎片化问题。 我们需要一种“按需检索、逻辑解耦”的交互艺术。 graphql 是一套专为 Flutter 设计的标准 GraphQL 客户端套件。它通过构建规范的规范化缓存(Normalized Cache)与极其灵活的连接链路(Links)

By Ne0inhk
【MYSQL】MYSQL学习的一大重点:MYSQL表的操作

【MYSQL】MYSQL学习的一大重点:MYSQL表的操作

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 文章目录 * 0 ~> 概要 * 1 ~> 创建表 * 2 ~> 创建表的案例详解 * 3 ~> 查看表结构 * 4 ~> 修改表 * 4.1 什么时候需要修改表 * 4.2 修改方式 * 4.3 案例 * 4.3.1 在users表添加二条记录 * 4.

By Ne0inhk
Spring Boot 实战:MyBatis 操作数据库(上)

Spring Boot 实战:MyBatis 操作数据库(上)

—JavaEE专栏— Spring Boot 实战:MyBatis 操作数据库(上) 摘要 本文深度解析了 Spring Boot 环境下 MyBatis 的集成与应用。通过回顾传统 JDBC 的局限性,详细展示了 MyBatis 在日志配置、CRUD 操作、自增主键返回及多表查询中的实战用法。同时,文章深入探讨了 #{} 与 ${} 的底层预编译差异及安全风险,并分享了企业级开发中的数据库命名规范与 Druid 连接池配置,助力开发者构建稳健的持久层架构。 文章目录 * Spring Boot 实战:MyBatis 操作数据库(上) * 摘要 * @[toc] * 1. 为什么持久层开发需要 MyBatis? * 1.1 传统 JDBC 的局限性 * 1.2

By Ne0inhk