天津做宠物饲料的网站,个人名义做网站能备案吗,重庆网站备案,做羞羞的事情网站Scikit-Learn 支持向量机分类 1、支持向量机#xff08;SVM#xff09;1.1、SVM概述1.2、SVM原理1.3、SVM的损失函数1.4、支持向量机分类的优缺点 2、Scikit-Learn支持向量机分类2.1、Scikit-Learn支持向量机分类API2.2、支持向量机分类初体验#xff08;手写数字识别#… Scikit-Learn 支持向量机分类 1、支持向量机SVM1.1、SVM概述1.2、SVM原理1.3、SVM的损失函数1.4、支持向量机分类的优缺点 2、Scikit-Learn支持向量机分类2.1、Scikit-Learn支持向量机分类API2.2、支持向量机分类初体验手写数字识别2.3、支持向量机分类案例 1、支持向量机SVM
1.1、SVM概述 在机器学习中支持向量机Support Vector MachineSVM算法既可以用于回归问题SVR也可以用于分类问题SVC
支持向量机是一种经典的监督学习算法通常用于分类问题。SVM在机器学习知识结构中的位置如下
SVM的核心思想是将分类问题转化为寻找分类平面的问题并通过最大化分类边界点支持向量到分类平面的距离间隔来实现分类 如图所示左图展示了三种可能的线性分类器的决策边界虚线所代表的模型表现非常糟糕甚至都无法正确实现分类其余两个模型在训练集上表现堪称完美但是它们的决策边界与实例过于接近导致在面对新样本时表现可能不会太好
右图中的实线代表SVM分类器的决策边界两虚线表示最大间隔超平面虚线之间的距离两个异类支持向量到超平面的距离之和称为超平面最大间隔简称间隔SVM的决策边界不仅分离了两个类别而且尽可能的远离了最近的训练实例距离决策边界最近的实例称为支持向量
1.2、SVM原理 SVM的最优化问题就是要找到各类样本点到超平面的距离最远也就是找到最大间隔超平面。任意超平面的方程为 ω T x b 0 \omega^Txb0 ωTxb0
其中 ω \omega ω为超平面的法向量决定了超平面的方向 b b b为位移项决定了超平面到原点间的距离
二维空间点 ( x , y ) (x,y) (x,y)到直线 A x B y C 0 AxByC0 AxByC0的距离公式为 d ∣ A x B y C ∣ A 2 B 2 d\frac{|AxByC|}{\sqrt{A^2B^2}} dA2B2 ∣AxByC∣
扩展到N维空间中点 ( x 1 , x 2 , . . . x n ) (x_1,x_2,...x_n) (x1,x2,...xn)到直线 ω T x b 0 \omega^Txb0 ωTxb0的距离为 d ∣ ω T x b ∣ ∣ ∣ ω ∣ ∣ d\frac{|\omega^Txb|}{||\omega||} d∣∣ω∣∣∣ωTxb∣
其中 ∣ ∣ ω ∣ ∣ ||\omega|| ∣∣ω∣∣ ω 1 2 ω 2 2 . . . ω n 2 \sqrt{\omega_1^2\omega_2^2...\omega_n^2} ω12ω22...ωn2 SVM假设样本是线性可分的则任意样本点到超平面的距离可写为 d ∣ ω T x b ∣ ∣ ∣ ω ∣ ∣ d\frac{|\omega^Txb|}{||\omega||} d∣∣ω∣∣∣ωTxb∣ 为方便描述和计算设 y i ∈ − 1 , 1 y_i\in{-1,1} yi∈−1,1其中1表示正例-1表示负例则有 { ω T x i b ≥ 1 y i 1 ω T x i b ≤ − 1 y i − 1 \begin{cases} \omega^Tx_i b ≥ 1 \, \, y_i1 \\ \omega^T x_ib ≤ -1 \, \, y_i-1 \end{cases} {ωTxib≥1ωTxib≤−1yi1yi−1
此时两个异类支持向量到超平面的距离之和为 γ i y i ( ω T ∣ ∣ ω ∣ ∣ ⋅ x i b ∣ ∣ ω ∣ ∣ ) 2 ∣ ∣ ω ∣ ∣ \gamma_iy_i\left(\frac{\omega^T}{||\omega||}\cdot x_i \frac{b}{||\omega||} \right) \frac{2}{||\omega||} γiyi(∣∣ω∣∣ωT⋅xi∣∣ω∣∣b)∣∣ω∣∣2
其中 γ \gamma γ称为间隔。最大间隔不仅与 ω \omega ω有关偏置 b b b也会隐性影响超平面的位置进而对间隔产生影响
现在我们只需要使间隔 γ \gamma γ最大即 arg max ω , b 2 ∣ ∣ ω ∣ ∣ \arg \mathop{\max}\limits_{\omega,b} \frac{2}{||\omega||} argω,bmax∣∣ω∣∣2
最大化间隔 γ \gamma γ显然只需要最小化 ∣ ∣ ω ∣ ∣ ||\omega|| ∣∣ω∣∣于是上式可重写为 arg min ω , b 1 2 ∣ ∣ ω ∣ ∣ 2 \arg \mathop{\min}\limits_{\omega,b} \frac{1}{2}||\omega||^2 argω,bmin21∣∣ω∣∣2
这里的平方和之前一样一是为了方便计算二是可以将目标函数转化为凸函数的凸优化问题。称该式为SVM的基本型
1.3、SVM的损失函数 1.3.1、软间隔与硬间隔
如果我们严格让所有实例都不在最大间隔之间并且位于正确的一边这就是硬间隔分类。但是硬间隔分类有两个问题首先它只在数据是线性可分时才有效其次它对异常值较敏感
要避免这些问题可以使用更灵活的模型。目标是尽可能在保持最大间隔的同时允许间隔违例在最大间隔之间甚至位于错误的一边在最大间隔与违例之间找到良好的平衡这就是软间隔分类 软间隔的目标函数为 J 1 2 ∣ ∣ ω ∣ ∣ 2 C ∑ i 1 n ε i J\frac{1}{2}||\omega||^2 C\sum_{i1}^{n}\varepsilon_i J21∣∣ω∣∣2Ci1∑nεi 其中超参数 C C C为惩罚系数 ε \varepsilon ε为松弛因子。 C C C越小惩罚越小间隔越宽违例越多
1.3.2、核函数
对于非线性数据集线性支持向量机无法处理。我们希望将非线性问题转化为线性可分问题来求解。这时需要引入一个新的概念核函数
核函数可以将样本从原始空间映射到一个高维空间使得样本在新的空间中线性可分
详细介绍可参考这篇文章https://blog.csdn.net/mengjizhiyou/article/details/103437423
核函数将原始空间中的向量作为输入向量并返回转换后的特征空间中向量的内积。通过核方法可以学习非线性支持向量机等价于在高维特征空间中学习线性支持向量机
所以在非线性SVM中核函数的选择就是影响SVM最大的变量。常用核函数有线性核、多项式核、高斯核、拉普拉斯核和Sigmoid核等 1.4、支持向量机分类的优缺点 优点
可适用于处理高维空间数据对于数据维度远高于样本数据量的情况也有效在决策函数中使用少部分训练数据(支持向量)进行决策内存占用小效率高通过支持向量选取最优决策边界对噪声和异常值的敏感度较低稳定性较好更加通用可处理非线性分类任务提供了多种通用核函数也支持自定义核函数
缺点
解释性差不像K-Means、决策树那样直观不易于理解可解释性差对参数和核函数敏感性能高度依赖于惩罚参数C和核函数的选择。如果参数选择不当容易导致过拟合或欠拟合非线性分类训练时间长核函数涉及到二次规划问题需要使用复杂的优化算法当支持向量的数量较大时计算复杂度较高
2、Scikit-Learn支持向量机分类
2.1、Scikit-Learn支持向量机分类API Scikit-Learn支持向量机分类的API如下
class sklearn.svm.SVC(*, C1.0, kernelrbf, degree3, gammascale, coef00.0, shrinkingTrue, probabilityFalse, tol0.001, cache_size200, class_weightNone, verboseFalse, max_iter-1, decision_function_shapeovr, break_tiesFalse, random_stateNone)官方对该API的描述为
SVC的实现基于libsvm。SVC的拟合时间与样本数量成二次方关系适用于样本数量较小的情况。如果样本数量过大超过1W建议使用其他模型例如LinearSVC或SGDClassifier。多类支持是根据One Vs One方案处理的
官方文档https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
中文官方文档https://scikit-learn.org.cn/view/781.html
关于API参数、属性和方法详见官方文档
2.2、支持向量机分类初体验手写数字识别 下面使用Scikit-Learn内置的手写数字数据集演示了支持向量机分类算法在图像识别上的应用
手写数字数据集由1797个8x8像素的数字图像组成。数据集的每个图像存储为8x8灰度值的二维数组数据集的属性存储每个图像代表的数字这包含在图像的标题中
数据集的前4张图像可视化如下
import matplotlib.pyplot as plt
from sklearn import datasets# 加载手写数字数据集
data datasets.load_digits()_, axes plt.subplots(nrows1, ncols4, figsize(10, 3))
for ax, image, label in zip(axes, data.images, data.target):ax.set_axis_off()image image.reshape(8, 8)ax.imshow(image, cmapplt.cm.gray_r, interpolationnearest)ax.set_title(fLabel: {label})plt.show()# 手写数字图像存储为一个8x8的二维数组
print(data.images[0])[[ 0. 0. 5. 13. 9. 1. 0. 0.][ 0. 0. 13. 15. 10. 15. 5. 0.][ 0. 3. 15. 2. 0. 11. 8. 0.][ 0. 4. 12. 0. 0. 8. 8. 0.][ 0. 5. 8. 0. 0. 9. 8. 0.][ 0. 4. 11. 0. 1. 12. 7. 0.][ 0. 2. 14. 5. 10. 12. 0. 0.][ 0. 0. 6. 13. 10. 0. 0. 0.]]为了对这些数据应用分类器我们需要将图像展平将每个图像的灰度值从8x8的二维数组转换为64x1的一维数组
然后我们将数据划分成训练和测试子集并在训练样本上拟合支持向量分类器。随后再使用拟合的分类器来预测测试集中样本的数字值
from sklearn.model_selection import train_test_splitn_samples len(data.images)
X data.images.reshape((n_samples, -1))
y data.target# 划分训练集80%和测试集20%
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state0)from sklearn.svm import SVC# SVM分类器
clf SVC()# 训练模型
clf.fit(X_train, y_train)# 在测试集上预测
y_pred clf.predict(X_test)# 平均准确度评分
print(clf.score(X_test, y_test)) # 0.9916666666666667由模型评分结果可知数字图像的识别准确率在测试集中表现的很好
2.3、支持向量机分类案例 预留未完待续… 参考文章 https://blog.csdn.net/qs17809259715/article/details/97761963 https://blog.csdn.net/Claire_chen_jia/article/details/110916001 https://blog.csdn.net/qq_53123067/article/details/136060974 https://zhuanlan.zhihu.com/p/77750026 https://www.zhihu.com/tardis/zm/art/31886934?source_id1005