当前位置: 首页 > news >正文

支持向量机 (support vector machine,SVM)

支持向量机 (support vector machine,SVM)

flyfish

支持向量机是一种用于分类和回归的机器学习模型。在分类任务中,SVM试图找到一个最佳的分隔超平面,使得不同类别的数据点在空间中被尽可能宽的间隔分开。

超平面方程和直线方程

超平面(hyperplane)是一个在高维空间中将空间分成两个部分的几何对象。它的方程可以在不同维度的空间中有不同的形式。

一维空间中的“超平面”

在一维空间中,超平面就是一个点。假设我们在一维空间中有一个超平面,它可以表示为:
x = a x = a x=a
其中, a a a 是某个常数。这表示一维空间中的一个特定点,将空间分成两个部分: x < a x < a x<a x > a x > a x>a

二维空间中的超平面(直线)

在二维空间中,超平面就是一条直线。直线的方程可以表示为:
y = k x + b y = kx + b y=kx+b
其中, k k k 是斜率, b b b 是截距。或者,可以表示为标准形式:
a x + b y + c = 0 ax + by + c = 0 ax+by+c=0
其中, a a a b b b c c c 是常数。
这条直线将二维空间分成两个半平面。

三维空间中的超平面(平面)

在三维空间中,超平面是一个平面。平面的方程可以表示为:
a x + b y + c z + d = 0 ax + by + cz + d = 0 ax+by+cz+d=0
其中, a a a b b b c c c d d d 是常数。
这个平面将三维空间分成两个半空间。

一般形式的超平面方程

在更高维度的空间中,超平面的方程一般可以表示为:
w ⋅ x + b = 0 \mathbf{w} \cdot \mathbf{x} + b = 0 wx+b=0
其中:

  • w = ( w 1 , w 2 , … , w n ) \mathbf{w} = (w_1, w_2, \ldots, w_n) w=(w1,w2,,wn) 是一个权重向量,定义了超平面的方向。

  • x = ( x 1 , x 2 , … , x n ) \mathbf{x} = (x_1, x_2, \ldots, x_n) x=(x1,x2,,xn) 是一个点的坐标向量。

  • b b b 是偏置。
    这个超平面将 n n n 维空间分成两个半空间。

直线方程是超平面方程在二维空间中的一种特例。一般来说,超平面是 n n n 维空间中的一个 ( n − 1 ) (n-1) (n1) 维的对象:

  • 在一维空间中,超平面是一个点。

  • 在二维空间中,超平面是一个直线。

  • 在三维空间中,超平面是一个平面。

  • 在四维及更高维空间中,超平面是一个 ( n − 1 ) (n-1) (n1) 维的对象。

示例和理解

一维空间中的超平面

x = 2 x = 2 x=2
这是在一维空间中的一个点,将空间分为 x < 2 x < 2 x<2 x > 2 x > 2 x>2 两部分。

二维空间中的超平面

标准形式:
2 x + 3 y − 6 = 0 2x + 3y - 6 = 0 2x+3y6=0
或者:
y = − 2 3 x + 2 y = -\frac{2}{3}x + 2 y=32x+2
这是在二维空间中的一条直线。

三维空间中的超平面

2 x + 3 y + 4 z − 5 = 0 2x + 3y + 4z - 5 = 0 2x+3y+4z5=0
这是在三维空间中的一个平面。
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm# 生成一些数据
np.random.seed(0)
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
Y = [0] * 20 + [1] * 20# 拟合模型
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)# 绘制数据点和分类超平面
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()# 创建网格以评估模型
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)# 绘制分类超平面
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, linewidth=1, facecolors='none', edgecolors='k')
plt.show()

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from mpl_toolkits.mplot3d import Axes3D# 生成三维数据
np.random.seed(0)
X = np.r_[np.random.randn(20, 3) - [2, 2, 2], np.random.randn(20, 3) + [2, 2, 2]]
Y = [0] * 20 + [1] * 20# 拟合模型
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)# 创建一个网格来绘制分类平面
xx, yy = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50))
zz = (-clf.intercept_[0] - clf.coef_[0][0] * xx - clf.coef_[0][1] * yy) / clf.coef_[0][2]# 绘制数据点和分类平面
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')ax.scatter(X[:20, 0], X[:20, 1], X[:20, 2], color='b', marker='o', label='Class 0')
ax.scatter(X[20:, 0], X[20:, 1], X[20:, 2], color='r', marker='^', label='Class 1')ax.plot_surface(xx, yy, zz, color='g', alpha=0.5, rstride=100, cstride=100)ax.set_xlabel('X1')
ax.set_ylabel('X2')
ax.set_zlabel('X3')plt.legend()
plt.show()

最大间隔解释

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.svm import SVC
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 生成一个简单的二维分类数据集
X, y = datasets.make_blobs(n_samples=50, centers=2, random_state=6)# 训练一个线性支持向量机
clf = SVC(kernel='linear', C=1000)
clf.fit(X, y)# 获取分隔超平面
w = clf.coef_[0]
b = clf.intercept_[0]# 计算分隔超平面的两个端点
x = np.linspace(-10, 10, 100)
y_hyperplane = -w[0]/w[1] * x - b/w[1]# 计算间隔边界
margin = 1 / np.sqrt(np.sum(w ** 2))
y_margin_up = y_hyperplane + margin
y_margin_down = y_hyperplane - margin# 绘制数据点、分隔超平面及其间隔边界
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm')
plt.plot(x, y_hyperplane, 'k-', label='分隔超平面')
plt.plot(x, y_margin_up, 'k--', label='上间隔边界')
plt.plot(x, y_margin_down, 'k--', label='下间隔边界')# 绘制支持向量
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, facecolors='none', edgecolors='k', label='支持向量')plt.legend()
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('最大化间隔的 SVM')
plt.show()

拉格朗日乘子法

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • UML建模案例分析-类图中的关系
  • 大模型/NLP/算法面试题总结2——transformer流程//多头//clip//对比学习//对比学习损失函数
  • stm32使用双通道ADC读取
  • 2024辽宁省数学建模B题【钢铁产品质量优化】思路详解
  • TCP网络传输控制协议
  • 在 WebSocket 连接建立之前进行身份验证时,token 应该如何存储
  • 【ARM】MDK安装ARM_compiler5无法打开安装程序
  • Debezium系列之:验证mysql、mariadb等兼容mysql协议数据库账号权限
  • 用 Kotlin 编写四则运算计算器:从零开始的简单教程
  • 数据结构(2)
  • 单目测距 单目相机测距 图片像素坐标转实际坐标的一种转换方案
  • MySQL中记录(Documents)的基本操作——添加记录和查找记录
  • 树莓派+攀腾PMSA003-PM2.5传感器监测空气质量【含源码+接线图】
  • Navicat 17 新特性 | 原生支持 Linux ARM 平台以及银河麒麟和统信操作系统
  • 应变与几何方程——弹性力学
  • 【Leetcode】101. 对称二叉树
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • GitUp, 你不可错过的秀外慧中的git工具
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Logstash 参考指南(目录)
  • maya建模与骨骼动画快速实现人工鱼
  • php中curl和soap方式请求服务超时问题
  • Python socket服务器端、客户端传送信息
  • Redis 懒删除(lazy free)简史
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 闭包--闭包作用之保存(一)
  • 我的zsh配置, 2019最新方案
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • nb
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #QT 笔记一
  • (4)事件处理——(7)简单事件(Simple events)
  • (a /b)*c的值
  • (C++20) consteval立即函数
  • (HAL库版)freeRTOS移植STMF103
  • (ibm)Java 语言的 XPath API
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (南京观海微电子)——I3C协议介绍
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (十)T检验-第一部分
  • ***利用Ms05002溢出找“肉鸡
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .chm格式文件如何阅读
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 指南:抽象化实现的基类