单感知机的使用

103 阅读3分钟

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」。

离散单感知机是一个简单的线性函数,用于实现对数据集的二分类。一般对于单感知机,其激活函数会被取为一个符号函数。假设 x 是线性函数的结果, 激活函数则是 x >= 0 ,这样实数域被映射到了 0,1 两类,以用于表明类别。

从几何意义上来看,单感知机相当于是一个超平面,将空间切割成两部分,也就是两类。为了进一步的理解,可以尝试从实例入手。

为了实现二分类,我们需要一个线性可分的数据集,可以选择使用 IRIS 数据集。在 IRIS 数据集中,任意选取两个特征,可以获得一个线性可分数据集。所以这里的单感知机的输入维度为 2 。

接下来我们考虑训练或者说参数调整的过程,由于我们是线性模型,所以只有三个参数 w1 , w2 , b。具体的学习过程是这样的: 当得到的预测值和真实值不一致时,尝试做个调整。

具体的做法是这样:

对于权值向量 ww, 使用公式 w=w+errorxiw = w + error * x_i调整。其中 error 为真实值与预测值之间的差值 yy^y - \hat {y} ,而对于 bb 偏置,则使用 b=b+errorb = b + error。error 意义同上。

如果把偏置 b 看作是权值向量 w 的一部分(假设特征x中多一列与 b 相乘,其值全为1),可以再考虑下训练过程的原理。

按上述方式,需要调整的仅仅只有一个权值向量 w ,而它相当于是直线的斜率(注意这里已经把偏置同样当作斜率考虑了),当预测值小于真实值时,需要让预测值更大,也就是让 w 更大,做法是让它加上 xierrorx_i * error 此时误差一定是大于 0 的。另一种情况同理。

显然,当xi0x_i \ge 0 的情况下,是容易理解的,比较困惑的是当 xi<0x_i < 0 的时候, 直觉上会让人以为值被缩小了。可以这样考虑,当调整之后计算结果与原来相比较有 wxi=wxi+xi2wx_i = wx_i + x_i^2 ,显然是正确的方向调整了。同样的,另一种情况同理。

或者换一种解释的角度的话,从某种意义上来说,这里可以看成是梯度下降法的应用。如果把损失函数看作是方差的一半,那么上述的过程可以看作是将参数向负梯度的方向调整,不过学习率之类的体现。

所以从代码上,可以这样实现:

def train_on_one_sampler(i: int):
    global w, b
    error = target - active(line_function(x))
    w += x[i] * error
    b += error

这是每次使用一个样本进行训练的过程,如果考虑要进行批量的训练,可以先求和,再使用平均值做调整。

还有一个值得注意的部分是何时收敛。实际上感知机有个相当好的特点是当数据集线性可分时,它一定是绝对收敛的。需要的是一个检测的方式,比如说整体误差为 0 。或者不需要调整的测试为样本的大小。

最后总结一下,感知机的好处是绝对收敛,坏处则是它一般依赖数据的线性可分。