第二章---感知机

本文介绍了感知机的基本概念,包括其工作原理、如何实现简单逻辑电路如与门、或门、与非门,以及感知机的局限性,特别是在无法表示异或门的情况下。此外,还探讨了通过多层感知机如何克服这一局限性,展示了一个使用与非门和或门构建异或门的例子。
摘要由CSDN通过智能技术生成

🌞欢迎来到深度学习的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


目录

2.1感知机是什么

2.2 简单逻辑电路

2.3 感知机的实现

2.4 感知机的局限性

2.5 多层感知机


2.1感知机是什么

     感知机接收多个输入信号,输出一个信号。

2-1 是一个接收两个输入信号的感知机的例子。
  • x1x2是输入信号, y是输出信号,
  • w1w2权重
  • 图中的○称为“经元”。
输入信号被送往神经元时,会被分别乘以固定的权重(w 1x1 w2x2 )。神经元会计算传送过来的信号的总和,只有当这个总和超过 了某个界限值时,才会输出1 。这也称为“神经元被激活”。这里将这个界限值称为阈值 ,用符号 θ 表示。

有两个输入的感知机

感知机的运行原理只有这些!把上述内容用数学式来表示

权重越大,对应该权重的信号的重要性就越高 通过 信号就越大

2.2 简单逻辑电路

2.2.1 与门(A&&B必须同时为1才输出为1)

 2-2的真值表

满足 2-2 的条件的参数的选择方法有无数多个。比如,当 (w 1, w2, θ) = (0.5, 0.5, 0.7) 时,可以满足 2-2 的条件。

2.2.2 或门(或 A || B,有一个为1输出为1)

的真值表

2.2.3 与非门    !(A&&B)

 真值表

要表示与非门,可以用(w 1, w2, θ) = (0.5, 0.5, 0 .7)这样的组合(其 他的组合也是无限存在的)。实际上,只要把实现与门的参数值的符号取反, 就可以实现与非门。

2.3 感知机的实现

2.3.1 简单的实现
def AND(x1, x2):
   w1, w2, theta = 0.5, 0.5, 0.7
   tmp = x1*w1 + x2*w2
   if tmp <= theta:
     return 0
   elif tmp > theta:
     return 1
print("---真值表---")
print("X1是{1},  X2是{1},  y是{2}".format(1,1,AND(1, 1)))
print("X1是{1},  X2是{0},  y是{2}".format(1,0,AND(1, 0)))
print("X1是{0},  X2是{1},  y是{2}".format(0,1,AND(0, 1)))
print("X1是{0},  X2是{0},  y是{2}".format(0,0,AND(0, 0)))

果然和我们预想的输出一样!这样我们就实现了与门。按照同样的步骤,也可以实现与非门和或门,不过让我们来对它们的实现稍作修改。

2.3.2 导入权重和偏置

b 称为 偏置 w1w2 称为 权重 感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于0 则输出 1 ,否则输出 0。 w1w2是控制输入信号的重要性的参数,而偏置是调
整神经元被激活的容易程度(输出信号为1的程度)的参数。
import numpy as np
x = np.array([0, 1]) # 输入
w = np.array([0.5, 0.5]) # 权重
b = -0.7 # 偏置
print("w*x={0}".format(w*x))
print("------")
print("w1*x1+w2*x2={0}".format(np.sum(w*x)))
print("------")
print("w1*x1+w2*x2+ b={0}".format(np.sum(w*x) + b))
2.3.3 使用权重和偏置的实现
# coding: utf-8
import numpy as np
def AND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = AND(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))
# coding: utf-8
import numpy as np
def NAND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([-0.5, -0.5])
    b = 0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = NAND(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

# coding: utf-8
import numpy as np
def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.2
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = OR(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

2.4 感知机的局限性

2.4.1  异或门

两个输入不同–>输出1, 输入相同–>输出0

 实际上,用前面介绍的感知机是无法实现这个异或门的。感知机的局限性就在于它只能表示由一条直线分割的空间。弯曲的曲线无法用感知机表示。


2.5 多层感知机

2.5.1  已有门电路的组合

异或门可以通过图 所示的配置来实现。这里, x 1 x 2 表示输入信号, y 表示输出信号。 x 1 x 2 是与非门和或门的输入,而与非门和或门的输出则 是与门的输入。
# coding: utf-8
def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = XOR(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卿云阁

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

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

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

打赏作者

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

抵扣说明:

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

余额充值