感知器算法

研究背景

在文献《The perceptron: A probabilistic model for information storage and organization in the brain》中,Rosenblatt首次提出了感知器模型,并利用它来模拟神经元的信息存储和组织功能。

在论文《The perceptron: A perceiving and recognizing automaton》中,Rosenblatt对感知器算法进行了深入的研究和分析,提出了感知器的学习规则,并证明了感知器的收敛性。

在文献《An analysis of single-layer networks in unsupervised feature learning》中,Erhan等人对感知器的升级版本——自动编码器进行了研究,并发现自动编码器具有学习特征表示的能力,为后来深度学习的发展奠定了基础。

在论文《Perceptron training algorithm for pattern classification》中,Fu等人提出了一种改进的感知器训练算法,能够更好地处理多类别分类问题。

在文献《Convergence of perceptron-like learning algorithms》中,Littlestone和Warmuth证明了感知器算法和其它感知器类算法的收敛性和复杂度。

在论文《Neural network classifiers with incremental learning based on perceptron algorithm》中,Wang等人提出了一种基于感知器算法的增量学习神经网络分类器,能够快速适应新数据和新类别。

感知器算法原理说明

感知器是一种二分类的线性分类算法,其原理基于神经元的工作原理。感知器将输入数据通过加权求和的方式映射到一个输出,然后根据输出的结果进行分类。

具体来说,给定一个训练集 D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) D={(x_1,y_1),(x_2,y_2),...,(x_n,y_n)} D=(x1,y1),(x2,y2),...,(xn,yn),其中 x i x_i xi 是一个 m m m 维向量,表示第 i i i 个样本的特征, y i ∈ − 1 , 1 y_i\in {-1,1} yi1,1 是该样本的标签。感知器的目标是找到一个权重向量 w w w,使得对于所有样本 ( x i , y i ) (x_i,y_i) (xi,yi),有:

在这里插入图片描述

其中 w ⋅ x i w\cdot x_i wxi 表示 w w w x i x_i xi 的内积, b b b 是一个常数,称为偏置项。上述式子可以简化为:

y i ( w ⋅ x i + b ) > 0 y_i(w\cdot x_i+b)>0 yi(wxi+b)>0

即对于正确分类的样本,其预测值与真实值之积大于零。

感知器的训练过程是一个迭代的过程,每次迭代通过更新权重向量 w w w 和偏置项 b b b 来逐步提高模型的准确率。具体来说,在每一轮迭代中,从训练集中选取一个错分类的样本 ( x i , y i ) (x_i,y_i) (xi,yi),然后按以下公式更新 w w w b b b

w = w + η y i x i w=w+\eta y_ix_i w=w+ηyixi

b = b + η y i b=b+\eta y_i b=b+ηyi

其中 η \eta η 是学习率,控制着每次更新的步长。这个过程会一直重复,直到所有样本都被正确分类或达到预设的迭代次数。

需要注意的是,感知器算法只能处理线性可分的数据集。如果数据集不是线性可分的,算法会一直迭代下去而无法停止。此外,感知器还存在多个权重向量和偏置项的解,因此不同的初始权重和偏置可能会导致不同的结果。

感知器算法公式推导

感知器算法的公式推导可以从定义开始,假设我们有一个二分类的数据集 D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) D={(x_1,y_1),(x_2,y_2),...,(x_n,y_n)} D=(x1,y1),(x2,y2),...,(xn,yn),其中 x i x_i xi 是一个 m m m 维向量,表示第 i i i 个样本的特征, y i ∈ − 1 , 1 y_i\in {-1,1} yi1,1 是该样本的标签。我们的目标是找到一个超平面 w ⋅ x + b = 0 w\cdot x+b=0 wx+b=0 将数据集分为两类。

假设我们已经得到了一个权重向量 w w w 和偏置项 b b b,我们可以将其代入超平面方程中,得到样本 x i x_i xi 距离超平面的距离:

∣ w ⋅ x i + b ∣ ∣ w ∣ \frac{|w\cdot x_i+b|}{|w|} wwxi+b

其中 ∣ w ∣ |w| w 表示向量 w w w 的模长。我们希望距离正确分类的样本越远越好,因此可以定义感知器的损失函数为:

L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) L(w,b)=-\sum_{x_i\in M}y_i(w\cdot x_i+b) L(w,b)=xiMyi(wxi+b)

其中 M M M 是被错误分类的样本集合。对于正确分类的样本, y i ( w ⋅ x i + b ) > 0 y_i(w\cdot x_i+b)>0 yi(wxi+b)>0,所以损失函数取值为负数。而对于错误分类的样本, y i ( w ⋅ x i + b ) < 0 y_i(w\cdot x_i+b)<0 yi(wxi+b)<0,损失函数取值为正数。我们的目标是最小化损失函数,使得所有样本都被正确分类。

接下来,我们使用随机梯度下降算法来优化损失函数。在每次迭代中,我们随机选择一个错误分类的样本 ( x i , y i ) (x_i,y_i) (xi,yi),然后按照以下公式更新 w w w b b b

w = w + η y i x i w=w+\eta y_ix_i w=w+ηyixi

b = b + η y i b=b+\eta y_i b=b+ηyi

其中 η \eta η 是学习率,控制着每次更新的步长。这个过程会一直重复,直到所有样本都被正确分类或达到预设的迭代次数。

可以证明,如果数据集是线性可分的,那么感知器算法一定会收敛,得到一个能够将数据集分为两类的超平面。但如果数据集不是线性可分的,算法会一直迭代下去而无法停止。此外,感知器还存在多个权重向量和偏置项的解,因此不同的初始权重和偏置可能会导致不同的结果。

下面我们来推导感知器算法的更新公式。首先定义一个样本点 ( x i , y i ) (x_i, y_i) (xi,yi) 的损失函数为:

L i ( w , b ) = − y i ( w ⋅ x i + b ) L_i(w,b)=-y_i(w\cdot x_i+b) Li(w,b)=yi(wxi+b)

如果这个样本点被正确分类,即 y i ( w ⋅ x i + b ) > 0 y_i(w\cdot x_i+b)>0 yi(wxi+b)>0,那么这个样本点的损失函数为0。如果这个样本点被错误分类,即 y i ( w ⋅ x i + b ) ≤ 0 y_i(w\cdot x_i+b)\leq 0 yi(wxi+b)0,那么这个样本点的损失函数就是 − y i ( w ⋅ x i + b ) -y_i(w\cdot x_i+b) yi(wxi+b)

为了最小化感知器的损失函数,我们需要对所有被错误分类的样本点 ( x i , y i ) (x_i, y_i) (xi,yi) 更新权重 w w w 和偏置 b b b。假设当前迭代到第 t t t 次,我们选取的样本点为 ( x i , y i ) (x_i, y_i) (xi,yi),那么在这次迭代中,我们需要将 w w w b b b 更新为:

w t + 1 = w t + η y i x i w_{t+1} = w_t + \eta y_i x_i wt+1=wt+ηyixi

b t + 1 = b t + η y i b_{t+1} = b_t + \eta y_i bt+1=bt+ηyi

其中, η \eta η 是学习率, w t w_t wt b t b_t bt 是上一次迭代得到的权重和偏置。这个更新规则的含义是:如果一个样本点 ( x i , y i ) (x_i, y_i) (xi,yi) 被错误分类,那么我们就沿着它的负梯度方向更新权重和偏置,使得这个样本点离超平面更近,从而使得它被正确分类。

在实际应用中,感知器算法往往需要多次迭代才能得到较好的结果。我们可以设置一个最大迭代次数或者一个阈值,当达到这个条件时就停止迭代。在每次迭代中,我们可以随机选取一个错误分类的样本点来更新权重和偏置,或者按照顺序遍历所有的样本点来更新权重和偏置。无论是哪种更新方式,最终的结果都是将数据集分为两类的超平面。

代码示意

import numpy as np

class Perceptron:
    def __init__(self, learning_rate=0.1, max_iterations=100):
        self.learning_rate = learning_rate
        self.max_iterations = max_iterations

    def fit(self, X, y):
        # 添加截距项
        X = np.insert(X, 0, 1, axis=1)
        self.weights = np.zeros(X.shape[1])
        for iteration in range(self.max_iterations):
            for i in range(X.shape[0]):
                if y[i] * np.dot(X[i], self.weights) <= 0:
                    self.weights += self.learning_rate * y[i] * X[i]

    def predict(self, X):
        # 添加截距项
        X = np.insert(X, 0, 1, axis=1)
        predictions = np.sign(np.dot(X, self.weights))
        return predictions

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丰。。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值