感知机

来源:互联网 发布:举牌制作软件 编辑:程序博客网 时间:2024/05/01 11:37

https://www.zybuluo.com/hanbingtao/note/433855

感知机



训练感知机


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):        return self.activator(            reduce(lambda a, b: a + b,                   map(lambda (x, w): x * w,                       zip(input_vec, self.weights)),                   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 = map(            lambda (x, w): w + rate * delta * x,            zip(input_vec, self.weights))        self.bias += rate * delta        def f(x):        return 1 if x > 0 else 0def get_training_dataset():        input_vecs = [[1, 1], [0, 0], [1, 0], [0, 1]]        labels = [1, 0, 0, 0]        return input_vecs, labelsdef train_and_perceptron():        p = Perceptron(2, f)        input_vecs, labels = get_training_dataset()        p.train(input_vecs, labels, 10, 0.1)        return pif __name__ == '__main__':        and_perception = train_and_perceptron()        print and_perception        print '1 and 1 = %d' % and_perception.predict([1, 1])        print '0 and 0 = %d' % and_perception.predict([0, 0])        print '1 and 0 = %d' % and_perception.predict([1, 0])        print '0 and 1 = %d' % and_perception.predict([0, 1])

输出:

weights:[0.1, 0.2]bias:-0.2000001 and 1 = 10 and 0 = 01 and 0 = 00 and 1 = 0


#coding=utf-8class Perceptron(object):    def __init__(self, input_num, activator):        '''        初始化感知器,设置输入参数的个数,以及激活函数。        激活函数的类型为double -> double        '''#初始化激活函数        self.activator = activator        # 权重向量初始化为0        self.weights = [0.0 for _ in range(input_num)]        # 偏置项初始化为0        self.bias = 0.0#类对象的打印字符串表示方式    def __str__(self):        '''        打印学习到的权重、偏置项        '''        return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)#感知机输出y=f(wx+b)    def predict(self, input_vec):        '''        输入向量,输出感知器的计算结果        '''#输入向量input_vec        # 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]打包在一起        # 变成[(x1,w1),(x2,w2),(x3,w3),...]        # 然后利用map函数计算[x1*w1, x2*w2, x3*w3]        # 最后利用reduce求和        return self.activator(            reduce(lambda a, b: a + b,                   map(lambda (x, w): x * w,                         zip(input_vec, self.weights))                , 0.0) + self.bias)    def train(self, input_vecs, labels, iteration, rate):        '''        输入训练数据:一组向量、与每个向量对应的label;以及训练轮数、学习率        '''        for i in range(iteration):            self._one_iteration(input_vecs, labels, rate)    def _one_iteration(self, input_vecs, labels, rate):        '''        一次迭代,把所有的训练数据过一遍        '''        # 把输入和输出打包在一起,成为样本的列表[(input_vec, label), ...]        # 而每个训练样本是(input_vec, label)        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):        '''        按照感知器规则更新权重        '''        # 把input_vec[x1,x2,x3,...]和weights[w1,w2,w3,...]打包在一起        # 变成[(x1,w1),(x2,w2),(x3,w3),...]        # 然后利用感知器规则更新权重        delta = label - output        self.weights = map(            lambda (x, w): w + rate * delta * x,            zip(input_vec, self.weights))        # 更新bias        self.bias += rate * delta接下来,我们利用这个感知器类去实现and函数。def f(x):    '''    定义激活函数f    '''    return 1 if x > 0 else 0def get_training_dataset():    '''    基于and真值表构建训练数据    '''    # 构建训练数据    # 输入向量列表    input_vecs = [[1,1], [0,0], [1,0], [0,1]]    # 期望的输出列表,注意要与输入一一对应    # [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0    labels = [1, 0, 0, 0]    return input_vecs, labels    def train_and_perceptron():    '''    使用and真值表训练感知器    '''    # 创建感知器,输入参数个数为2(因为and是二元函数),激活函数为f    p = Perceptron(2, f)    # 训练,迭代10轮, 学习速率为0.1    input_vecs, labels = get_training_dataset()    p.train(input_vecs, labels, 10, 0.1)    #返回训练好的感知器    return p#当直接运行该模块时执行下面的代码if __name__ == '__main__':     # 训练and感知器    and_perception = train_and_perceptron()    # 打印训练获得的权重    print and_perception    # 测试    print '1 and 1 = %d' % and_perception.predict([1, 1])    print '0 and 0 = %d' % and_perception.predict([0, 0])    print '1 and 0 = %d' % and_perception.predict([1, 0])    print '0 and 1 = %d' % and_perception.predict([0, 1])






0 0
原创粉丝点击