引言
终于开始了,以前都没学过的支持向量机,听说过它的厉害,却没见识过他到底厉害在哪里。
新的目标函数
由逻辑回归里面的目标函数,来变出新得目标函数:
图中细线为逻辑回归的代价函数,在y=1
和y=0
两种情况下,代价函数和预测值之间的关系。然后我们用粉红色的分段函数来代替原来的连续函数,就有了新的目标函数。
然后我们根据逻辑回归的代价函数,得到新的代价函数:
从图中可以看出,只是把原来的h
函数替换掉了。
然后就是一点因为不同的国际惯例而产生的改动。在支持向量机里面,一般会去除m
这个变量,然后会把λ
放到第一项前面。这样的变换,并没有影响结果,只是因为不同的国际惯例而已。具体如下:
支持向量机中的h
函数也变成了如下形式:
这样的改变看似没什么卵用,却会在后续优化中带来巨大的计算优势,却不影响性能。
支持向量机(Support Vector Machine)
支持向量机有时候也叫大间距分类器。
假设我们把上面的代价函数第一项前面的C
设置成很大的值,那么这个代价函数在优化的时候,就会尽力的让第一项为0。
那么怎么尽力让第一项为0呢?那就是让尽可能多的h
函数的预测值和真实值相吻合,也就是这样:
那么,当所有的都满足的时候,第一项就会为0,代价函数就会变成:
这样会带来一个什么效果呢?以二分类为例:
这个图中,叉和圈如果是线性可分的话,中间可以画出很多条线,例如粉色和绿色,但是支持向量机会画出类似于黑色的这条线,而这条线会有一个尽可能大的离样本点远的特点,也就是和两条蓝色线尽可能远。然后黑色的线和蓝色的线之间的距离就叫做支持向量机的间距。这也就是为什么支持向量机可以叫做大间距分类器。
但是样本不可能总是线性可分的,有时候会有异常点:
如果这个时候,你的C
还是很大,那么支持向量机就会从黑色的线变为粉色的线,如果C
不是那么大的话,就可以回归到黑色的线。
核函数(Kernels)
概念
在往常,对于下图左边的非线性分类问题:
总可以用右边多项式的形式来写。在支持向量机里面,我们把这些特征变成一个类似于函数的标志:
更换了之后,我们就开始思考一个问题:有没有更好的特征选择?比方说用更高阶的项,更复杂的组合等等,这会让你陷入到宇宙起源的思考之中。
这样就干脆重新定义几个新的特征。先在这个平面上选三个点(先不追究怎么选,为什么):
并定义三个新的特征变量为这三个点的一个函数:
这个similarity
函数就叫做核函数。
核函数的作用
从这个核函数的表达式可以看得出来,如果一个点和我们定义的某一个点越近,那么它这一项的值就越接近1,越远就越接近0。
用图来表示其中一个点与其他样本点产生的值的关系,大概就是这样的:
假设我们有一个已经训练好的模型和三个选好的点:
那么粉色的点就可以根据已知的模型参量,得到结果y=1
,相应的天蓝色的点就是y=0
。最后发现,我们得到了这样一个类似于这样的边界:
支持向量机和核函数
有了上面这些铺垫,就有了支持向量机的另一个形态,目标函数变成如下形式:
其实也就是把里面的x
换成了f
。然后最后的θ^2
变成了如下形式:
这个Mθ
表示的是某一个核函数对应的θ
,其实只是为了更好地节省计算量而设计的,最终的结果和原来的结果相差无几。
如何选择SVM中的参数
又到了一年一度选参数的问题了。有一首歌叫都选C来着?那就从参数C开始吧。
大的C会导致高偏差,低方差。小的C就是低偏差高方差。
接下来登场的是:
这个emmmm,打不出来,原谅我,反正大的这个就会产生高偏差,低方差,并且特征值会很平滑。小的这个就是低偏差,高方差,然后函数就不那么平滑。
逻辑回归VS支持向量机
当你左手一个逻辑回归,右手一个支持向量机,duang,你不知道该用哪一个了。所以到底什么情况下更适合哪个算法呢?
- 如果特征数相对数据集的数量来说,比较大:用逻辑回归或者没有核函数的支持向量机。
- 如果特征数比较少,而训练集数量适中:用带有核函数的支持向量机。
- 如果特征数比较少,而训练集特别大(一百万个数据):用逻辑回归或者没有核函数的支持向量机。
为什么数据特别大的时候反而不用带核函数的支持向量机呢?因为核函数的运行还是没有辣么快,数据集一大,整个运行的速度就慢了。
在一个拥有好的设计的神经网络面前,这些模型的效果都是渣渣。但缺点也很明显,就是训练起来很慢。
后记
终于了解了支持向量机,发现还是挺有意思的,还有三周,加油加油~~~