在上篇博客中提到,如果想要拟合一些空间中的点,可以用最小二乘法,最小二乘法其实是以样例点和理论值之间的误差最小作为目标。那么换个场景,如果有两类不同的点,而我们不想要拟合这些点,而是想找到一条直线把点区分开来,就像下图一样,那么我们应该怎么做呢?这个是一个最简单的分类问题。
线性可分数据集
先考虑最简单的情况,也就是这两类点是没有交错在一起的,能够用一条直线 $ax_{1}+bx_{2}+c=0$ 把它们区分开(是线性可分的)。所以只要能够确定参数 $a$ 和 $b$ 就行了。我们想让红点和黑点尽量分布在直线两侧,所以其实是想最小化最终分错的点(误分类点)的个数。那么怎么才算是分错呢,现在我们只知道黄点和蓝点应该不在同一侧,但是并不知道具体应该在那一侧(不只是这个图,考虑一般情况)。但是对于直线而言,把直线两侧的点带入直线方程得到的符号是相反的。我们可以根据这个判断某一个点是在直线的大于 0 的一侧还是小于 0 的一侧。 对于直线(或超平面),其实我们为了方便,我们可以给直线加一些不会影响最终结果的限制,让求解的模型少一些选择,只要依旧可以通过调整参数找到最优解就没问题。比如规定直线的大于 0 的一面一定是蓝点,小于 0 的一面一定是黄点。可能有人会问,那找到最优的直线的时候蓝点在小于 0 的一侧怎么办。但是没关系,即使是同一条直线,也可以通过两边同乘以 -1 达到让小于 0 和大于 0 换边的情况,所以这样假设没有关系,在进行参数优化的时候它自己就可以通过调整 a,b 来达到要求。加上这个限制,最终的目标函数就很好写了。首先给蓝、黄点分别标记为 p, q,训练集就是$\left ( x_{1}, x_{2}, y\right )$,y 属于$\left \{ p, q \right \}$了。那么我们就是要最小化 $\sum f(ax_{1}+bx_{2}+c) $ ,其中 f 是一个用来数误分类点的个数的函数,对于分错的点 f 的函数值为 1,反之为 0。这个 f 函数有个名字叫激活函数(里面的信号强就激活一下)。根据限制,可以根据 $(y_{i}-mid) (ax_{1}+bx_{2}+c)$ (其中$mid=\frac{p+q}{2}$)是否大于 0 来判断是否分错。为了方便,就可以去 p, q 为 -1 和 +1,这样这个判断条件就变成 $y_{i} (ax_{1}+bx_{2}+c)$了。我们要最小化的函数就叫损失函数。 接下来就是要对这个损失函数进行调参优化了。可以看出来,这个函数其实是找到当前的所有误分类点,然后通过它们进行调参,所以它是误分类点驱动的。但是即使找到了所有的无误分类点,由于损失函数是离散的,不连续也不可导,很难优化。所以需要找一个近似的,连续可导的函数来替换 f 函数。对于分错的点,我们可以用 $\left | ax_{1}+bx_{2}+c \right |$ 去代替 f 中的 1 ,这里又面临去绝对值的问题了,还是可以通过平方法去绝对值。而对于分对的点,还是 0。这样损失函数就是$\sum(ax_{1}+bx_{2}+c)^{2}$,找到误分类点之后就可以用梯度下降法优化了。但是对于这个问题,还有一个更巧妙的去绝对值的方式,既然我们已经知道 -1 在 $ax_{1}+bx_{2}+c$ 大于 0 的一侧,而 1 在 <0 的一侧,所以:$y_{i} * (ax_{1}+bx_{2}+c)$ 就一定是正的了。所以可以用$y_{i}(ax_{1}+bx_{2}+c)$ 替换 1,损失函数就是$\sum_{1}(ax_{1}+bx_{2}+c)$。以这个为损失函数的整个优化流程就是:
随机给定 w, b
找到当前这条直线 a x 1 + b x 2 + c = 0 ax_{1}+bx_{2}+c=0 a x 1 + b x 2 + c = 0 的情况下,找到所有分错的点(x_no,y_no)
把直线写作矩阵的形式: w x + c = 0 wx+c=0 w x + c = 0 ,其中 w = ( w 1 , w 2 ) w=(w_{1},w_{2}) w = ( w 1 , w 2 ) , x = ( x 1 , x 2 ) T x=(x_{1},x_{2})^ \mathrm{ T } x = ( x 1 , x 2 ) T ,然后通过找到的误分点用梯度下降法进行参数调优。 ∂ L ( w , b ) ∂ w = ∑ i = 1 n y i x i \frac{\partial L(w, b)}{\partial w}=\sum_{i=1}^{n} y_{i}x_{i} ∂ w ∂ L ( w , b ) = ∑ i = 1 n </