机器学习-02算法-04感知机

感知机是一种简单的神经网络模型,用于二分类问题。它有一个神经元,适用于线性可分数据。文章介绍了感知机的定义、损失函数(0-1损失函数)、超平面以及误分类点的距离。感知机的学习过程涉及梯度下降法更新权重。文章提供了Python代码示例,展示如何实现感知机算法,并提到了sklearn库中的Perceptron类。
摘要由CSDN通过智能技术生成

最简单的神经网络–感知机,只有一个神经元,代表只能画一条线。一分为二。不能处理异或问题—这得需要两条线分开,需要俩神经元。

一、定义

感知机(PLA)是最简单的神经网络(见神经网络矩阵结构单神经元多样本),只有一个神经元来判断与否非问题,是最简单的二分类算法。
对于 W W W, X X X Y Y Y
W W W为系数矩阵,就是我们要求的未知数, m ∗ 1 m*1 m1大小。
X X X为输入矩阵, m ∗ n m*n mn大小。
Y Y Y为输出矩阵, n ∗ 1 n*1 n1大小,值为1或者-1(非此种形式的转换成此种表达),1表示一种分类,-1表示另一种分类。对于一个样本:
y i = s g n ( W T x i ) y_i=sgn(W^Tx_i) yi=sgn(WTxi)
s g n ( x ) sgn(x) sgn(x)是符号函数。

二、损失函数

感知机损失函数为0-1损失函数(gold standard 标准式), 0-1损失是指,预测值和目标值不相等为1,否则为0。但是此损失函数只是相当于指导思想,无法直接操作,所以我们换一种思路:误分类点到超平面的总距离,这种错误分类的点的距离总和最小化。
从最简单的二维说起,由初中数据知识,一条直线可以表示为 a x + b y + c = 0 ax + by + c = 0 ax+by+c=0或者 w 1 x 1 + w 2 x 2 + w 0 = 0 w_1x_1+w_2x_2+w_0 = 0 w1x1+w2x2+w0=0,点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) ( x 1 , x 2 ) (x_1,x_2) (x1,x2)到直线的距离公式为:
∣ a x 0 + b y 0 + c ∣ a 2 + b 2 或 ∣ w 1 x 1 + w 2 x 2 + c ∣ w 1 2 + w 2 2 \frac{|ax_0+by_0+c|}{\sqrt{a^2+b^2}}或\frac{|w_1x_1+w_2x_2+c|}{\sqrt{w_1^2+w_2^2}} a2+b2 ax0+by0+cw12+w22 w1x1+w2x2+c

推广到高维,超平面公式为:
g ( x ) = ∑ i = 1 n w i x i + w 0 g(x)= \sum _{i=1}^{n}w_{i}x_{i}+w_{0} g(x)=i=1nwixi+w0
( x 1 , x 2 , . . . , x n ) (x_1,x_2,...,x_n) (x1,x2,...,xn)到该平面的距离为:
1 ∣ ∣ w ∣ ∣ ∣ w ⋅ x + w 0 ∣ \frac{1}{||w||}|w\cdot x+w_0| ∣∣w∣∣1wx+w0

三、感知机原理

感知机可理解为:对于线性可分数据集,存在一个(超)平面S(即 w ⋅ x + b w\cdot x+b wx+b),可将所有数据完全正确分到两侧。考虑二维平面情况,则当 w 1 x 1 + w 2 x 2 + w 0 > 0 w_1x_1+w_2x_2+w_0>0 w1x1+w2x2+w0>0 w 1 x 1 + w 2 x 2 + w 0 < 0 w_1x_1+w_2x_2+w_0<0 w1x1+w2x2+w0<0分别位于直线的两侧。
如前文所述,感知机判断标准: y i = s g n ( W T x i ) y_i=sgn(W^Tx_i) yi=sgn(WTxi),如果判断正确,此时分为两种情况: W T x i W^Tx_i WTxi为正,此时 y i = 1 y_i=1 yi=1 W T x i W^Tx_i WTxi为负,此时 y i = − 1 y_i=-1 yi=1。总之,判断正确时, y i ∗ W T x i > 0 y_i*W^Tx_i>0 yiWTxi>0,判断错误时, y i ∗ W T x i < 0 y_i*W^Tx_i<0 yiWTxi<0.
如果超平面S没将所有数据分块,假设误分类点集合为M,那么所有误分类点到S的距离为:
− 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w ⋅ x i + w 0 ) -\frac{1}{||w||}\sum_{x_i\in M}y_i(w\cdot x_i+w_0) ∣∣w∣∣1xiMyi(wxi+w0)
通俗起见, w 0 w_0 w0一般写成 b b b,即
− 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w ⋅ x i + b ) -\frac{1}{||w||}\sum_{x_i\in M}y_i(w\cdot x_i+b) ∣∣w∣∣1xiMyi(wxi+b)
此处, y i y_i yi ( w x i + b ) (wx_i+b) wxi+b符号相反,因为是错误分点。所以去掉绝对值后,前面加一个负号。
所以损失函数可写为:
L ( w , b ) = − 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w ⋅ x i + b ) L(w,b)=-\frac{1}{||w||}\sum_{x_i\in M}y_i(w\cdot x_i+b) L(w,b)=∣∣w∣∣1xiMyi(wxi+b)
进一步令 ∣ ∣ w ∣ ∣ = 1 ||w||=1 ∣∣w∣∣=1,此时并不影响后续实际计算,上式简化为:
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)
进一步计算 w 和 b w和b wb 的导数,求得梯度:
∂ L ( w , b ) ∂ w = − ∑ x i ∈ M y i x i \frac{\partial L(w,b)}{\partial w} =-\sum_{x_i\in M}y_ix_i wL(w,b)=xiMyixi
∂ L ( w , b ) ∂ b = − ∑ x i ∈ M y i \frac{\partial L(w,b)}{\partial b} =-\sum_{x_i\in M}y_i bL(w,b)=xiMyi
对于系数 w w w 来说,迭代方式为:
w i + 1 = w i − ∂ L ∂ w = w i + y i x i w_{i+1}=w_i-\frac{\partial L}{\partial w}=w_i+y_ix_i wi+1=wiwL=wi+yixi

四、代码实现

使用python来实现
import numpy as np

def pla(X, y):
    """
    感知器学习算法实现
    注意:只能处理线性可分的数据集,输入线性不可分的数据集函数将无法停止
    args:
        X - 训练数据集
        y - 目标标签值
    return:
        w - 权重系数
    """
    done = False
    # 初始化权重系数
    w = np.zeros(X.shape[1])
    # 循环
    while(done == False):
        done = True
        # 遍历训练数据集
        for index in range(len(X)):
            x = X[index]
            # 判定是否与目标值不符
            if x.dot(w) * y[index] <= 0:
                done = False
                # 修正权重系数
                w = w + y[index] * x
    return w
使用sklearn
from sklearn.linear_model import Perceptron

# 初始化感知器
clf = Perceptron()
# 用随机梯度下降拟合线性模型
clf.fit(X, y)
# 权重系数
w = clf.coef_

五、示例演示

简单训练数据集分类:
在这里插入图片描述
复杂训练数据集分类:
在这里插入图片描述

六、参考

简单程序见:
机器学习算法系列(一)- 感知器学习算法(PLA)
复杂程序见:
NLP重剑篇之感知机与支持向量机
实例联系见:
Python实现感知机(PLA)算法
其他参考见:
模式识别系列(一)感知器算法(PLA)
机器学习 第35集:感知机用什么做损失函数? ( 含有笔记、代码、注释 )
线性模型篇之感知机 (PLA) 数学公式推导

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值