当前位置:   article > 正文

神经网络——Python实现Hopfield神经网络算法(理论+例子+程序)_python神经算法

python神经算法

一、Hopfield神经网

霍普菲尔德神经网络(Hopfield neural network)是一种循环神经网络,由约翰·霍普菲尔德在1982年发明。Hopfield网络是一种结合存储系统和二元系统的神经网络。它保证了向局部极小的收敛,但收敛到错误的局部极小值(local minimum),而非全局极小(global minimum)的情况也可能发生。霍普菲尔德网络也提供了模拟人类记忆的模型。[1]

65f8c71b3ab24634bda819f47d63023f.jpeg

 

使用下述公式更新霍普菲尔德中节点的值:

f4f4a024b5044baab631e5edc6e760ae.png

公式中:

wji是节点j到节点i的权重。
si 节点i的值(状态s)。
θi节点i的阈值,常为0。
霍普菲尔德的更新有两种方式:

异步: 每个更新一个节点。此节点可以是随机选中的,也可是按照预设顺序选中的。
同步: 同时更新所有节点的状态。这种更新方式要求系统中具有中央时钟以便维持同步。这种方式被认为是不太现实的,因为在生物或物理系统中常常没有中央时钟(用于保持同步状态,即各个节点常常是自行其是的。)

Hopfield 网络的基本特点
1. 只有单层
2. 神经元节点之间是全连接的
3. 只有输入,没有输出

 二、Python实现Hopfield神经网络算法

 1、 对于两个记忆模式(1, 1, 1, 1)和(-1, -1, -1, -1)(这是一个记忆模式向量非正交的例子),设计网络权值?

 运行结果如下图:

80f753bc03c941fc92b91e542f01c604.png

 

  1. import numpy as np
  2. import numpy.matlib
  3. import random
  4. X=np.array([[1,1,1,1,1,1,1,1,1,-1,1,1],[1,1,1,1,-1,-1,-1,-1,-1,1,1,1]])#前四个和后四个为伪吸引子,为了满足P<0.25n的关系,整体两组模式正交
  5. def makematrix(m, n, fill=0.0):
  6. a = []
  7. for i in range(m):
  8. a.append([fill]*n)
  9. return np.array(a)
  10. #X=makematrix(4,2)
  11. #X=[[1,1,1,1],[-1,-1,-1,-1]]
  12. class Hopfield:
  13. def __init__(self, num_in):
  14. self.num_in=num_in
  15. self.wight=makematrix(num_in, num_in)
  16. def determine_wight(self,inputs):
  17. for x in inputs:
  18. self.wight+=np.dot(x.reshape(-1,1),x.reshape(1,-1))
  19. return self.wight-self.wight[2][2]*numpy.matlib.identity(self.num_in)
  20. h=Hopfield(12)
  21. print("网络权值:\n",h.determine_wight(X))

2、现将(1, 1, 1, 1)、(-1, -1, -1, -1) 分别作为网络的输入, 判断其是否为网络的稳定状态?如将(1, 1, -1, 1)、 ……分别作为网络的输入, 计算其最终收敛的状态?

 运行结果如下图:

b744c52caede44c39c6abbf3d1d5a687.png

 

  1. import numpy as np
  2. import numpy.matlib
  3. import random
  4. X=np.array([[1,1,1,1,1,1,1,1,1,-1,1,1],[1,1,1,1,-1,-1,-1,-1,-1,1,1,1]])#前四个和后四个为伪吸引子,为了满足P<0.25n的关系,整体两组模式正交
  5. def makematrix(m, n, fill=0.0):
  6. a = []
  7. for i in range(m):
  8. a.append([fill]*n)
  9. return np.array(a)
  10. def sgn(v):
  11. if v>0:
  12. return 1
  13. else:
  14. return -1
  15. #X=makematrix(4,2)
  16. #X=[[1,1,1,1],[-1,-1,-1,-1]]
  17. class Hopfield:
  18. def __init__(self, num_in,num_p): #输入维数、模式样本数
  19. self.num_in=num_in
  20. self.num_p=num_p
  21. self.wight=makematrix(num_in, num_in)
  22. self.t=numpy.matlib.rand(self.num_in,1)#误差
  23. def determine_wight(self,inputs):
  24. for x in inputs:
  25. self.wight+=np.dot(x.reshape(-1,1),x.reshape(1,-1))
  26. self.wight=self.wight-self.wight[2][2]*numpy.matlib.identity(self.num_in)
  27. return self.wight
  28. def fun(self,inputs):
  29. net=np.dot(self.wight,inputs.T)-self.t
  30. return np.sign(net.T)
  31. def train(self,inputs,item=100):
  32. temp=inputs
  33. for i in range(item):
  34. temp=self.fun(temp)
  35. #print(temp)
  36. return temp
  37. def test(self,t):
  38. return self.fun(t)
  39. t=np.array([[1,1,1,1,1,1,1,1,1,-1,1,1],[1,1,1,1,-1,-1,-1,-1,1,-1,1,1]])
  40. t1=np.array([[1,1,1,1,
  41. 1,1,-1,1,
  42. 1,-1,1,1],
  43. [1,1,1,1,
  44. -1,1,1,1,
  45. 1,-1,1,1],
  46. [1,1,1,1,
  47. 1,-1,-1,1,
  48. 1,-1,1,1]])#伪吸引子的部分不是随机生成的[1,1,-1,1],[1,-1,-1,1][-1,1,1,1][1,1,1,-1]...
  49. h=Hopfield(12,2)
  50. print("网络权值:\n",h.determine_wight(X))
  51. print("训练\n",h.train(X)[:,4:8])
  52. a1=h.train(t)
  53. print("现将(1, 1, 1, 1)、(-1, -1, -1, -1) \n分别作为网络的输入的输出:\n",a1[:,4:8])
  54. a2=h.train(t1)
  55. print("测试2:\n",a2[:,4:8])

来源:小凌のBlog—Good Times|一个不咋地的博客

[1]  维基百科

  *   写的比较谁便代码有问题还请谅解!

 

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

闽ICP备14008679号