代码实现逻辑与、或的感知器

感知器(有些成为感知机)属于一种简单的神经元,在神经网络中通常感知机与神经元的区别就是激活函数的不同,一般常用的激活函数是sigmoid函数,感知机中为step function(阶跃函数

给出一组矩阵,利用神经网络的反向传播功能(BP)来训练一种能够实现逻辑与、或的感知器(最重要的是训练权重w和偏置b)

import numpy as np
samples_and = [
    [0, 0, 0],
    [1, 0, 0],
    [0, 1, 0],
    [1, 1, 1],
]
samples_or = [
    [0, 0, 0],
    [1, 0, 1],
    [0, 1, 1],
    [1, 1, 1],
]
samples_xor = [
    [0, 0, 0],
    [1, 0, 1],
    [0, 1, 1],
    [1, 1, 0],
]

def perception(samples):
    #权重
    w=np.array([1,2])
    #偏置
    b=0
    a=1
    #训练10遍
    for i in range(10):
        for j in range(4):
            #矩阵的第j行的前两个数值
            x=np.array(samples[j][:2])
            #将未激活的值输入sigmoid函数 dot:向量的点乘运算
            if np.dot(w,x)+b >0:
                y=1
            else:
                y=0
            #真实值
            d=np.array(samples[j][2])
            delta_b=a*(d-y)
            delta_w=a*(d-y)*x
            print('epoch {} sample [{} {} {} {} {} {} {}]'.format(
                i,j,w[0],w[1],b,y,delta_w[0],delta_w[1],delta_b
            ))
            #反向传播,更新权重
            w=w+delta_w
            b=b+delta_b

if __name__=='__main__':
    print('logical and:')
    perception(samples_and)
    print('logical or:')
    perception(samples_or)
    print('logical xor:')
    perception(samples_xor)

 

逻辑与的输出

 

可以看出从第三次训练后,通过神经网络的BP,权重w0,w1和b已经趋于稳定

w0=1,w1=2,b=-2

 

逻辑或的输出

 

对于逻辑或,从输出样本的第一次训练之后,对权重和偏置的BP趋于稳定,

w0=1,w1=2,b=0

 

逻辑异或的输出

 

对于异或数据的训练,每一次反馈得到的w0,w1和b都不同,可以得出感知器不能实现异或的功能,也就是不能训练处得到实现异或功能的模型。

 

解释为什么这的代码法完成带异或功能的感知器

逻辑与和逻辑或都是线性的模型,它的输入和输出都是在一条直线上,这条直线将平面区域分割为两份,在直线的两端分别满足大于和小于0,在直线上满足等于0,也就是说它是线性的。

而逻辑异或它在平面区域中是两条交叉的直线,也就是说它是线性不可分的,如下图所示

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值