今天看了一篇文章,写了里面的代码,发现有点疑惑的地方,上网查找资料,现在弄懂了,特此记录一下
感知器
def predict(self, input_vec):
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
)
感知器的过程
上面的代码其实就是这个过程:1*w0+x1*w1+x2*w2+xn*wn——w*x,也就是输入x权重,再传递到激励函数里,大概就这样
下面来剖析这段代码
重点解析这段代码
要想看懂这段代码就要对reduce()、map()、lambda有所理解
reduce()
reduce(function, sequence, initial=None)第一个参数是功能函数,第二个我理解是迭代器
def func(a, b):
return a+b
list = [1, 2, 3, 4, 5]
result = reduce(func, list) #15, 过程是((((1+2)+3)+4)+5)
def func1(a, b):
return a*b
result = reduce(func, list) #120, 过程是((((1*2)*3)*4)*5)
也可以用lambda
result = reduce(lambda a, b:a+b, list) #15
lambda的例子
x = lambda a: a+10
print(x(5)) #15
x = lambda a, b : a*b
print(x(5, 6)) #30
map()
map(func, *iterables),跟reduce()基本一样,不过最后返回的也是一个迭代器
list = [1, 2, 3]
def func(x):
return x*x
map(func, list) #[1, 4, 9]
map(lambda x: x*x, list) #[1, 4, 9]
如果看懂了这三个功能,那这段函数就基本能看懂了
还要提醒一点,文章中的代码是这样的
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求和
return self.activator(
reduce(lambda a, b: a + b,
map(lambda (x, w): x * w,
zip(input_vec, self.weights))
, 0.0) + self.bias)
map()那里,在python3中好像是不能把元祖传进一个元祖里,所以就改成把zip()组合成的一个元祖传进一个形参上述的就是x_w,然后x_w[0]就表示元祖第一个参数,x_w[1]表示元祖第二个参数,这样就能运行了