感知器

感知器
真的好像自控中的负反馈
程序不要随便删除

from functools import reduce  
#python 3 在Python 3里,reduce()函数已经被        
#从全局名字空间里移除了,它现在被放置在
#fucntools模块里 用的话要 先引入:                  
class Perceptron(object):
    def __init__(self, input_num, activator):               #初始化函数
        self.activator = activator
        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 predict(self,input_vec):               #这一步与连接中程序有所不同
        L=[i*j for i,j  in zip(input_vec,self.weights)]
        return self.activator(reduce
                      (lambda a, b: a + b, L, 0.0) + 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, labels, rate):
        samples = zip(input_vecs, labels)       
        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 =[j + rate * delta * i for i,j in  zip(input_vec,self.weights)]  
        self.bias += rate * delta
    #这里同样也有map 和 zip 的问题


def f(x):
    return 1 if x>0 else 0


def get_training_dataset():
    input_vecs = [[1,1], [0,0], [1,0], [0,1]]
    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__':
    example = train_and_perceptron()
    print (example)
    print ('1 and 1 = %d' % example.predict([1, 1]))
    print ('1 and 0 = %d' % example.predict([1, 0]))
    print ('0 and 0 = %d' % example.predict([0, 0]))
    print ('0 and 1 = %d' % example.predict([0, 1]))

在连接中 return self.activator(reduce(lambda a, b: a + b, map(lambda (x, w): x * w,
zip(input_vec, self.weights)), 0.0) + self.bias)
这里就是y = f(w * x +b) 但是在python3中,zip 和 map返回的是对象 而非列表,支持迭代

你可能感兴趣的:(感知器)