当前位置:   article > 正文

代码实现逻辑与、或的感知器_感知机逻辑关系代码怎么写

感知机逻辑关系代码怎么写

感知器(有些成为感知机)属于一种简单的神经元,在神经网络中通常感知机与神经元的区别就是激活函数的不同,一般常用的激活函数是sigmoid函数,感知机中为step function(阶跃函数

给出一组矩阵,利用神经网络的反向传播功能(BP)来训练一种能够实现逻辑与、或的感知器(最重要的是训练权重w和偏置b)

  1. import numpy as np
  2. samples_and = [
  3. [0, 0, 0],
  4. [1, 0, 0],
  5. [0, 1, 0],
  6. [1, 1, 1],
  7. ]
  8. samples_or = [
  9. [0, 0, 0],
  10. [1, 0, 1],
  11. [0, 1, 1],
  12. [1, 1, 1],
  13. ]
  14. samples_xor = [
  15. [0, 0, 0],
  16. [1, 0, 1],
  17. [0, 1, 1],
  18. [1, 1, 0],
  19. ]
  20. def perception(samples):
  21. #权重
  22. w=np.array([1,2])
  23. #偏置
  24. b=0
  25. a=1
  26. #训练10
  27. for i in range(10):
  28. for j in range(4):
  29. #矩阵的第j行的前两个数值
  30. x=np.array(samples[j][:2])
  31. #将未激活的值输入sigmoid函数 dot:向量的点乘运算
  32. if np.dot(w,x)+b >0:
  33. y=1
  34. else:
  35. y=0
  36. #真实值
  37. d=np.array(samples[j][2])
  38. delta_b=a*(d-y)
  39. delta_w=a*(d-y)*x
  40. print('epoch {} sample [{} {} {} {} {} {} {}]'.format(
  41. i,j,w[0],w[1],b,y,delta_w[0],delta_w[1],delta_b
  42. ))
  43. #反向传播,更新权重
  44. w=w+delta_w
  45. b=b+delta_b
  46. if __name__=='__main__':
  47. print('logical and:')
  48. perception(samples_and)
  49. print('logical or:')
  50. perception(samples_or)
  51. print('logical xor:')
  52. perception(samples_xor)

 

逻辑与的输出

 

可以看出从第三次训练后,通过神经网络的BP,权重w0,w1和b已经趋于稳定

w0=1,w1=2,b=-2

 

逻辑或的输出

 

对于逻辑或,从输出样本的第一次训练之后,对权重和偏置的BP趋于稳定,

w0=1,w1=2,b=0

 

逻辑异或的输出

 

对于异或数据的训练,每一次反馈得到的w0,w1和b都不同,可以得出感知器不能实现异或的功能,也就是不能训练处得到实现异或功能的模型。

 

解释为什么这的代码法完成带异或功能的感知器

逻辑与和逻辑或都是线性的模型,它的输入和输出都是在一条直线上,这条直线将平面区域分割为两份,在直线的两端分别满足大于和小于0,在直线上满足等于0,也就是说它是线性的。

而逻辑异或它在平面区域中是两条交叉的直线,也就是说它是线性不可分的,如下图所示

 

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/486990
推荐阅读
相关标签
  

闽ICP备14008679号