2-实现感知机
用Python来实现刚才的逻辑电路。
实现与门
先定义一个接收 参数x1和x2的AND(与门)函数。
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
#在函数内初始化参数w1、w2、theta,当输入的加权总和超过阈值时返回1, 否则返回0
AND(0, 0) # 输出0
AND(1, 0) # 输出0
AND(0, 1) # 输出0
AND(1, 1) # 输出1
果然和我们预想的输出一样!这样我们就实现了与门。
按照同样的步骤,也可以实现与非门和或门,不过让我们来对它们的实现稍作修改。
导入权重和偏置
把阈值θ换成−b,于是就可以用下面的式子来表示感知机的行为:
y
=
{
0
(
b
+
ω
1
x
1
+
ω
2
x
2
≤
0
)
1
(
b
+
ω
1
x
1
+
ω
2
x
2
>
0
)
y=\begin{cases} 0&(b+ω_1x_1+ω_2x_2\leq0)\\ 1&(b+\omega_1x_1+\omega_2x_2>0) \end{cases}
y={01(b+ω1x1+ω2x2≤0)(b+ω1x1+ω2x2>0)
-
此处,b称为
偏置
, ω 1 \omega_1 ω1和 ω 2 \omega_2 ω2 称为权重。(注:偏置的相反数为阈值) -
感知机计算输入信号和权重的乘积,然后加上偏置,如果这个值大于0则输出1,否则输出0
-
偏置和权重的作用是不 一样的。
-
权重是控制输入信号的重要性的参数; 而偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数。
-
比如,若b为 −0.1,则只要输入信号的加权总和超过0.1,神经元就会被激活。但是如果b 为−20.0,则输入信号的加权总和必须超过20.0,神经元才会被激活。像这样, 偏置的值决定了神经元被激活的容易程度
注意:有时根据上下文,也会将b、w1、w2这些参数统称为权重。
-
接下来使用NumPy按这条公式实现感知机。在这个过程中,用Python的解释器逐一确认结果。
>>> import numpy as np
>>> x = np.array([0, 1]) # 输入
>>> w = np.array([0.5, 0.5]) # 权重
>>> b = -0.7 # 偏置
>>> w * x
array([ 0. , 0.5])
>>> np.sum(w * x)
0.5
>>> np.sum(w*x) + b
-0.19999999999999996 # 大约为-0.2(由浮点小数造成的运算误差)
使用权重和偏置的实现
实现与门:
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
实现与非门:
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) # 仅权重和偏置与AND不同!
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
或门:
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5]) # 仅权重和偏置与AND不同!
b = -0.2
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
因为与门、与非门、或门是具有相同构造的感知机,区别只在于权重参数的值。
因此,在与非门和或门的实现中,仅设置权重和偏置的值这一点和与门的实现不同。
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/p/15383616.html