目标
感知机类似一个函数,接收多个输入,形成一个输出。接收的每个输入,会为其赋予不同的权重w,再将它们累加,与感知机的阈值theta比较。若小于等于阈值,则输出0;大于则输出1。
特点
一个感知机,实际上类似于“变色龙”的角色。控制其参数的构成,就可以得到多种逻辑门。“统一构造”,使得原始问题转变为了确定参数问题。在形成多种逻辑门的时候,是我们人自行设计参数,来完成我们的需求。
而机器学习,就是将这个决定参数的工作交给机器来完成。通过学习来确定合适的参数。我们需要做的就是思考构造(模型),并给计算机训练数据。
Python简单实现
引例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
def AND(x1,x2):
w1,w2,theta=0.5,0.5,0.7
tmp=x1*w1+x2*w2-theta
if tmp<=0:
return 0
else:
return 1
|
1 2 3 4 5 6 7 8 9 10 11
|
print(AND(0,0))
print(AND(1,0))
print(AND(0,1))
print(AND(1,1))
|
0
0
0
1
使用NumPy完成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
import numpy as np
x=np.array([0,1])
w=np.array([0.5,0.5])
b=-0.7
print(" w * x = "+str(w*x))
print("np.sum = "+str(np.sum(w*x)))
print("np.sum + b = "+str(np.sum(w*x) + b))
|
w * x = [0. 0.5]
np.sum = 0.5
np.sum + b = -0.19999999999999996
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
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
|
多层感知机
XOR 逻辑门,则无法由感知机实现。
因为感知机只能形成一条直线,即将空间分成线性空间。而XOR需要非线性空间,即用曲线分割。
故使用多层感知机来完成。
实现XOR
1 2 3 4 5 6 7 8 9 10 11 12 13
|
def XOR(x1,x2):
s1=NAND(x1,x2)
s2=OR(x1,x2)
y=AND(s1,s2)
return y
|
1 2 3 4 5 6 7 8 9 10 11
|
print("xor(0,0) : "+str(XOR(0,0)))
print("xor(0,1) : "+str(XOR(0,1)))
print("xor(1,0) : "+str(XOR(1,0)))
print("xor(1,1) : "+str(XOR(1,1)))
|
xor(0,0) : 0
xor(0,1) : 1
xor(1,0) : 1
xor(1,1) : 0
总结
感知机即接收多个输入,形成一个输出
不同感知机仅参数不同,其余完全一致
单个感知机仅可完成线性分割,即实现AND,NAND,OR
通过对感知机进行组合,即可实现非线性分隔,即完成复杂的函数,类似于XOR。
实际上,多层感知机足以构建起一个计算机