赞
踩
我们首先用一个经典的二分类问题作为SVM的切入点,图(b)和图(c)是对图(a)中数据的两种不同的分法。从人的第一感觉,图(b)把两类数据分的开些。
这是一个二维数据的图像,黑色点代表正例,标签y=1,白色点代表负例,标签y=-1(这里为什么不用y=0后面解释)。可以看到图中有两条虚线和一条实线,如何用数学的方法解释将数据分的开一些呢?
样本空间中,实线公式:
w * x+b=0 将其记为(w,b),对于高维空间同样适用,就变成了超平面。
点x到超平面的距离公式为:
于是有:
两个式子合并为:
两类数据到分隔实线的距离关系,即为:
于是将两类数据分隔开的距离表达式为2/||w||.
SVM要做的就是使得分隔开的距离最大化,因此得出优化方程:
正是由于将负例标签y设为-1,所以就可以将边界条件整合成一个式子了。
为了数学的运算方便,将其转化为下面的形式,于是得出了最终的优化方程:
我们一般会把求最大值转化为求最小值来处理,要做优化一般都要求导,所以转化为这样的凸优化形式方便求导后的简便。
本科学过关于拉格朗日乘子法求最值问题,当时的边界条件是等式。该方法的基本思路是将边界条件带入方程,这必然要引入新的参数,于是将所得参数求偏导令为0,即可求出最优解。 这里的边界条件是不等式,所以稍难些,将不等式边界条件转化为一重(chong)最值即可。
利用拉格朗日乘数法构建函数:
其中
所以得出:
这里有点不好理解,由于构建的函数L(w,b,
于是我们要优化的问题就转化为了:
首先要说明一个问题:
该不等式左边是先求最大值再求最小值,右边是先求最小值再求最大值。这就相当于在一群胖子里面找个最瘦的和在一群瘦子里面找个最胖的,答案可想而知。那么什么情况下上式中等号成立呢?当满足KKT条件时等号成立,这里暂且略过。
于是我们的问题转化为了:
对于优化问题,我们总是倾向于先求最小值。
这里可知,只要求出了
于是问题转化成了:
针对上面的优化问题,可以利用转化为求-L的最小值问题,对
回顾整个过程,我们先是由简单的二分类问题引入数学模型即优化函数:
我们的目的是求出w和b就能确定我们要求的分割线(超平面),针对该优化函数利用拉格朗日乘数法求出中间参数
说明:
1.支持向量:对于我们的下面目标函数,要求第二项为0,而满足该条件的数据点也就是一开始图中虚线上的点,这些点就叫作支持向量。
1)从图像上看离超平面最近,影响了超平面的划分。
2)从优化角度上看,这些点满足最大值的优化条件,进而影响了后续的优化进程。
3)从计算数值上看,
w的值也是由这些支持向量所决定的,而那些非支持向量并不能决定w的值。
4)先是所有的点共同决定哪些是支持向量,哪些是非支持向量。一旦确定好之后,非支持向量就没有用了。
2.从预测角度上看,对于要分类的数据点x,只需要计算该函数就行了。
编辑工具:jupyter notebook
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns
sns.set()
%matplotlib inline
from sklearn.datasets.samples_generator import make_blobs #blobs:斑点
#50个数据点,2堆,随机种子,簇的离散程度
X,y=make_blobs(n_samples=50,centers=2,random_state=0,cluster_std=0.7)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='autumn')
#创建了2堆二维数据X,y是其对应标签。
from sklearn.svm import SVC # "Support vector classifier"
model1=SVC(kernel='linear')
model1.fit(X,y)
#构建SVC模型,进行训练
model1.predict([[0,0],[3,0],[2,5],[3,4]])
#预测,这里用的是sklearn中封装好的SVC,所以这里类别用0和1表示,与前面理论推导的类别-1和1不同
array([1, 1, 0, 0])
print(model1.support_vectors_) #显示所有的支持向量
print(model1.n_support_) #获得每个类别的支持向量的个数
[[0.35482006 2.9172298 ]
[2.56509832 3.28573136]
[2.06261754 2.14777301]
[3.09704406 2.22478608]]
[2 2]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。