动手实现感知器
Posted ratels
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动手实现感知器相关的知识,希望对你有一定的参考价值。
样例程序:
from functools import reduce class 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) def predict(self, 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求和 print("predict") print(input_vec) print(self.weights) print(zip(input_vec, self.weights)) return self.activator( reduce(lambda a, b: a + b, map(lambda x_w: x_w[0] * x_w[1], 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) print("_one_iteration") print(input_vecs) print(labels) samples = zip(input_vecs, labels) print(samples) # 对每个样本,按照感知器规则更新权重 for (input_vec, label) in samples: # 计算感知器在当前权重下的输出 print(input_vec) 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 #print("_update_weights") #print(input_vec) #print(self.weights) #print(rate) #print(delta) #for each in zip(input_vec, self.weights) #print(each) #for a,b in zip(input_vec, self.weights): #print(‘a: %f‘ % a) #print(‘b: %f‘ % b) self.weights = [w + rate * delta * x for x,w in zip(input_vec, self.weights)] # 更新bias self.bias += rate * delta
继续:
def f(x): ‘‘‘ 定义激活函数f ‘‘‘ return 1 if x > 0 else 0 def 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]))
自己实现的部分:
class Perceptron(object):#8 def __init__(self):#9 self.w = [0,0] self.b = [0] def get(self):#10 return self.w,self.b def getw(self):#13 return self.w def getb(self):#14 return self.b def setw(self,x):#15 self.w = x def setb(self,x):#16 self.b[0] = x def activator(self,x):#12 if x>0: return 1 else: return 0 def predict(self,x):#11 results = self.activator(self.w[0]*x[0]+self.w[1]*x[1]+self.b[0]) return results
继续:
def produce():#2 #inputs=([0,0],[0,1],[1,0],[1,1]) #labels=(0,0,0,1) inputs=[[1,1],[0,0],[0,1],[1,0],[1,1]] labels=[1,0,0,0,1] print(inputs) print(labels) return inputs,labels ‘‘‘ def init():#3 w = [0,0] b = [0] print(w) print(b) return w,b ‘‘‘ def deprecated():#4 inputs,labels = produce() w,b = init() #results = map(lambda x: w*x,inputs) ‘‘‘ print(inputs) print(w) for each in zip(inputs,w) print(each[0]) print(each[1]) results = map(lambda x: x[0]*x[1],zip(inputs,w)) print(results) ‘‘‘ #print([0,1]*[1,1]) ‘‘‘ def activator(x):#5 if x>0: return x else: return 0 ‘‘‘ ‘‘‘ def predict():#6 inputs,labels = produce() w,b = init() results = [] for each in inputs: #print(type(w[0])) #print(type(each[0])) results.append(activator(w[0]*each[0]+w[1]*each[1]+b[0])) #print(results) return results ‘‘‘ ‘‘‘ def predict(x):#7 w,b = init() return results = activator(w[0]*x[0]+w[1]*x[1]+b[0]) ‘‘‘ def one_iteration(inputs,p):#17 for i in range(len(inputs)): #print(inputs[i]) #print("labels: %d" % labels[i]) delta = labels[i]-p.predict(inputs[i]) delta_w = map(lambda x: 0.1 * delta * x, inputs[i]) #0.1 * delta * inputs[i] delta_b = 0.1 * delta #print(list(delta_w)) delta_w = list(delta_w) #print(delta_b) #delta_b = delta_b[0]#list(delta_b) w_tmp=[] w_tmp.append(p.getw()[0]+delta_w[0]) w_tmp.append(p.getw()[1]+delta_w[1]) p.setw(w_tmp) p.setb(p.getb()[0]+delta_b) def train(inputs,p,epoch):#18 for i in range(epoch): one_iteration(inputs,p) #print("iteration:%d" % i) #print(p.getw()) #print("b:%f" % p.getb()[0]) if __name__ == ‘__main__‘:#1 #results = predict() inputs,labels = produce() p = Perceptron() epoch = 1 train(inputs,p,epoch) #print(p.getw()) #print(p.getb()) print("1 and 1 :%d" % p.predict([1,1])) #delta = map(lambda x:x[1]-x[0],zip(results,labels)) #print(list(delta))
输出:
[[1, 1], [0, 0], [0, 1], [1, 0], [1, 1]] [1, 0, 0, 0, 1] 1 and 1 :1
参考:
https://www.cnblogs.com/ratels/p/11427328.html
以上是关于动手实现感知器的主要内容,如果未能解决你的问题,请参考以下文章
如何设置 vscode 的代码片段,以便在自动完成后自动触发 vscode 的智能感知?