【机器学习】支持向量机

【机器学习】支持向量机_第1张图片

【机器学习】支持向量机_第2张图片

一、支持向量机原理

1.1 线性可分问题

【机器学习】支持向量机_第3张图片

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

【机器学习】支持向量机_第4张图片

1.3 线性不可分问题

【机器学习】支持向量机_第5张图片

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

【机器学习】支持向量机_第6张图片

【机器学习】支持向量机_第7张图片

1.5 核映射与核函数

【机器学习】支持向量机_第8张图片

【机器学习】支持向量机_第9张图片

1.6 SMO算法原理

【机器学习】支持向量机_第10张图片

【机器学习】支持向量机_第11张图片

【机器学习】支持向量机_第12张图片

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

【机器学习】支持向量机_第13张图片

1.8 多分类问题

【机器学习】支持向量机_第14张图片

二、示例代码

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 函数绘制决策边界,并设置颜色映射、透明度等参数。最后显示绘制的图像。

【机器学习】支持向量机_第15张图片

# 导入 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 的样本的三维散点图,并在坐标轴上绘制分离平面,并设置坐标轴的视角。

【机器学习】支持向量机_第16张图片

# 导入 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()

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

【机器学习】支持向量机_第17张图片

四、参考网址

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

你可能感兴趣的:(机器学习,支持向量机,人工智能,算法,数据挖掘)