Guest User

Untitled

a guest
Oct 21st, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.93 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import math
  4. import numpy
  5.  
  6. def sigmoid(x):
  7. """вроде как лучше чем 1/(1+e^-x)"""
  8. return math.tanh(x)
  9.  
  10.  
  11. def dsigmoid(y):
  12. """лучше чем y*(1.-y)"""
  13. return 1. - y ** 2
  14.  
  15.  
  16. class NN:
  17. def __init__(self, ni, nh, no):
  18. """
  19. ni - кол-во входоов
  20. nh - кол-во нейронов в скрытном слое
  21. no - кол-во выходов
  22. """
  23. self.ni = ni + 1 # +1 смещения
  24. self.nh = nh + 1 # +1 смещения
  25. self.no = no
  26.  
  27. # входы
  28. self.ai = numpy.ones(self.ni)
  29. self.ah = numpy.ones(self.nh)
  30. self.ao = numpy.ones(self.no)
  31.  
  32. # генерим веса
  33. self.wi = numpy.random.random((self.ni, self.nh)) - 0.5
  34. self.wo = numpy.random.random((self.nh, self.no)) - 0.5
  35.  
  36.  
  37. # дельты изменения весов
  38. self.ci = numpy.zeros((self.ni, self.nh))
  39. self.co = numpy.zeros((self.nh, self.no))
  40.  
  41.  
  42. def update(self, inputs):
  43. if len(inputs) != self.ni - 1:
  44. raise ValueError, 'wrong number of inputs'
  45.  
  46. # задаем вход
  47. for i in range(self.ni - 1):
  48. self.ai[i] = inputs[i]
  49.  
  50. # считаем выходы в скрытном слое
  51. for j in range(self.nh - 1):
  52. total = 0.0
  53. for i in range(self.ni):
  54. total += self.ai[i] * self.wi[i][j]
  55. self.ah[j] = sigmoid(total)
  56.  
  57. # считаем значение выходного слоя
  58. for k in range(self.no):
  59. total = 0.0
  60. for j in range(self.nh):
  61. total += self.ah[j] * self.wo[j][k]
  62. self.ao[k] = total
  63.  
  64. return self.ao[:]
  65.  
  66.  
  67. def backpropagate(self, targets, N, M):
  68. "обратное распр. ошибки"
  69. if len(targets) != self.no:
  70. raise ValueError, 'wrong number of target values'
  71.  
  72. # считаем ошибку на выходе
  73. output_deltas = numpy.zeros(self.no)
  74. for k in range(self.no):
  75. output_deltas[k] = targets[k] - self.ao[k]
  76.  
  77.  
  78. # считаем ошибки для скрытого слоя
  79. hidden_deltas = numpy.zeros(self.nh)
  80. for j in range(self.nh):
  81. error = 0.0
  82. for k in range(self.no):
  83. error += output_deltas[k] * self.wo[j][k]
  84. hidden_deltas[j] = dsigmoid(self.ah[j]) * error
  85.  
  86. # обновляем выходные веса
  87. for j in range(self.nh):
  88. for k in range(self.no):
  89. change = output_deltas[k] * self.ah[j]
  90. self.wo[j][k] = self.wo[j][k] + N * change + M * self.co[j][k]
  91. self.co[j][k] = change
  92.  
  93. # обновляем входные веса
  94. for i in range(self.ni):
  95. for j in range(self.nh):
  96. change = hidden_deltas[j] * self.ai[i]
  97. self.wi[i][j] = self.wi[i][j] + N * change + M * self.ci[i][j]
  98. self.ci[i][j] = change
  99.  
  100. # считаем ошибку
  101. error = 0.0
  102. for k in range(len(targets)):
  103. error += 0.5 * ((targets[k] - self.ao[k]) ** 2)
  104. return error
  105.  
  106.  
  107. def test(self, patterns):
  108. tmp = []
  109. for p in patterns:
  110. # print p[0], ':', p[1], '->', self.update(p[0])
  111. print self.update(p[0])[0]
  112. tmp.append(self.update(p[0]))
  113.  
  114. return tmp
  115.  
  116. def train(self, patterns, iterations=1000, N=0.05, M=0.1):
  117. """N-скорость движения
  118. M - сглаживающий коэф"""
  119. for i in xrange(iterations):
  120. error = 0.0
  121. for p in patterns:
  122. self.update(p[0])
  123. tmp = self.backpropagate(p[1], N, M)
  124. error += tmp
  125.  
  126. if i % 100 == 0:
  127. print '%i: error %-14f' % (i, error)
  128. else:
  129. print '%i: error %-14f' % (i, error)
  130.  
  131.  
  132. def demo():
  133. pat = [
  134. [[-1, -1], [2]],
  135. [[-0.8, -1], [2.72]],
  136. [[-1, -0.8], [0.92]],
  137. [[-0.6, -0.5], [1.03]],
  138. [[-0.7, -0.6], [1.1]],
  139. [[-0.4, -0.5], [1.43]],
  140. [[-0.5, -0.3], [0.77]],
  141. [[-0.3, -0.2], [0.94]],
  142. [[-0.2, -0.1], [0.95]],
  143. [[-0.1, 0], [0.98]],
  144. [[0, 0], [1]],
  145. [[0.1, 0], [0.98]],
  146. [[0.1, 0.2], [1.1]],
  147. [[0.2, 0.4], [1.4]],
  148. [[0.4, 0.6], [1.76]],
  149. [[0.6, 0.6], [1.36]],
  150. [[0.6, 0.7], [1.75]],
  151. [[0.7, 0.8], [1.94]],
  152. [[0.9, 1.], [2.38]],
  153. [[1., 1.], [2.]]
  154. ]
  155.  
  156.  
  157. #создаем персептерон с 2 входами, 2 скрыт. слоями и 1 выходом
  158. n = NN(2, 2, 1)
  159. n.train(pat)
  160. print "Проверка на выборке"
  161. n.test(pat)
  162. print "Тестовые примеры"
  163. n.test([
  164. ([0.15, 0.15], [1.0225]),
  165. ([-0.25, -0.25], [1.0625])
  166. ])
  167.  
  168.  
  169. if __name__ == '__main__':
  170. demo()
Add Comment
Please, Sign In to add comment