【机器学习】支持向量机

624f4fe7839be05e78cbb48f3d03ab2e.png

9ec396836d4c795083ecbbc8554cd653.jpeg

一、支持向量机原理

1.1 线性可分问题

fb120c16afc209394b5210a00ae2eab0.jpeg

1.2 线性可分问题的对偶问题

3a9755c4d3bc500ba7f2b3e125da8f22.jpeg

1.3 线性不可分问题

3e36346c64e8db6b0dd1142ebe4e260e.jpeg

1.4 线性不可分问题的对偶问题

4c85952a331d0869b0e0cb8112b7c1c4.jpeg

40944a95b1384d41be1a6d140b9fc71b.jpeg

1.5 核映射与核函数

853e33087cba63c80fd859c4380d0f05.jpeg

444ee8f1b8c482efccff9aaa4a056429.jpeg

1.6 SMO算法原理

cdf3db15935f95fa434d985a93c4d85f.jpeg

aac580e64209f0339a6ab402151e83cf.jpeg

996e8fb920ac10dace0511b198c6cab9.jpeg

1.7 SMO算法中优化变量的选择

606b9a265f984936dbaf8a8fc35d9650.png

1.8 多分类问题

72015c4ca24c0eb08d577cc6280e5fcc.jpeg

二、示例代码

2.1 使用sklearn 的 SVC 类的SVM对鸢尾花数据集(前两特征)进行分类

代码首先导入了必要的模块,如 numpy, matplotlib.pyplot, sklearn 等。然后导入了了鸢尾花数据集,这是一个包含 150 个样本,4 个特征,3 个类别的数据集。只取了前两个特征,这样可以在二维平面上绘制决策边界。接着定义了一个函数 plot_contours ,用于绘制决策边界。该函数接受两个参数:clf 和 xx, yy 。clf 是 SVM 分类器对象,xx, yy 是网格点数组。该函数使用 matplotlib.pyplot 模块中的 contourf 函数来绘制等高线,并设置颜色映射、透明度等参数。然后在同一个坐标轴上绘制原始数据的散点图,并设置颜色、大小、边缘颜色等参数。最后设置子图的标题、图例和显示绘制的图像。

代码创建了一个线性核函数的 SVM 分类器,并用数据拟合模型。然后创建了一个图形对象,并设置子图的标题和 x 轴和 y 轴的标签。接着生成网格,并用 plot_contours 函数绘制决策边界,并设置颜色映射、透明度等参数。最后显示绘制的图像。

943d476f3489994690876b3e77304936.png

# 导入 sklearn 的 SVC 类,用于创建 SVM 分类器
from sklearn.svm import SVC
# 导入 numpy 模块,用于进行数值计算
import numpy as np
# 导入 matplotlib.pyplot 模块,用于绘图
import matplotlib.pyplot as plt
# 导入 sklearn 的数据集和 SVM 模块
from sklearn import svm, datasets


# 导入鸢尾花数据集,这是一个包含 150 个样本,4 个特征,3 个类别的数据集
iris = datasets.load_iris()
# 只取前两个特征,这样可以在二维平面上绘制,如果使用四维数据集,就需要降维
X = iris.data[:, :2]
# 取出类别标签
y = iris.target


# 定义一个函数,用于生成网格,方便绘制决策边界
def make_meshgrid(x, y, h=.02):
    # 计算 x 和 y 的最小值和最大值,并扩展一点范围
    x_min, x_max = x.min() - 1, x.max() + 1
    y_min, y_max = y.min() - 1, y.max() + 1
    # 生成一个二维网格,步长为 h
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    # 返回网格
    return xx, yy


# 定义一个函数,用于绘制决策边界
def plot_contours(ax, clf, xx, yy, **params):
    # 对网格中的每个点,使用分类器进行预测,得到预测结果
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    # 将预测结果调整为网格的形状
    Z = Z.reshape(xx.shape)
    # 在坐标轴上绘制等高线,使用参数 params
    out = ax.contourf(xx, yy, Z, **params)
    # 返回绘制的对象
    return out


# 创建线性核函数的 SVM 分类器
model = svm.SVC(kernel='linear')
# 用数据拟合模型,得到分类器对象
clf = model.fit(X, y)


# 创建一个图形对象
fig, ax = plt.subplots()
# 设置子图的标题
title = ('线性核函数的 SVM 的决策边界')
# 生成网格,用于绘制决策边界
X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)


plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
# 调用 plot_contours 函数,绘制决策边界,设置颜色映射、透明度等参数
plot_contours(ax, clf, xx, yy, cmap=plt.cm.coolwarm, alpha=0.8)
# 在同一个坐标轴上绘制原始数据的散点图,设置颜色、大小、边缘颜色等参数
ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')
# 设置 y 轴的标签
ax.set_ylabel('y label here')
# 设置 x 轴的标签
ax.set_xlabel('x label here')
# 设置 x 轴的刻度为空
ax.set_xticks(())
# 设置 y 轴的刻度为空
ax.set_yticks(())
# 设置子图的标题
ax.set_title(title)
# 显示图例
ax.legend()
# 显示绘制的图像
plt.show()

2.2 使用sklearn 的 SVC 类的SVM对鸢尾花数据集(前两类别)进行二分类

代码首先导入了 sklearn 的相关模块,然后导入了 numpy 模块,用于进行数值计算。接着导入了 matplotlib.pyplot 模块,用于绘图。然后导入了 sklearn 的数据集和 SVM 模块。

接下来,使用了了鸢尾花数据集,这是一个包含 150 个样本,4 个特征,3 个类别的数据集。只取了前三个特征,这样可以在三维空间中绘制,如果使用四维数据集,就需要降维。然后您只取出类别标签。

接着将数据集转换为二分类问题,只保留类别为 0 或 1 的样本。然后创建了线性核函数的 SVM 分类器,并用数据拟合模型。最后分离平面的方程是由所有满足 np.dot(svc.coef_[0], x) + b = 0 的 x 组成的,并解出 w3 (z) 的值。然后您生成了一个从 -5 到 5 的等差数列,并生成了一个二维网格,用于绘制分离平面。最后创建了一个图形对象,并在图形对象中添加了一个三维坐标轴,并在坐标轴上绘制类别为 0 的样本的三维散点图和类别为 1 的样本的三维散点图,并在坐标轴上绘制分离平面,并设置坐标轴的视角。

32055e31ec4e1ad7d9bdeb51df689935.png

# 导入 sklearn 的 SVC 类,用于创建 SVM 分类器
from sklearn.svm import SVC
# 导入 numpy 模块,用于进行数值计算
import numpy as np
# 导入 matplotlib.pyplot 模块,用于绘图
import matplotlib.pyplot as plt
# 导入 sklearn 的数据集和 SVM 模块
from sklearn import svm, datasets
# 导入 mpl_toolkits.mplot3d 的 Axes3D 类,用于创建三维坐标轴
from mpl_toolkits.mplot3d import Axes3D


# 导入鸢尾花数据集,这是一个包含 150 个样本,4 个特征,3 个类别的数据集
iris = datasets.load_iris()
# 只取前三个特征,这样可以在三维空间中绘制,如果使用四维数据集,就需要降维
X = iris.data[:, :3]
# 取出类别标签
Y = iris.target


# 将数据集转换为二分类问题,只保留类别为 0 或 1 的样本
X = X[np.logical_or(Y==0,Y==1)]
Y = Y[np.logical_or(Y==0,Y==1)]


# 创建线性核函数的 SVM 分类器
model = svm.SVC(kernel='linear')
# 用数据拟合模型,得到分类器对象
clf = model.fit(X, Y)


# 分离平面的方程是由所有满足 np.dot(svc.coef_[0], x) + b = 0 的 x 组成的
# 解出 w3 (z) 的值
z = lambda x,y: (-clf.intercept_[0]-clf.coef_[0][0]*x -clf.coef_[0][1]*y) / clf.coef_[0][2]


# 生成一个从 -5 到 5 的等差数列,包含 30 个元素
tmp = np.linspace(-5,5,30)
# 生成一个二维网格,用于绘制分离平面
x,y = np.meshgrid(tmp,tmp)


# 创建一个图形对象
fig = plt.figure()
# 在图形对象中添加一个三维坐标轴
ax  = fig.add_subplot(111, projection='3d')
# 在坐标轴上绘制类别为 0 的样本的三维散点图,设置颜色为蓝色,形状为圆点
ax.plot3D(X[Y==0,0], X[Y==0,1], X[Y==0,2],'ob')
# 在坐标轴上绘制类别为 1 的样本的三维散点图,设置颜色为红色,形状为方块
ax.plot3D(X[Y==1,0], X[Y==1,1], X[Y==1,2],'sr')
# 在坐标轴上绘制分离平面,使用网格的 x 和 y 值,以及 z 函数的值
ax.plot_surface(x, y, z(x,y))
# 设置坐标轴的视角,分别为仰角和方位角
ax.view_init(30, 60)
# 显示绘制的图像
plt.show()

三、支持向量机在制造行业的应用

d18f145cae5e1a5b549623a4a77bb8a1.png

四、参考网址

https://campus.datacamp.com/courses/machine-learning-with-scikit-learn/classification?ex=1  使用 scikit-learn 进行机器学习

https://scikit-learn.org/stable/auto_examples/semi_supervised/plot_semi_supervised_versus_svm_iris.html

https://scikit-learn.org/stable/auto_examples/svm/plot_iris_svc.html

https://www.pycodemates.com/2022/10/classification-of-iris-dataset-using-SVM-in-python.html

https://people.csail.mit.edu/dsontag/courses/ml14/slides/lecture2.pdf 

https://zhuanlan.zhihu.com/p/39592364

https://zhuanlan.zhihu.com/p/338569478

https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/ libsvm数据集

https://blog.51cto.com/tianxingzhe/1655672

http://staff.ustc.edu.cn/~linlixu/ai2022spring/20.Support%20vector%20machines.pdf 支持向量机线性不可分的问题的原问题 

https://zhuanlan.zhihu.com/p/589250796 核函数及公式

https://zhuanlan.zhihu.com/p/29212107  SMO算法原理

https://zhuanlan.zhihu.com/p/433150785

https://blog.csdn.net/Anchor_Jun/article/details/122504065

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
支持向量机(Support Vector Machine,SVM)是一种常用的机器学习算法,主要用于二分类问题。它通过寻找一个超平面来对样本进行分割,使得不同类别的样本点尽可能地被分开,并且使得超平面与最近的样本点之间的间隔最大化。 SVM的基本思想是将样本点映射到高维空间中,使得在高维空间中的样本点能够更容易地被线性分割。在高维空间中,SVM通过寻找一个最优的超平面来进行分类,这个超平面可以最大化不同类别样本点之间的间隔,从而提高分类的准确性。 SVM的训练过程可以转化为一个凸二次规划问题来求解,通过求解这个问题可以得到最优的超平面参数。在实际应用中,SVM可以使用不同的核函数来进行非线性分类,常用的核函数有线性核、多项式核和高斯核等。 以下是一个使用SVM进行二分类的示例代码: ```python from sklearn import svm from sklearn.datasets import make_blobs import matplotlib.pyplot as plt # 生成样本数据 X, y = make_blobs(n_samples=100, centers=2, random_state=0, cluster_std=0.6) # 创建SVM模型 clf = svm.SVC(kernel='linear') # 训练模型 clf.fit(X, y) # 绘制决策边界 plt.scatter(X[:, 0], X[:, 1], c=y, s=30, 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() ``` 这段代码使用了scikit-learn库中的SVM模块,通过make_blobs函数生成了一个二分类的样本数据,并使用线性核的SVM模型进行训练和预测。最后,通过绘制决策边界和支持向量的方式可视化了分类结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值