感知机

感知机

  • 感知机模型
  • 感知机学习策略
  • 感知机学习算法
  • 算法的收敛性
  • 感知机学习算法的对偶形式

感知机实现二分类模型

  • 梯度下降法
  • scikit-learn 感知机学习

感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和–1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。

感知机模型

  1. 假设输入空间(特征空间)是 X \subseteq R^n,输出空间是 Y = \{+1, -1\},输入 x \in X 表示实例的特征向量,对应于输入空间(特征空间) 的点;输出 y \in Y 表示实例的类别。由输入空间到输出空间的如下函数:
    f(x) = sign(\omega \cdot x + b)
    称为感知机。其中 \omegab 称为感知机模型参数。 \omega \in R^n 叫作权值(weight)或权值向量(weight vector),b \in R 叫作偏置(bias),\omega \cdot x 表示 \omegax 的内积。
    sign 是符号函数,即
    sign(x) = \begin{cases} +1, & x \ge 0 \\ -1, & x \lt 0 \end{cases}
    感知机是一种线性分类模型,属于判别模型。

  2. 感知机有如下几何解释:线性方程 \omega \cdot x + b =0,对应于特征空间 R^n 中的一个超平面 S,其中\omega 是超平面的法向量,b 是超平面的截距。这个超平面将特征空间划分为两个部分。位于两部分的点(特征向量)分别被分为正、负两类。因此,超平面 S 称为分离超平面(separating hyperplane)。


感知机学习策略

  1. 给定数据集 T = \{(x_1,y_1), (x_2,y_2),...,(x_N,y_N)\},其中,x_i \in x \in R^ny_i \in Y \in \{+1, -1\}i=1,2,...,N,如果存在某个超平面 S
    \omega \cdot x +b =0
    能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有 y_i=+1 的实例 i ,有 \omega \cdot x +b >0,对所有 y_i=-1 的实例 i,有 \omega \cdot x +b < 0,则称数据集 T 为线性可分数据集(linearly separable data set);否则,称数据集 T 线性不可分。

  2. 损失函数的一个自然选择是误分类点的总数。但是,这样的损失函数不是参数 \omega,b 的连续可导函数,不易优化。

  3. 损失函数的另一个选择是误分类点到超平面 S 的总距离,这是感知机所采用的。为此,首先写出输入空间R^n 中任一点 x_0 到超平面 S 的距离:
    \frac{1}{\mid\mid \omega \mid\mid}\mid \omega \cdot x_0 +b \mid
    其次,对于误分类的数据 (x_i,y_i) 来说, -y_i(\omega\cdot x_i +b) > 0 成立,因为当 \omega\cdot x_i +b > 0 时,y_i = -1,当 \omega\cdot x_i +b < 0 时,y_i = +1。因此,误分类点 x_i 到超平面 S 的距离是:
    -\frac{1}{\mid\mid \omega \mid\mid} y_i(\omega \cdot x_i +b )
    这样,假设超平面 S 的误分类点集合为 M,那么所有误分类点到超平面 S 的总距离为:
    -\frac{1}{\mid\mid \omega \mid\mid} \sum_{x_i \in M} y_i(\omega \cdot x_i +b )
    不考虑 \frac{1}{\mid\mid \omega \mid\mid},就得到感知机学习的损失函数。这个损失函数就是感知机学习的经验风险函数。

  4. 证明空间 R^n 中任一点 x_0 到超平面 S 的距离:
    设点 x_0 到超平面 S 的距离为 d,点 x_0 在超平面 S 的投影为 x_1,则 \omega \cdot x_1 + b =0
    由于向量 \overline{x_0x_1}S 平面的法向量 \omega 平行, 所以
    \begin{array} \\\mid \omega \cdot \overline{x_0x_1}\mid &=& \mid \omega \mid \mid \overline{x_0x_1}\mid \\ &=& \sqrt{(\omega^1)^2+...+(\omega^n)^2}d \\ &=& \mid\mid \omega \mid\mid d \end{array}

    \begin{array} \\\omega \cdot \overline{x_0x_1} &=& \omega^1(x_0^1-x_1^1) + \omega^2(x_0^2-x_1^2)+...+\omega^n(x_0^n-x_1^n) \\ &=&\omega^1x_0^1+\omega^2x_0^2+...+\omega^nx_0^n-(\omega^1x_1^1+\omega^2x_1^2+...+\omega^nx_1^n) \\ &=&\omega^1x_0^1+\omega^2x_0^2+...+\omega^nx_0^n - (-b) \end{array}
    所以
    \begin{array} \\\mid\mid \omega \mid\mid d &=& \mid \omega^1x_0^1+\omega^2x_0^2+...+\omega^nx_0^n + b \mid \\ &=& \mid \omega \cdot x_0 + b \mid \end{array}

    d = \frac{1}{\mid\mid \omega \mid\mid}\mid \omega \cdot x_0 +b \mid

感知机学习算法

  1. 给定数据集 T = \{(x_1,y_1), (x_2,y_2),...,(x_N,y_N)\},其中,x_i \in x \in R^ny_i \in Y \in \{+1, -1\}i=1,2,...,N,求参数 \omega, b,使其为以下损失函数极小化问题的解:
    min_{\omega, b}L(\omega, b) = -\sum_{x_i \in M}y_i(\omega \cdot x_i + b)
    其中 M 为误分类点的集合。

  2. 感知机学习算法是误分类驱动的,具体采用随机梯度下降法(stochastic gradient descent)。假设误分类点集合 M 是固定的,那么损失函数 L(\omega,b) 的梯度由
    \nabla_\omega L(\omega, b) = - \sum_{x_i \in M}y_ix_i \\ \nabla_b L(\omega, b) = - \sum_{x_i \in M}y_i
    给出。随机选取一个误分类点 (x_i, y_i), 对 \omega, b 进行更新:
    \omega \leftarrow \omega + \eta y_ix_i \\ b \leftarrow b + \eta y_i
    式中 \eta(0 \lt \eta \le 1) 是步长,在统计学习中又称为学习率(learning rate)。这样,通过迭代可以期待损失函数 L(\omega,b) 不断减小,直到为0。

  3. 感知机模型 f(x)=sign(\omega \cdot x + b)
    1>> 选取初值 \omega, b
    2>> 在训练集中选取数据(x_i, y_i)
    3>> 如果 y_i(\omega \cdot x_i + b) \le 0,则 \omega \leftarrow \omega + \eta y_ix_ib \leftarrow b + \eta y_i
    4>> 转至 2>>,直至训练集中没有误分点。

算法的收敛性

为了方便推导,将偏置 b 并入权重向量 \omega,记作 \hat{\omega} = (\omega^T, b)^T,同样也将输入向量加以扩充,记作 \hat{x}=(x^T, 1)^T。这样, \hat{x} \in R^{N+1}\hat{\omega} \in R^{N+1}。显然,\hat{\omega} \cdot \hat{x} = \omega \cdot x + b

  1. 设数据集 T = \{(x_1,y_1), (x_2,y_2),...,(x_N,y_N)\} 是线性可分的,其中,x_i \in x \in R^ny_i \in Y \in \{+1, -1\}i=1,2,...,N,则


    <1> 存在满足条件 \mid\mid \hat{\omega}_{opt}\mid\mid =1 的超平面 \hat{\omega}_{opt} \cdot \hat{x}=\omega_{opt} \cdot x + b_{opt} = 0 将训练数据集完全正确分开;且存在 \gamma > 0,对所有 i=1,2,...,N,有 y_i(\hat{\omega}_{opt} \cdot \hat{x_i}) = y_i(\omega_{opt} \cdot x_i + b_{opt}) \ge \gamma


    <2>R = max_{1 \le i \le N}\mid\mid \hat{x_i} \mid\mid,则感知机 f(x)=sign(\omega \cdot x + b) 在训练数据集上的误分类次数 k 满足不等式 k \le (\frac{R}{\gamma})^2

  2. 证明 <1>:由于训练数据集是线性可分的,存在超平面可将训练数据集完全正确分开,取此超平面为 \hat{\omega}_{opt} \cdot \hat{x}=\omega_{opt} \cdot x + b_{opt} = 0,使 \mid\mid \hat{\omega}_{opt}\mid\mid =1。由于对有限的 i=1,2,...,N,均有
    \hat{\omega}_{opt} \cdot \hat{x_i}=\omega_{opt} \cdot x_i + b_{opt} > 0
    所以存在
    \gamma = min_i\{\omega_{opt} \cdot x_i + b_{opt}\}
    使
    \hat{\omega}_{opt} \cdot \hat{x_i}=\omega_{opt} \cdot x_i + b_{opt} \ge \gamma

  3. 证明 <2>:感知机算法从 \hat{\omega}_0=0 开始,如果实例被误分类,则更新权重。令 \hat{\omega}_{k-1} 是第 k 个误分类实例之前的扩充权重向量,即
    \hat{\omega}_{k-1} = (\omega_{k-1}^T, b_{k-1})^T
    则第 k 个误分类实例的条件是
    y_i(\hat{\omega}_{k-1} \cdot \hat{x}_i) = y_i(w_{k-1}\cdot x_i + b_{k-1}) \le 0
    (x_i, y_i) 是被 \hat{\omega}_{k-1} = (\omega_{k-1}^T, b_{k-1})^T 误分类的数据, 则 \omegab 的更新是
    \omega_k \leftarrow \omega_{k-1} + \eta y_i x_i \\ b_k \leftarrow b_{k-1} + \eta y_i

    \hat{\omega}_k = \hat{\omega}_{k-1} + \eta y_i \hat{x}_i
    下面推导两个不等式
    1>> \hat{\omega}_k \cdot \hat{\omega}_{opt} \ge k \eta \gamma
    \begin{array} \\\hat{\omega}_k \cdot \hat{\omega}_{opt} & = & \hat{\omega}_{k-1} \cdot \hat{\omega}_{opt} + \eta y_i \hat{\omega}_{opt} \cdot \hat{x}_i \\ & \ge & \hat{\omega}_{k-1} \cdot \hat{\omega}_{opt} + \eta \gamma \\ & \ge & \hat{\omega}_{k-2} \cdot \hat{\omega}_{opt} + 2\eta \gamma \\ & \ge & \hat{\omega}_{k-3} \cdot \hat{\omega}_{opt} + 3\eta \gamma \\ & ... \\ & \ge & k\eta \gamma \end{array}


    2>> \mid\mid \hat{\omega}_k\mid\mid^2 \le k \eta^2 R^2
    \begin{array} \\\mid\mid \hat{\omega}_k\mid\mid^2 & =& \mid\mid \hat{\omega}_{k-1}\mid\mid^2 + 2\eta y_i \hat{\omega}_{k-1} \cdot \hat{x}_i + \eta^2\mid\mid \hat{x}_i \mid\mid^2 \\ & \le & \mid\mid \hat{\omega}_{k-1}\mid\mid^2 + \eta^2\mid\mid \hat{x}_i \mid\mid^2 \\ & \le & \mid\mid \hat{\omega}_{k-1}\mid\mid^2 + \eta^2R^2 \\ & \le & \mid\mid \hat{\omega}_{k-2}\mid\mid^2 + 2\eta^2R^2 \\ & \le & \mid\mid \hat{\omega}_{k-3}\mid\mid^2 + 3\eta^2R^2 \\ & ... \\ &\le & k\eta^2R^2 \end{array}
    结合以上两个不等式得
    k\eta \gamma \le \hat{\omega}_k \cdot \hat{\omega}_{opt} \le \mid\mid \hat{\omega}_k \mid\mid \mid\mid \hat{\omega}_{opt} \mid\mid \le \sqrt{k} \eta R \\ k^2 \gamma^2 \le kR^2 \\ k \le (\frac{R}{\gamma})^2

  4. 上述证明表明,误分类的次数 k 是有上界的,经过有限次搜索可以找到将训练数据完全正确分开的分离超平面。也就是说,当训练数据集线性可分时,感知机学习算法原始形式迭代是收敛的。

感知机学习算法的对偶形式

  1. 对偶形式的基本想法是,将 \omegab 表示为实例 x_i 和标记 y_i 的线性组合的形式,通过求解其系数而求得 \omegab

  2. \omega,b 均为 0,对误分类点 (x_i, y_i), 通过
    \omega \leftarrow \omega + \eta y_ix_i \\ b \leftarrow b + \eta y_i
    逐步修改 \omega, b,设修改 n 次,则 \omega, b 关于 (x_i, y_i) 的增量分别是 \alpha_iy_ix_i\alpha_iy_i,这里的 \alpha_i = n_i \eta ,最后学习到的 \omega, b 可以分别表示为
    \omega = \sum_{i=1}^N\alpha_i y_i x_i \\ b = \sum_{i=1}^N\alpha_i y_i
    这里,\alpha \ge 0i=1,2,…,N ,当 \eta=1 时,表示第i个实例点由于误分而进行更新的次数,即 n_i。实例点更新次数越多,意味着它距离分离超平面越近,也就越难正确分类。换句话说,这样的实例对学习结果影响最大。

  3. 感知机模型 f(x)=sign(\sum_{j=1}^N\alpha_j y_j x_j \cdot x + b),其中 \alpha = (\alpha_1, \alpha_2, ..., \alpha_N)^T
    1>> 选取初值 \alpha=0,b=0
    2>> 在训练集中选取数据(x_i, y_i)
    3>> 如果 y_i(\sum_{j=1}^N\alpha_j y_j x_j \cdot x_i + b) \le 0,则 \alpha_i \leftarrow \alpha_i + \etab \leftarrow b + \eta y_i
    4>> 转至 2>>,直至训练集中没有误分点。

  4. 对偶形式中训练实例仅以内积的形式出现。为了方便,可以预先将训练集中实例间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的Gram矩阵(Gram matrix)
    G = [x_i \cdot x_j ]_{N \times N}
    例如 x_1=(3,3)^T, x_2=(4,3)^T, x_3=(1,1)^T,那么其Gram矩阵为
    \left[\begin{matrix} 18 & 21 & 6 \\ 21 & 25 & 7 \\ 6 & 7 & 2 \end{matrix}\right]


感知机实现二分类模型

梯度下降法

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris


class Perceptron(object):
    def __init__(self, s):
        # s: 权重参数个数
        # omega: 权重参数
        # b: 斜率
        # eta: 学习率
        self.omega = np.ones(s, dtype=np.float32)
        self.b = 0
        self.eta = 0.1
    
    # 符号函数
    def sign(self, x, omega, b):
        return np.dot(x, omega) + b
    
    # 拟合函数,梯度下降
    def fit(self, x_train, y_train):
        while True:
            errors = 0
            for index in range(len(x_train)):
                _x = x_train[index]
                _y = y_train[index]
                if _y * self.sign(_x, self.omega, self.b) <= 0:
                    self.omega = self.omega + self.eta * np.dot(_y, _x)
                    self.b = self.b + self.eta * _y
                    errors += 1
            if errors == 0:
                break


if __name__ == '__main__':
    # 获取鸢尾花数据集
    iris = load_iris()
    df = pd.DataFrame(iris.data, columns=iris.feature_names)
    df['label'] = iris.target
    df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
    # 生成训练样本,只取 sepal length,sepal width 作为样本特征
    train = np.array(df.iloc[:100, [0, 1, -1]])
    x_train, y_train = train[:, :-1], train[:, -1]
    y_train = np.array([1 if i==1 else -1 for i in y_train])
    # 初始化感知机模型
    pmodel = Perceptron(len(train[0])-1)
    # 拟合训练
    pmodel.fit(x_train, y_train)
    print('omage: ', pmodel.omega)
    print('b: ', pmodel.b)
    # 绘制拟合函数
    length_points = np.linspace(4, 7, 10)
    width_points = -(pmodel.omega[0] * length_points + pmodel.b)/pmodel.omega[1]
    plt.plot(length_points, width_points, label='fitting')
    plt.plot(train[:50, 0], train[:50, 1], 'bo', color='blue', label='0')
    plt.plot(train[50:100, 0], train[50:100, 1], 'bo', color='orange', label='1')
    plt.xlabel('sepal length')
    plt.ylabel('sepal width')
    plt.legend()

运行结果:

scikit-learn 感知机学习

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import Perceptron


def fit(x_train, y_train):
    # fit_intercept 训练模型是否需要截距项
    pmodel = Perceptron(fit_intercept=True, max_iter=1000, shuffle=False, eta0=0.01)
    pmodel.fit(x_train, y_train)
    return pmodel


if __name__ == '__main__':
    # 获取鸢尾花数据集
    iris = load_iris()
    df = pd.DataFrame(iris.data, columns=iris.feature_names)
    df['label'] = iris.target
    df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
    # 生成训练样本,只取 sepal length,sepal width 作为样本特征
    train = np.array(df.iloc[:100, [0, 1, -1]])
    x_train, y_train = train[:, :-1], train[:, -1]
    y_train = np.array([1 if i==1 else -1 for i in y_train])
    # 使用 sklearn 感知机模型拟合训练
    pmodel = fit(x_train, y_train)
    print('omage: ', pmodel.coef_)
    print('b: ', pmodel.intercept_)
    # 绘制拟合函数
    length_points = np.linspace(4, 7, 10)
    width_points = -(pmodel.coef_[0][0] * length_points + pmodel.intercept_)/pmodel.coef_[0][1]
    plt.plot(length_points, width_points, label='fitting')
    plt.plot(train[:50, 0], train[:50, 1], 'bo', color='blue', label='0')
    plt.plot(train[50:100, 0], train[50:100, 1], 'bo', color='orange', label='1')
    plt.xlabel('sepal length')
    plt.ylabel('sepal width')
    plt.legend()

运行结果:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容