感知器
为了理解神经网络,我们应该先理解神经网络的组成单元——神经元。神经元也叫做感知器。感知器算法在上个世纪50-70年代很流行,也成功解决了很多问题。并且,感知器算法也是非常简单的。
- 感知器的结构图
可以看到感知器的结构有如下几个组成部分:
输入权值,一个感知器可以接收多个输入,每个输入上有一个权值,此外还有一个偏置项。
激活函数
输出
感知器不仅仅能实现简单的布尔运算。它可以拟合任何的线性函数,任何线性分类或线性回归问题都可以用感知器来解决。然而,感知器却不能实现异或运算。
感知器算法这里就不单独记录了,比较简单,随机梯度下降会单独写一次。
wi←wi+Δwi
b←b+Δb
其中
Δwi=η(t−y)xi
Δb=η(t−y)
- 用感知器实现一个and运算
#from functools import reduce
#import operator
class Perceptron:
def __init__(self,input_num,activator):
self.activator = activator
self.input_num = input_num
self.weights = [0.0 for _ in range(input_num)]
self.bias = 0.0
def __str__(self):
return 'weights\t:%s\nbias\t:%f\n' %(self.weights,self.bias)
def list_and_list(self,input_vec,weights):
list1 = [ x * y for x,y in zip(input_vec,weights)]
return list1
def list_to_sum(self,list):
list_sum = 0
for i in list:
list_sum += i
return list_sum
def predict(self,input_vec):
return self.activator(self.list_to_sum(self.list_and_list(input_vec,self.weights)) + self.bias)
def train(self,input_vecs,labels,iteration,rate):
for i in range(iteration):
self._one_iteration(input_vecs,labels,rate)
def _one_iteration(self,input_vecs,lables,rate):
samples = zip(input_vecs,lables)
for (input_vec,label) in samples:
output =self.predict(input_vec)
self._update_weights(input_vec,output,label,rate)
def _update_weights(self,input_vec,output,label,rate):
delta = label - output
self.weights = [w + rate * delta * x for x,w in zip(input_vec,self.weights)]
self.bias += rate * delta
这里感知器的结构已经构造好了。下面就进行and运算
def f(x):
return 1 if x > 0 else 0
def get_training_dataset():
input_vecs = [[1,1],[0,0],[0,1],[1,0]]
labels = [1,0,0,0]
return input_vecs,labels
def train_and_perceptron():
p = Perceptron(2,f)
input_vecs,labels = get_training_dataset()
p.train(input_vecs,labels,10,0.1)
return p
if __name__ == '__main__':
and_perceptron = train_and_perceptron()
print(and_perceptron)
print('1 and 1 = %d' % and_perceptron.predict([1, 1]))
print('0 and 0 = %d' % and_perceptron.predict([0, 0]))
print('1 and 0 = %d' % and_perceptron.predict([1, 0]))
print('0 and 1 = %d' % and_perceptron.predict([0, 1]))
运行结果如下:
weights :[0.2, 0.1]
bias :-0.200000
1 and 1 = 1
0 and 0 = 0
1 and 0 = 0
0 and 1 = 0