深度学习入门笔记 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()

输出结果:

深度学习入门笔记 Day2/15 感知机_第1张图片

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

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

x1 x2 y
0 0 0
0 1 1
1 0 1
1 1 0

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

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

深度学习入门笔记 Day2/15 感知机_第3张图片

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

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

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

A B \overline{A}B A\overline{B} A\oplus B
0 0 0 0 0
0 1 1 0 1
1 0 0 1 1
1 1 0 0 0

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

A B \overline{AB} A+B A\oplus B
0 0 1 0 0
0 1 1 1 1
1 0 1 1 1
1 1 0 1 0

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()

运行结果如下:

深度学习入门笔记 Day2/15 感知机_第4张图片

 

你可能感兴趣的:(深度学习入门)