赞
踩
目录
1.引言
如图0所示,对于数据点,H1根本就分不开两类数据,于是它不是一个很好的决策边界;H2能将两类分开,但是它和两类数据之间的距离太小了,对于看不见的点或者验证数据集,他就不一定能很好地分隔两类了,这就有可能造成数据的过拟合,即在训练集上表现良好,但是在验证集和测试集上表现欠佳;而对于H3,它既能将两类很好的分隔开来,而且还保持了两个类的最极端点之间的最宽距离。他是最佳的决策边界。支持向量机(SVM)就是为了寻找这样的决策边界。
图0:几种边界示意图
2.什么是支持向量
支持向量机(SVM)本质上是尝试拟合两个类别之间最宽的间距,使得图1中的两条虚线之间的距离最大,那么分布在虚线上的点就叫支持向量。也可以说,支持向量决定了虚线的位置,非支持向量,即图1中不在虚线上的点不会影响决策边界的位置。
图1:支持向量
1.容易被异常值影响
如图2所示,红色的点是一个极端异常点,但是硬边界(非要将每一个数据点都正确分类)把它作为了支持向量。因为硬边界寻找的是支持向量之间的最大距离,这会导致决策边界非常不合理,引起过拟合。
图2:异常值
2.只对线性可分的数据有效
如图3所示,线性分类器不可能将图3很好地分隔开来。
图3:线性不可分
1.软边界【就是允许一定量的样本分类错误】用于处理异常值
为了平衡两个目标:
1、最大化决策边界和支持向量之间的距离;
2、最大化决策边界正确分类的点数。
可以设置软边界,即控制sklearn中超参数C的大小,如图4所示:
如图4所示,C越小,距离越大,分错的点越多(欠拟合);C越大,距离越小,分错的点越少(过拟合);
图4 支持向量机示意图
2.核函数的作用(处理非线性可分数据)
2.1 为什么需要核函数?
虽然线性svm在大多数时候很有效,但是却很难找到一个数据集是线性可分的。为了解决这个问题,我们就要将线性不可分的数据,通过添加多项式特征等方法,将特征从低纬度映射到高纬度如图5,图6所示。在特征从图5低纬度被映射到图6 的高纬度之后(经过20次幂的转化),我们就可以找到一个超平面来将数据有效地分割开来。
图5:低维线性不可分的情况
图6:高维线性可分
2.2 核函数是如何做的?
然而对于由于多项式变换所需要的计算复杂度和时间成本都太高,这在大型数据集上会使得模型训练速度过慢。这时候,就到了支持向量机的核函数展示它的内核技术之美了。
核函数可以将非线性可分数据点的特征从相对较低的维度映射到相对较高的维度,并计算他们之间的关系。但是在这个过程中,核函数只是将特征进行了映射,并没有作实际地转换或者添加任何的特征,但我们仍然可以获得相同的结果。计算数据点之间的高维关系而不实际创建或转换它们被称为内核技巧。简而言之,核函数通过避免将特征从低维转换为高维的数学运算来降低 SVM 的计算复杂度。
2.3 常见的核函数
(1)多项式核
多项式核计算数据点之间的高维关系,并且在不添加任何特征的前提下将数据映射到更高的维度。多项式的公式为:
这里的d是一个超参数,指的是函数应该使用的多项式的次数。
举个例子,图7的数据是低维的线性不可分的,但是我们使用多项式核的SVM转化后,我们就得到了如图8所示的高维线性可分的映射。再说一遍,多项式内核只是把数据从低维映射到高维,并计算高维之间的关系,并不转化或者新增特征。另外,多项式次数越高,拟合能力越强,如果感觉模型过拟合了,可以适当减小多项式的次数。
图7:低维线性不可分数据
图8:映射后的高维线性可分数据
(2)高斯核
高斯核也是拔高特征的维度,将低纬度的特征映射到高纬度,只不过映射方式使用的是高斯函数。高斯函数的公式如下:
其中,x表示样本点,x'表示地标。地标本质上是也是样本中的点,我们用来计算和其他样本点之间的相似性。如图9所示,是一个1维的图,图中有两个地标(红色的点),对于样本x=-1,它距离第一个地标1个距离,距离第二个地标 2个距离。
图9:1维图
因此,将图9根据高斯公式被映射过后的特征如图10所示。我们可以很轻松的使用图中红线将样本点分为两类(蓝色和绿色)。
图10:被映射过后的图
导入必要的库
定义传统模型的分类结果
定义绘制决策边界的函数
调用函数进行绘图
1.导入相关库函数
- from sklearn.svm import SVC
- from sklearn import datasets
- import numpy as np
- import matplotlib.pyplot as plt
2.这里选用鸢尾花数据集作为实验数据集。为便于查看分类效果,选用数据集中的两个特征(这样画图时就是一个二维平面,直观上看起来更易于理解)
- iris = datasets.load_iris()
- X = iris['data'][:,(2,3)]
- y = iris['target']
3.设置数据的特征和标签
- setosa_or_versicolor = (y==0) | (y==1)
- X = X[setosa_or_versicolor]
- y = y[setosa_or_versicolor]
4.先做一个线性支持向量机模型(不对原数据集做任何特征变换)。C 值是用于控制过拟合的,由于这里的数据集比较简单,故此不考虑这个参数,因此将其设置为无穷大
svm_clf = SVC(kernel='linear',C=float('inf'))
5. 训练模型
svm_clf.fit(X,y)
6.画图展示,这里设置三条线,作为传统模型的分类结果(以作对比)
- x0 = np.linspace(0,5.5,200)
- pred_1 = 5*x0 - 20
- pred_2 = x0 - 1.8
- pred_3 = 0.1*x0 + 0.5
7.定义一个绘制决策边界的函数,通过分类器获取权重参数,通过分类器获取偏置参数,获取待绘制边界(在 x0 上)的两个端点值,计算划分超平面的方程: w0x0+x1x1+b=0,计算“间隔”
- def plot_svc_decision_boundary(svm_clf,xmin,xmax,sv = True):
-
- w = svm_clf.coef_[0]
-
- b = svm_clf.intercept_[0]
-
- x0 = np.linspace(xmin,xmax,200)
-
- # 现在已知 x0 的数据,画图还需要 x1 的值
- x1 = - w[0]/w[1]*x0 - b/w[1]
-
- margin = 1/w[1]
8.基于前面的值可得到两条支持向量分别对应的“间隔”边界线
- gutter_up = x1 + margin
- gutter_down = x1 - margin
9.判断是否展示图中的支持向量,是则获取数据集中的支持向量
- if sv:
- svs = svm_clf.support_vectors_
10.强调支持向量
plt.scatter(svs[:,0],svs[:,1],s=180,facecolors='#FFAAAA')
11.绘制三条线:支持向量所在决策边界×2、划分超平面
- plt.plot(x0, x1,'k-' , linewidth=2)
- plt.plot(x0, gutter_up, 'k--', linewidth=2)
- plt.plot(x0, gutter_down,'k--', linewidth=2)
12.绘图展示
plt.figure(figsize=(14,4))
13.绘制传统分类算法的决策边界
- plt.subplot(121)
- plt.plot(X[:,0][y==1],X[:,1][y==1], 'bs')
- plt.plot(X[:,0][y==0],X[:,1][y==0], 'ys')
- plt.plot(x0, pred_1, 'g--', linewidth=2)
- plt.plot(x0, pred_2, 'm-', linewidth=2)
- plt.plot(x0, pred_3, 'r-', linewidth=2)
- plt.axis([0,5.5,0,2])
14.绘制 SVM 的决策边界
- plt.subplot (122)
- plot_svc_decision_boundary(svm_clf,0,5.5)
- plt.plot(X[:,0][y==1],X[:,1][y==1], 'bs')
- plt.plot(X[:,0][y==0],X[:,1][y==0], 'ys')
- plt.axis([0,5.5,0,2])
运行结果:
1.x0 = np.linspace(0, 5.5, 200)
:使用numpy.linspace
函数生成0到5.5之间的200个等间距的数据点作为x轴的取值,并将其赋值给变量x0
2.plt.plot(x0, pred_1, "g-", linewidth=2, label="pred_1")
:使用matplotlib.pyplot.plot
函数绘制曲线。第一个参数为x轴的取值,第二个参数为y轴的取值,第三个参数为曲线的样式,"g-"
表示绿色实线,第四个参数为曲线的宽度,即linewidth
,为2,最后设置标签为"pred_1"
3.def plot_svc_decision_boundary(svm_clf, xmin, xmax, sv=True):
:定义一个绘制决策边界的函数,其中svm_clf
参数为支持向量机分类器,xmin
和xmax
参数为x轴的范围,sv
参数默认为True
,表示是否绘制支持向量
4.w = svm_clf.coef_[0]
:通过分类器获取权重参数,coef_
属性返回的是一个二维数组,第一维是每个类别的权重,第二维是每个特征的权重,因此需要取第一个元素
5.b = svm_clf.intercept_[0]
:通过分类器获取偏置参数,intercept_
属性返回的是一个数组,每个元素对应一个类别的偏置,因此需要取第一个元素
6.x1 = - w[0] / w[1] * x0 - b / w[1]
:根据划分超平面的方程w0x0 + w1x1 + b = 0
,计算出决策边界在x轴上所对应的y轴取值x1
7.margin = 1 / w[1]
:计算出间隔值,即支持向量到决策边界的距离
8.gutter_up = x1 + margin
和gutter_down = x1 - margin
:基于前面的值可得到两条支持向量分别对应的间隔边界线
9.plt.scatter(svs[:, 0], svs[:, 1], s=180, facecolors='#FFAAAA')
:使用matplotlib.pyplot.scatter
函数绘制散点图。第一个参数为x轴的取值,第二个参数为y轴的取值,s=180
表示散点的大小为180,facecolors='#FFAAAA'
表示散点的颜色为粉红色
10.plt.plot(x0, x1, 'k-', linewidth=2)
、plt.plot(x0, gutter_up, 'k--', linewidth=2)
和plt.plot(x0, gutter_down, 'k--', linewidth=2)
:使用matplotlib.pyplot.plot
函数绘制决策边界和间隔边界线。'k-'
表示黑色实线,'k--'
表示黑色虚线
该实验基于支持向量机(SVM)算法进行了分类任务。SVM是一种常用的监督学习算法,广泛应用于分类和回归问题。
在实验中,首先准备了一个数据集,包含了带有标签的样本数据。然后,使用SVM算法对数据进行训练,并得到了一个分类模型。
通过对训练后的模型进行测试,可以评估其在新样本上的分类性能。可以计算准确率、精确率、召回率等指标来评估模型的性能。
在实验过程中,可能需要调整SVM算法的参数,如正则化参数C、核函数类型等,以获得更好的分类结果。可以使用交叉验证或网格搜索等技术来选择最佳的参数组合。
实验结果显示,SVM算法在该数据集上取得了较好的分类效果。它通过构建最大间隔的划分超平面,能够有效地处理线性可分和线性不可分的数据。同时,SVM还具有对异常值和噪声的鲁棒性。
总的来说,该实验通过使用SVM算法解决了一个分类问题,并验证了SVM算法在该数据集上的有效性和性能优势。这个实验结果可以作为进一步研究和应用SVM算法的基础。
在实验中遇到的问题:
1.支持向量机SVM和逻辑回归LR有什么区别和联系
相同点
序号 | 相同点 | 解释 |
1 | 有监督 | 都需要有标签的数据 |
2 | 线性分类算法 | 1)判断一个算法是分类还是回归算法的唯一标准就是样本label的类型。如果label是离散的,就是分类算法,如果label是连续的,就是回归算法。2)分类决策面都是线性的(不考虑核函数)。 |
3 | 都是判别模型 | 判别模型会生成一个表示P(Y|X)的判别函数(或预测模型)。常见的判别模型有:KNN、SVM、LR,常见的生成模型有:朴素贝叶斯,隐马尔可夫模型。 |
不同点
序号 | 不同点 | LR | SVM |
1 | loss函数不同 | LR基于概率理论中的极大似然估计 | SVM基于几何间隔最大化原理,目标是最大化分类间隔 |
2 | 风险性 | LR则是经验风险最小化 | SVM是结构风险最小化。1)结构风险最小化就是在训练误差和模型复杂度之间寻求平衡,防止过拟合,减小泛化误差。为了达到结构风险最小化的目的,最常用的方法就是添加正则项。2)SVM的loss函数的第一项可看作L2正则项;LR需要加入正则化项。 |
3 | 点数 | LR则考虑所有点 | SVM只考虑分界面附近的少数点 |
4 | 结果 | LR可以产生概率 | SVM不能产生概率 |
5 | 非线性问题 | —— | SVM可采用核函数的机制 |
6 | 计算复杂度 | LR计算简单,适合大数据集,可以在线训练 | SVM计算复杂,但效果比LR好,适合小数据集。 |
7 | 多分类 | 通过one vs rest进行多分类 | 一般不用于多分类 |
2.SVM为什么采用最大间隔?
SVM的目标是找到一个可以将不同类别的样本分开的决策边界,而最大间隔原则是SVM能够取得优秀性能的关键所在。最大间隔是指在所有可能的决策边界中,选择具有最大间隔的边界作为最佳分类器。
最大间隔分类器有助于提高模型的鲁棒性和泛化能力。具有较大间隔的决策边界对训练数据的噪声和异常值具有更好的容忍性,可以减少过拟合的可能性。此外,最大间隔还可以提供更好的分类边界,使得新样本的分类错误率更低。
为了找到最大间隔决策边界,SVM需要解决一个凸优化问题。该问题的目标是最小化决策边界与每个类别最近样本之间的距离,这些样本被称为支持向量。通过最大化间隔,SVM可以更好地处理数据的分布,从而提高分类的准确性和鲁棒性。
3.软间隔支持向量机为什么要加个松弛变量ξ?
我们都知道,硬间隔满足,yi * ( wi * x + b )≥1,这是函数间隔,是几何间隔的||w|| 倍。
由于一些点出现在两条线的间隔内部,函数间隔的约束条件不满足,所以引入松弛变量ξ,使yi * ( wi * x + b ) + ξ ≥1,即:yi * ( wi * x + b ) ≥1 - ξ。对于这些离群点有对应的松弛变量,其他的点是没有松弛变量ξ的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。