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

王柳  金牌会员 | 2025-3-23 05:56:50 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 993|帖子 993|积分 2979

引言

支持向量机(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的示例代码:
  1. import pandas as pd
  2. data = pd.read_csv("iris.csv",header=None)
  3. """可视化原始数据"""
  4. import matplotlib.pyplot as plt
  5. data1 = data.iloc[:50, :]
  6. data2 = data.iloc[50:, :]
  7. # 原始数据是四维,无法展示,选择两个进行展示
  8. plt.scatter(data1[1], data1[3], marker='+')
  9. plt.scatter(data2[1], data2[3], marker='o')
  10. """使用SVM进行训练"""
  11. x = data.iloc[:, [1,3]]
  12. y = data.iloc[:, -1]
  13. # 标准化数据
  14. # from sklearn.preprocessing import StandardScaler
  15. # scaler = StandardScaler()
  16. # x = scaler.fit_transform(x)
  17. from sklearn.model_selection import train_test_split
  18. x_train,x_test,y_train,y_test = \
  19.             train_test_split(x,y,test_size=0.2,random_state=42)
  20. from sklearn.svm import SVC
  21. svm = SVC(kernel='linear',C=float('inf'),random_state=0)
  22. svm.fit(x_train,y_train)
  23. """可视化SVM结果"""
  24. # 参数w[原始数据为二维数组]
  25. w = svm.coef_[0]
  26. # 偏置项[原始数据为一维数组]
  27. b = svm.intercept_[0]
  28. ### w 和 b 决定了模型的决策边界
  29. import numpy as np
  30. x1 = np.linspace(0, 7, 300)  # 在 0 到 7 之间生成 300 个等间距的点
  31. # 超平面方程
  32. x2 = -(w[0] * x1 + b) / w[1]
  33. # 上超平面方程
  34. x3 = (1 - (w[0] * x1 + b)) / w[1]
  35. # 下超平面方程
  36. x4 = (-1 - (w[0] * x1 + b)) / w[1]
  37. # 可视化超平面
  38. plt.plot(x1, x2, linewidth=2, color='r')
  39. plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')
  40. plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')
  41. # 进行坐标轴限制
  42. plt.xlim(4, 7)
  43. plt.ylim(0, 5)
  44. # 找到支持向量[二维数组]可视化支持向量
  45. # svm.support_vectors_是 SVM 模型中的一个属性,返回所有支持向量。
  46. # vets 是一个二维数组,每一行表示一个支持向量的特征值
  47. vets = svm.support_vectors_
  48. # vets[:, 0] 和 vets[:, 1] 分别表示支持向量的第一个和第二个特征值(假设数据是二维的)。
  49. plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x')
  50. plt.show()
复制代码
七、 总结

支持向量机是一种强大且灵活的呆板学习算法,适用于多种分类和回归题目。通过核函数,SVM能够处理非线性数据,并在高维空间中表现出色。然而,SVM的练习速度较慢,且对参数选择敏感。在实际应用中,需要根据具体题目选择合适的核函数和参数。
希望本文能资助你更好地理解SVM算法,并为你的呆板学习之旅提供资助!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表