一、支持向量机原理
1.1 线性可分问题
1.2 线性可分问题的对偶问题
1.3 线性不可分问题
1.4 线性不可分问题的对偶问题
1.5 核映射与核函数
1.6 SMO算法原理
1.7 SMO算法中优化变量的选择
1.8 多分类问题
二、示例代码
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 函数绘制决策边界,并设置颜色映射、透明度等参数。最后显示绘制的图像。
# 导入 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 的样本的三维散点图,并在坐标轴上绘制分离平面,并设置坐标轴的视角。
# 导入 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()
三、支持向量机在制造行业的应用
四、参考网址
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