我们手里有大量的x和y,求权重
训练的是权重
数据样本
x | W | Y |
---|---|---|
身高 | 0 | |
体重 | 0 | |
血型 | 0.3 | |
脚指头 | 0.8 |
一组x计算出对应的一个Y
计算过程是w
下面的图片就是最基础的公式
我们已知数据是大量的x和y
希望通过“西塔”来获得W
我们的学习才刚刚开始,首先需要理解的是与门
x1 | x2 | Y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 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
下面我们再来考虑一下与非门和或门
与非门
x1 | x2 | Y |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
或门
x1 | x2 | Y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
感知机的简单实现
了解上述的门电路之后,我们开始实现一个简单的感知机
刚才的与门代码知识一个基础部分,我们先对它们的实现稍作修改
这里用到了这个公式
import numpy as np
x = np.array([0,1])
w = np.array([0.5,0.5])
b = -0.7
print(np.sum(w*x))
print(np.sum(w*x)+b)
#0.5
#-0.19999999999999996
由此我们可以看出,当numpy的两个数组元素相同的时候,我们对他们进行相乘相加和(即—numpy.sum()方法)
再和b(偏置)相加,即可完成上述公式运算
然后我们再实现刚才的与门,这里我们先贴出第一次的与门
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
#0 0 0 1
然后是我们要实现的新的与门
import numpy as np
def AND(x1,x2):
w = np.array([0.5,0.5])
x = np.array([x1,x2])
b = -0.7
tmp = np.sum(w*x)+b
if tmp <= 0:
return 0
elif tmp > 0:
return 1
#0 0 0 1
具体的说,W1和W2 是控制输入信号重要性的参数,而偏置(b)是调整神经元被激活的容易程度(输出信号为1的程度)的参数。
接着,我们实现与非门和或门
import numpy as np
def NAND(x1,x2):
w = np.array([-0.5,-0.5])#仅权重和偏置改变了
x = np.array([x1,x2])
b = 0.7
tmp = np.sum(w*x)+b
if tmp <=0:
return 0
elif tmp >0:
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
# 1 1 1 0
# 0 1 1 1
与门、与非门、或门是具有相同构造的感知机,区别只在于权重参数的值。因此,在与非门 和或门的实现中,仅设置权重和偏置的值这一点和与门的实现不同。
异或门比较特殊
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y
# 0 1 1 0
但是有数字逻辑基础的话,应该不难理解