深度学习入门笔记 Day2/15 感知机

一、感知机是什么?

感知机是一种算法,把多个输入信号x_1,x_2,...,x_n按一定的逻辑关系进行输出(一个输出),单层感知机公式如下:

y=\left\{\begin{matrix} 1 & w_1x_1+w_2x_2+...+w_nx_n > \theta\\ 0 & w_1x_1+w_2x_2+...+w_nx_n \leqslant \theta \end{matrix}\right.

通过调整权重w和阈值\theta,可以用来实现各种逻辑电路。

二、如何用单层感知机实现各种逻辑电路?

比如或门:设置权重和阈值 w1=0.5,w2=0.5,theta=0.3即可,这个值不唯一,自己试试,无限多种组合方式。

# 或门
# w1=0.5,w2=0.5,theta=0.3
import numpy as np


def myOr(x1, x2):
    w = np.array([0.5, 0.5])
    theta = 0.3
    x = np.array([x1, x2])
    if np.sum(x*w) > theta:
        return 1
    else:
        return 0


def main():
    print("This is the result of OR:")
    print("0 OR 0: ", myOr(0, 0))
    print("1 OR 0: ", myOr(1, 0))
    print("0 OR 1: ", myOr(0, 1))
    print("1 OR 1: ", myOr(1, 1))


main()

输出结果:

 三、为何单层感知机无法表达异或门?

异或门的真值表如下:(相同为假,不同为真)

x1x2y
000
011
101
110

从单层感知机的定义来看,他是划了一条直线,直线的一侧输出1,另一侧输出0,比如或门的阈值函数是:0.5x_1+0.5x_2=0.3,下图中蓝色的直线就是这个函数的图形化表示,显然直线右侧的值都是真,左侧的值是假。

再回到异或门真值表,你会发现它的值呈对角排列,无法用一条直线划分开,所以异或门无法用单层感知机表示。

四、多层感知机有什么样的表达能力?

其实复杂的数字电路拆解到最后都是由一个个的逻辑门电路构成的,而单层感知机既然可以代表一个简单的门电路,那么多层组合的感知机自然可以表达一个复杂的数字电路。

比如异或门,在数字电路中是用A\oplus B=\overline{A}B+A\overline{B}

AB\overline{A}BA\overline{B}A\oplus B
00000
01101
10011
11000

但是呢,非门输入只有一个,所以上面这个公式不适用,改用与非门、或门和与门的组合A\oplus B=(\overline{AB})(A+B)

AB\overline{AB}A+BA\oplus B
00100
01111
10111
11010

Python代码如下:

import numpy as np


def OR(x1, x2):
    w = np.array([0.5, 0.5])
    theta = 0.3
    x = np.array([x1, x2])
    if np.sum(x*w) > theta:
        return 1
    else:
        return 0


def AND(x1, x2):
    w = np.array([0.5, 0.5])
    theta = 0.8
    x = np.array([x1, x2])
    if np.sum(x*w) > theta:
        return 1
    else:
        return 0


def NAND(x1, x2):
    w = np.array([-0.5, -0.5])
    theta = -0.8
    x = np.array([x1, x2])
    if np.sum(x*w) > theta:
        return 1
    else:
        return 0


def NOR(x1, x2):
    return AND(NAND(x1, x2), OR(x1, x2))


def main():
    print("This is the result of NOR:")
    print("0 NOR 0: ", NOR(0, 0))
    print("1 NOR 0: ", NOR(1, 0))
    print("0 NOR 1: ", NOR(0, 1))
    print("1 NOR 1: ", NOR(1, 1))


main()

运行结果如下:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值