Introduce
感知机模型(Perceptron)是一个最简单的有监督的二分类线性模型。他可以从两个方面进行介绍
方面一 问题分析
问题(一维):儿童免票乘车问题(孩子身高低于1.2m可以免票上车)
这转换成数学表达式就是 $x:$身高,$y:\{-1:$免票 ,$1:$购票$\}$
$$ y=\left\{\begin{matrix}+1,x\ge1.2m \\ -1,x\lt1.2m\end{matrix}\right. $$
如果把$y$用函数$f(x;b)$表达出来就如下所示
$$ y=f(x;b)=\left\{\begin{matrix}+1,z=x+b\ge0 \\ -1,z=x+b \lt0 \end{matrix}\right. $$
用机器学习的话来说变量$x$就是一个特征,$y$就是一个标记,$b$就是一个偏置
问题(二维):西瓜分类(依靠西瓜的颜色和敲击的响声分类)
这里的$x$就从一个一维特征编程了二维的特称向量$\{x_1:$颜色 ,$x_2:$响声$\}$ $y$仍然是一个标记 $y:\{-1:$坏瓜 ,$1:$好瓜$\}$ 数据如图所示:
用一般的数学方法,我们希望将两个变量$x_1,x_2$映射到一个维度上去 就会出现如下三种经典的情况
映射到水平方向
映射到竖直方向
映射到任意方向
二维向量映射到一维空间需要有映射的方向。此时就需要一定的方向向量$\mathbb{w}=(w_1 \ w_2)^T$ 此时,如果把$y$用函数$f(\mathbb{x};\mathbb{w},b)$来表示
$$ y=f(\mathbb{x};\mathbb{w},b)=\left\{\begin{matrix}+1,\mathbb{w}^T\mathbb{x}+b\ge0 \\ -1,\mathbb{w}^T\mathbb{x}+b\lt0 \end{matrix}\right. $$
综上所述,可以类推到n维。只要将$\mathbb{x},\mathbb{w}升维就可以了$
方面二 模型发展
1943年,McCulloch和Pits结合神经元模型Neuron提出来经典的抽象的M-P神经元模型
神经元的生物学结构
M-P神经元模型
而感知机模型是从神经元模型发展过来的。感知机是由两层神经元组成的一个简单模型。只有输出层是M-P 神经元,即只有输出层神经元进行激活函数处理,也称为功能神经元( functional neuron);输入层只是接受外界信号(样本属性)并传递给输出层(输入层的神经元个数等于样本的属性数目),而没有激活函数。示意图如下:
Definition
假设输入空间(特征空间)是$\mathcal{X} \subset \mathbb{R}^n$,输出空间是$\mathcal{Y}=\{-1,+1\}$。输入$x\in \mathcal{X}$表示实例的特征向量,对应于输入空间(特征空间)的点;输出$y\in \mathcal{Y}$表示类别。由输入空间到输出空间的如下函数: $$ f(x)=sign(w \cdot x+b) $$ 成为感知机。其中,$w,b$成为感知机模型的参数,$w \in \mathbb{R}^n$叫做权值(weight)或权值向量(weight vector),$b \in \mathbb{R}$叫做偏置(bias),$w \cdot x$表示两者的内积。$sign$是符号函数,即 $$ sign(a)=\left\{\begin{matrix}+1,a\ge0\\-1,a\lt0\end{matrix}\right. $$ 感知机是一种线性分类器,属于判别模型。感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classification model)或线性分类器(linear classifier),即函数模型$\{f\,|\,f(x)=w \cdot x +b \}$
Loss Function
感知机学习的策略就是最小化损失函数。对于感知机来说损失函数有两种方式。
1. 统计误分类点: $$ l(w)=\sum_{i=1}^N \ \mathbb{I}(y_i \cdot (w^Tx +b ) < 0) $$ 但是指示函数不连续,在计算过程中不太友好
2. 统计误分类点到分来超平面的距离: $$ \begin{align}l(w) &=|w^Tx +b |\\ &=\sum_{i=1}^N - \,y_i \cdot (w^Tx +b )\end{align} $$
Algorithm
为了找到更好的$w,b$。使用随机梯度下降SGD(Stochastic Gradient Descend), 但是该方法容易受特征缩放、学习率因素影响陷入局部最小值。 $$ w_{n+1} \leftarrow w_n +\eta \frac{\partial l}{\partial w}\\ b_{n+1} \leftarrow b_n +\eta \frac{\partial l}{\partial b} $$
对该算法的超参数:学习率$\eta$,误差上限$\varepsilon$,学习次数$epoch$
收敛性
设训练数据集$T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}$是线性可分的,其中$x_i\in \mathcal{X}=\mathbb{R}^n,\ y_i\in\mathcal{Y}=\{+1,-1\},\ i=1,2,\cdots,N$则:
- 存在满足条件$||\hat{w}_{opt}||=1$的超平面$\hat{w}_{opt} \cdot \hat{x}=w_{opt}\cdot x +b_{opt}=0$将训练数据集完全正确分开;且存在$\gamma>0$,对所有$i=1,2,\cdots,N$: $$ y_i (\hat{w}_{opt} \cdot \hat{x})=y_i(w_{opt}\cdot x +b_{opt})\geq \gamma $$
- 令$R=max_{1 \leq i \leq N} ||\hat{x}_i||$,则感知机算法在训练数据集上的误分类次数$k$满足不等式: $$ k \leq (\frac{R}{\gamma})^2 $$
Disadvantage
1. 存在多解
2. 依赖初值,也依赖选择顺序
3. 当数据集线性不可分就会产生迭代震荡。例如XOR异或问题
针对感知机算法的缺点,提出SVM解决多解问题,Pocket Algorithm使感知机容忍一些错误。
Python代码实现
import numpy as np data1 = [[1,2],[3,3],[2,1],[5,2]] lable1 = [1,1,-1,-1] data2 = [[3,3],[4,3],[1,1]] lable2 = [1,1,-1] class Model: def __init__(self,data): self.w = np.zeros(np.shape(data)[1]) # 权重参数 self.b = 0 # 偏置 self.l_rate = 1 # 学习率 def sign(self, x, w, b): y = np.dot(x, w) + b return y # 随机梯度下降法 def fit(self, data, lable): is_wrong = False while not is_wrong: wrong_count = 0 for d in range(len(data)): X = data[d] y = lable[d] judge = y * self.sign(X, self.w, self.b) if judge <= 0: self.w = self.w + self.l_rate * np.dot(y, X) self.b = self.b + self.l_rate * y if judge == 0: print('未分类=', d + 1, ' ', data[d]) else: print('误分类=', d + 1, ' ', data[d]) print('w = ',self.w,'b= ',self.b) wrong_count += 1 if wrong_count == 0: is_wrong = True perception1 = Model(data1) perception1.fit(data1,lable1)
参考
李航 统计学习方法
周志华 机器学习(西瓜书)
shuhuai008 机器学习白板推导