机器学习——Perceptron(感知机)

Introduce

感知机模型(Perceptron)是一个最简单的有监督的二分类线性模型。他可以从两个方面进行介绍

方面一 问题分析

问题(一维):儿童免票乘车问题(孩子身高低于1.2m可以免票上车)

这转换成数学表达式就是 $x:$身高,$y:\{-1:$免票 ,$1:$购票$\}$

$$ y=\left\{\begin{matrix}+1,x\ge1.2m \\ -1,x\lt1.2m\end{matrix}\right. $$

机器学习——Perceptron(感知机)

如果把$y$用函数$f(x;b)$表达出来就如下所示

$$ y=f(x;b)=\left\{\begin{matrix}+1,z=x+b\ge0 \\ -1,z=x+b \lt0 \end{matrix}\right. $$

机器学习——Perceptron(感知机)

 

用机器学习的话来说变量$x$就是一个特征,$y$就是一个标记,$b$就是一个偏置

问题(二维):西瓜分类(依靠西瓜的颜色和敲击的响声分类)

这里的$x$就从一个一维特征编程了二维的特称向量$\{x_1:$颜色 ,$x_2:$响声$\}$ $y$仍然是一个标记 $y:\{-1:$坏瓜 ,$1:$好瓜$\}$ 数据如图所示:

机器学习——Perceptron(感知机)

 

用一般的数学方法,我们希望将两个变量$x_1,x_2$映射到一个维度上去 就会出现如下三种经典的情况

映射到水平方向机器学习——Perceptron(感知机)

 

映射到竖直方向机器学习——Perceptron(感知机)

 

映射到任意方向机器学习——Perceptron(感知机)

二维向量映射到一维空间需要有映射的方向。此时就需要一定的方向向量$\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神经元模型

神经元的生物学结构机器学习——Perceptron(感知机)

M-P神经元模型 机器学习——Perceptron(感知机)

而感知机模型是从神经元模型发展过来的。感知机是由两层神经元组成的一个简单模型。只有输出层是M-P 神经元,即只有输出层神经元进行激活函数处理,也称为功能神经元( functional neuron);输入层只是接受外界信号(样本属性)并传递给输出层(输入层的神经元个数等于样本的属性数目),而没有激活函数。示意图如下:

机器学习——Perceptron(感知机)

 

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 机器学习白板推导

上一篇:机器学习——性能指标


下一篇:随机变量乘积的期望和方差