感知器是神经网络中的概念,是一个接受数个输入,经过内部计算后得到输出的模型,其模拟的是自然界的神经细胞:接受输入信号的刺激,达到一定阈值后细胞体表现为激发,否则为抑制。
单层感知器
单层感知器最为简单,只有输入层和输出层,其计算规则为:激发值为输入与权值的点积,若激发值大于某阈值则输出1以代表激发,否则输出-1代表抑制。
python代码演示该模型:
class slp(object):
def __init__(self,num):
self.w = [0.0]*num
self.input = [0.0]*num
self.output = 0
def input(self,ilist):
if len(ilist) == len(self.input):
self.input = ilist
else:
print 'length error'
def calcu_result(self):
iszie = len(self.input)
res = sum([self.w[i]*self.input[i] for i in range(isize)])
if res > 0:
self.output = 1
else:
self.output = -1
这里简便起见以0为阈值。
单层感知器可以实现简单逻辑的判断,但要求数据是线性可分的。对线性可分这个条件要求的原因在于其计算输出的方法:
output=∑wi∗input(i)
。
要实现对线性不可分数据的分类,需要使用多层感知器。
多层感知器
多层感知器与单层感知器相比,多了一层隐藏层,隐藏层对于输入和输出都是透明的。
def mlp(object):
def __init__(self,num):
self.in_floor = [slp(num)]*num
self.hide_floor = [slp(num)]*num
self.w = [0.0]*num
self.output = 0
def input(self,ilist):
if len(ilist) == len(self.in_floor):
for item in self.in_floor:
item.input(ilist)
else:
print 'length error'
def calcu_result(self):
in_for_hide = []
for item in self.in_floor:
item.calcu_result()
in_for_hide.append(item.output)
for item in self.hide_floor:
item.input(in_for_hide)
item.calcu_result()
iszie = len(self.hide_floor)
res = sum([self.w[i]*self.hide_floor[i].output for i in range(isize)])
if res > 0:
self.output = 1
else:
self.output = -1
可以看出,多层感知器是对单层感知器的扩展,输入层到隐藏层就是多个单层感知器的组合,隐藏层各个节点的输出又作为输入,组合为输出层的输出。
注1:代码中暂时未考虑权值的分配,权值的分配需要训练算法。
注2:在代码中以列表形式将输入存入对象中,多层感知器中这样做是低效的,会有大量的输入数据冗余。
参考资料:
http://blog.csdn.net/stan1989/article/details/8565499
http://blog.csdn.net/xiaowei_cqu/article/details/9004331