支持向量机SVM(Support Vector Machines)
红色的线是最好的划分,但是为什么不是蓝色是红色呢?
SVM就设置了一个算法,
设置一个划分线,分别像两边平移,直至相切,
两条线之间的距离就是边际margin,找到最大边际,就是效果最好的划分线。
向量内积:
两个向量之间的夹角小于90°,则向量内积大于0,若大于90°,则小于0。
svm分类:
一些推导:
无论是什么样的式子,都可以把它变成1,-1的那个式子,所以我们把它作为那两条虚线的基本标准式。
那两条虚线叫做支持向量。
SVM一些简单小说明:
from sklearn import svm
#直接调用svm的包就好,它内部非常复杂
x = [[3,3],[4,3],[1,1]]
y = [1,1,-1]
model = svm.SVC(kernel='linear')
model.fit(x,y)
#打印支持向量
print(model.support_vectors_)
#第2和第0个点是支持向量(在这两条虚线上的点)上下各有一个
print(model.support_)
model.predict([[4,3]])#预测新数据属于哪个分类
print(model.coef_)#超平面属性
print(model.intercept_)#超平面截距
svm算法推导 ——继续推导:
转化为凸优化问题:
凸优化问题首先分为三类:
无约束问题:直接求导,倒数等于0,即可求解。
广式拉格朗日乘子法:
为了求L的最小值,则这个点的偏导数为0。
Karush-Kuhn-Tucker最优化条(KTT条件)
进一步优化为对偶问题:
代价函数尽量小。所以L要尽量小,所以对于只看α的时候,求式子的最大值,因为后面部分一定是大于0的
接下来只看w,b时,求式子的最小值。(这里不是很懂,到底是求α的最大值还是整个式子的最大值)
稍微算一下就知道它是怎么消除的了。
SMO算法:
松弛函数与惩罚函数
线性不可分的情况:
之前的SVM算法推导是建立在线性可分的情况下的,
但是其实许多情况是线性不可分的,之前的推导就不成立了,
所以我们做了改进,引入了松弛变量和惩罚函数。
为了使分错的点越少,那么红色的线往蓝色的线移动,蓝色的线往红色这边移动。
但这个函数并没有体现这一点,所以我们要加上一个惩罚函数。
线性不可分情形下的对偶问题:
就多了一个限制条件,
举个栗子:
式子中的y指的是分类标签,上面的垂直方向轴名称为x2.
α1y1+α2y2+α3y3=0,y1,y2=1,y3=-1.这是算法的约束条件,所以得到了目标函数。
当再偏导数为0的点取得的极值不是最小值时,那么最小值就应该时再边界上。
因为最小值对于连续函数只能是再极值点或者边界点。
SVM低维映射
非线性的情况:
这个需要画一个圆才能把两个样本分开来。
如何解决这些非线性问题?
下面这张图,再这个而为空间中,就可以画一条红线把两个类区分开来。
下面的两个圆圈,我们也没有办法找到一条直线把他们区分开来,所以我们把它转为三维空间。
三维空间就可以找到一个平面把两个类别分开。
同上:
二维投影视频:https://v.qq.com/x/page/k05170ntgzc.html
先将二维投影到三维,找到一个平面分割两个类别。
然后将平面与投影区域相切的曲线投影到二维空间,这个分类就完成了。
投影到高维空间:
import matplotlib.pyplot as plt
from sklearn import datasets
from mpl_toolkits.mplot3d import Axes3D
x_data,y_data = datasets.make_circles(n_samples=500,factor=.3,noise=.10)
plt.scatter(x_data[:,0],x_data[:,1],c=y_data)
z_data = x_data[:,0]**2+x_data[:,1]**2
ax = plt.figure().add_subplot(111,projection = '3d')
ax.scatter(x_data[:,0],x_data[:,1],z_data,c=y_data,s=10)#点为红色三角形
plt.show()
映射举例:
这样就会出现问题:
要如何解决这些问题呢?我们就引入了核函数。
核函数举例:
核函数那里是对x,y求内积,并非对f(x),f(y)求内积。
SVM优点: