目录
分类分析
概念:
通过构造一个分类函数或分类器的方法,能把数据库中的数据项映射到给定类别中的某一个,从而可以用于预测未知数据。
数据:
线性可分
线性不可分
什么是SVM
全名:Support Vector Machine(支持向量机)
支持向量:支持或支撑平面上把两类类别划分开来的超平面的向量点。
机:一个算法
基于统计学习理论的一种机器学习方法。简单的说,就是将数据单元表示在多维空间中,然后对这个空间做划分的算法
SVM特点
SVM是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性之间寻求最佳折衷,以期获得最好的推广能力(或泛化能力)。
决策面方程
二维空间下一条直线的方式如下所示:
现在做个小小的改变,让原来的x轴变成x1,y轴变成x2
进一步向量化,用w列向量和x列向量和标量γ进一步向量化:
其中,向量w和x分别为:
w为直线的法向量,控制着直线的方向
二维空间的直线方程已经推导完成,将其推广到n为空间,就变成了超平面方程。(一个超平面,在二维空间的例子就是一个直线)但是它的公式没变,依然是:
分类间隔方程
点到直线的距离距离公式如下:
公式中的直线方程为Ax0+By0+C=0,点P的坐标为(x0,y0)。现在,将直线方程扩展到多维,求得我们现在的超平面方程,对公式进行如下变形:
这个d就是”分类间隔”。其中||w||表示w的二范数,求所有元素的平方和,然后再开方
对于二维平面:
那么:
求解超平面的问题就变成了求解分类间隔W最大化的为题。W的最大化也就是d最大化的
约束条件
如果超平面方程能够完全正确地对上图的样本点进行分类,就会满足下面的方程:
如果我们要求再高一点,假设决策面正好处于间隔区域的中轴线上,并且相应的支持向量对应的样本点到决策面的距离为d,那么公式进一步写成:
对于所有分类标签为1的样本点,它们到直线的距离都大于等于d(支持向量上的样本点到超平面的距离)。对于所有分类标签为-1的样本点,它们到直线的距离都小于等于d。公式两边都除以d,就可以得到:
可变为:
线性SVM优化
目标函数:
优化目标是是d最大化。用支持向量上的样本点求解d的最大化的问题的。那么支持向量上的样本点有什么特点呢?
所有支持向量上的样本点,都满足如上公式
目标函数进一步化简:
只关心支持向量上的点。求解d的最大化问题变成了||w||的最小化问题。进而||w||的最小化问题等效于
为了在进行最优化的过程中对目标函数求导时比较方便,但这绝对不影响最优化问题最后的求解。将最终的目标函数和约束条件放在一起进行描述:
拉格朗日乘数法
最优化问题有如下几类:
无约束优化问题,可以写为:
费马大定理(Fermat),即使用求取函数f(x)的导数,然后令其为零,可以求得候选最优值,再在这些候选值中验证;如果是凸函数,可以保证是最优解
有等式约束的优化问题,可以写为:
常常使用的方法就是拉格朗日乘子法(Lagrange Multiplier) ,即把等式约束h_i(x)用一个系数与f(x)写为一个式子,称为拉格朗日函数,而系数称为拉格朗日乘子。通过拉格朗日函数对各个变量求导,令其为零,可以求得候选值集合,然后验证求得最优值有
不等式约束的优化问题,可以写为:
常常使用的方法就是KKT条件。同样地,把所有的等式、不等式约束与f(x)写为一个式子,也叫拉格朗日函数,系数也称拉格朗日乘子,通过一些条件,可以求出最优值的必要条件,这个条件称为KKT条件
拉格朗日函数
第一步:将有约束的原始目标函数转换为无约束的新构造的拉格朗日目标函数
公式变形如下:
其中αi是拉格朗日乘子,αi大于等于0,是我们构造新目标函数时引入的系数变量(我们自己设置)。令
当样本点不满足约束条件时,即在可行解区域外:
此时,将αi设置为正无穷,此时θ(w)显然也是正无穷。当样本点满足约束条件时,即在可行解区域内:
此时,显然θ(w)为原目标函数本身。将上述两种情况结合一下,就得到了新的目标函数:
初衷,就是为了建立一个在可行解区域内与原目标函数相同,在可行解区域外函数值趋近于无穷大的新函数
现在,问题变成了求新目标函数的最小值,即:
这里用p*表示这个问题的最优值,且和最初的问题是等价的。
第二步:将不易求解的优化问题转化为易求解的优化
新目标函数,先求最大值,再求最小值。首先就要面对带有需要求解的参数w和b的方程,而αi又是不等式约束,这个求解过程不好做。所以,需要使用拉格朗日函数对偶性,将最小和最大的位置交换一下,这样就变成了:
交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用d*来表示。而且d*<=p*。关心的是d=p的时候,这才是要的解。需要什么条件才能让d=p呢?
首先必须满足这个优化问题是凸优化问题。
其次,需要满足KKT条件。
凸优化问题的定义是:求取最小值的目标函数为凸函数的一类优化问题。目标函数是凸函数,这个优化问题又是求最小值。所以最优化问题就是凸优化问题。
KKT条件
使用拉格朗日函数对的目标函数进行了处理,生成了一个新的目标函数。通过一些条件,可以求出最优值的必要条件,这个条件就是接下来要说的KKT条件。一个最优化模型能够表示成下列标准形式:
KKT条件的全称是Karush-Kuhn-Tucker条件,KKT条件是说最优值条件必须满足以下条件:
条件一:经过拉格朗日函数处理之后的新目标函数L(w,b,α)对α求导为零:
条件二:h(x) = 0;
条件三:α*g(x) = 0;
优化问题:
凸优化问题和KKT都满足了,问题转换成了对偶问题。而求解这个对偶学习问题,可以分为三个步骤:首先要让L(w,b,α)关于w和b最小化,然后求对α的极大,最后利用SMO算法求解对偶问题中的拉格朗日乘子
首先固定α,要让L(w,b,α)关于w和b最小化,分别对w和b偏导数,令其等于0,即:
现在内侧的最小值求解完成,求解外侧的最大值,从上面的式子得到
现在优化问题变成了如上的形式。对于这个问题,有更高效的优化算法,即序列最小优化(SMO)算法。通过这个优化算法能得到α,再根据α,就可以求解出w和b,进而求得最初的目的:找到超平面,即”决策平面”
非线性分类
对于以上所述的SVM,处理能力还是很弱,仅仅能处理线性可分的数据。如果数据线性不可分的时候,我们就将低维的数据映射向更高的维次,以此使数据重新线性可分。这转化的关键便是核函数。
核函数
几个比较常用的核函数如下:
核函数应用广泛的原因:
核函数的引入避免了“维数灾难”,大大减小了计算量。而输入空间的维数n对核函数矩阵无影响,因此,核函数方法可以有效处理高维输入。
无需知道非线性变换函数Φ的形式和参数
核函数的形式和参数的变化会隐式地改变从输入空间到特征空间的映射,进而对特征空间的性质产生影响,最终改变各种核函数方法的性能。
核函数方法可以和不同的算法相结合,形成多种不同的基于核函数技术的方法,且这两部分的设计可以单独进行,并可以为不同的应用选择不同的核函数和算法
线性不可分:
将数据空间映射到高维空间,使原本线性不可分变为线性可分。
引入核函数,简化映射空间中的内积运算。它避开了直接在高维空间中进行计算,而表现形式却等价于高维空间。
不同的样本结构与不同的核函数结合,达到很好的分割效果
sklearn
from sklearn.svm import SVC
import numpy as np
from sklearn.model_selection import train_test_split
# X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
# y = np.array([1, 1, 2, 2])
# model = SVC(gamma=0.1)
# model.fit(X,y)
# print(model.predict([[1.5, 1.5]]))
dataset = np.loadtxt("testSet.txt")
x_train,x_test,y_train,y_test = train_test_split(dataset[:,:-1],dataset[:,-1],test_size=0.3,random_state=1)
model = SVC(C=6,gamma=100)
model.fit(x_train,y_train)
print(y_test==model.predict(x_test))
print(model.score(x_train,y_train))
print(model.score(x_test,y_test))