Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.45 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. Created on Sun Oct 21 18:15:05 2018
  5.  
  6. @author: dsu
  7. """
  8. import numpy as np
  9. import matplotlib.pyplot as plt
  10.  
  11.  
  12. class Dataset():
  13.  
  14. def __init__(self, data, dtype = np.float64):
  15. self._data = np.array(data, dtype = dtype)
  16. self._size = len(self._data)
  17. self._example_size = len(self._data[0])
  18. self._status = "pure"
  19. self._range = None
  20. self._expert = None
  21. self._percentage = None
  22. self._max_elems = None
  23. self._min_elems = None
  24. self._centers = None
  25.  
  26. def tune_up(self, expert = None, percentage = None):
  27. self._max_elems = np.zeros((self._example_size))
  28. self._min_elems = np.zeros((self._example_size))
  29. self._centers = np.zeros((self._example_size))
  30.  
  31. if expert:
  32. for i in range(self._example_size):
  33. if expert[i]:
  34. self._min_elems[i] = expert[i][0]
  35. self._min_elems[i] = expert[i][1]
  36. else:
  37. self._max_elems[i] = max(self._data[:,i])
  38. self._min_elems[i] = min(self._data[:,i])
  39.  
  40. else:
  41. for i in range(self._example_size):
  42. self._max_elems[i] = max(self._data[:,i])
  43. self._min_elems[i] = min(self._data[:,i])
  44.  
  45. if percentage:
  46. for i in range(self._example_size):
  47. if percentage[i]:
  48. self._max_elems[i] += percentage[i]*(self._max_elems[i]
  49. - self._min_elems[i])
  50.  
  51. self._min_elems[i] -= percentage[i]*(self._max_elems[i]
  52. - self._min_elems[i])
  53. else: continue
  54.  
  55. for i in range(self._example_size):
  56. self._centers[i] = (self._max_elems[i] + self._min_elems[i])/2
  57.  
  58.  
  59. def normalisation_linear(self, rng):
  60. if rng[0]:
  61. for i in range(self._size):
  62. for j in range(self._example_size):
  63. numerator = 2*(self._data[i][j] - self._min_elems[j])
  64. denominator = self._max_elems[j] - self._min_elems[j]
  65. self._data[i][j] = numerator/denominator - 1
  66.  
  67. else:
  68. for i in range(self._size):
  69. for j in range(self._example_size):
  70. numerator = self._data[i][j] - self._min_elems[j]
  71. denominator = self._max_elems[j] - self._min_elems[j]
  72. self._data[i][j] = numerator/denominator
  73.  
  74. def normalisation_nonlinear(self, rng, alfa):
  75. if rng[0]:
  76. for i in range(self._size):
  77. for j in range(self._example_size):
  78. degree = -alfa[j]*(self.data[i][j] - self._centers[j])
  79. self._data[i][j] = (np.exp(degree)-1)/(np.exp(degree)+1)
  80.  
  81. else:
  82. for i in range(self._size):
  83. for j in range(self._example_size):
  84. degree = -alfa[j]*(self.data[i][j] - self._centers[j])
  85. self._data[i][j] = 1/np.exp(degree) + 1
  86.  
  87. def denormalisation_linear(self, rng, example):
  88. out = np.zeroes((self._example_size))
  89. if rng[0]:
  90. for i in range(self._example_size):
  91. substraction = self._max_elems[i] - self._min_elems[i]
  92. out[i] = self._min_elems[i] + (example[i] + 1)*substraction/2
  93. else:
  94. for i in range(self._example_size):
  95. substraction = self._max_elems[i] - self._min_elems[i]
  96. out[i] = self._min_elems[i] + example[i]*substraction
  97.  
  98. def denormalisation_nonlinear(self, rng, alfa, example):
  99. out = np.zeroes((self._example_size))
  100. if rng[0]:
  101. for i in range(self._example_size):
  102. out[i] = self._centers[i] - (1/alfa[i])* np.log(1/example[i]-1)
  103. else:
  104. for i in range(self._example_size):
  105. temp = (1-self._centers[i])/(1+self._centers[i])
  106. out[i] = self._centers[i] - (1/alfa[i])* np.log(temp)
  107.  
  108. def get_status(self):
  109. return self._status
  110.  
  111. def example_size(self):
  112. return self._example_size
  113.  
  114. def __getitem__(self, key):
  115. return self._data[key]
  116.  
  117. def __len__(self):
  118. return self._size
  119.  
  120. def __iter__(self):
  121. return (example for example in self._data)
  122.  
  123.  
  124. class TanH:
  125. def __init__(self, alfa, t):
  126. self.alfa = alfa
  127. self.t = t
  128.  
  129. def __call__(self, state):
  130. return (np.exp(self.alfa*(state - self.t)) - 1)/(np.exp(self.alfa*(state - self.t)) + 1)
  131.  
  132. class Sigmoid:
  133. def __init__(self, alfa, t):
  134. self.alfa = alfa
  135. self.t = t
  136.  
  137. def __call__(self, state):
  138. return 1/(1 + np.exp(state*(-self.alfa)))
  139.  
  140. class Percep:
  141. def __init__(self, inputs_cnt, outs_cnt, activation_func):
  142. self.inputs_cnt = inputs_cnt
  143. self.outs_cnt = outs_cnt
  144. self.biases = np.random.rand(outs_cnt)
  145. self.weights = np.random.rand(inputs_cnt, outs_cnt)
  146. self.activation_func = activation_func
  147.  
  148. def predict(self,example):
  149. state = np.dot(example, self.weights) + self.biases
  150. out = self.activation_func(state)
  151. return out
  152.  
  153. def train(self, dataset, epoches_cnt, tr_speed):
  154.  
  155. x_train = dataset[0]
  156. y_train = dataset[1]
  157.  
  158. for i in range(epoches_cnt):
  159. for i in range(len(x_train)):
  160. y_calc = self.predict(x_train[i])
  161. deltas = y_train[i] - y_calc
  162. self.weights += tr_speed*deltas*np.array(x_train[i])[:,np.newaxis]
  163. self.biases += tr_speed*deltas
  164.  
  165. def RMSE(req_out,nn_out):
  166. summ = 0
  167.  
  168. for i in range(len(req_out)):
  169. summ += sum((req_out[i] - nn_out[i])**2)
  170.  
  171. a = len(req_out)*len(req_out[0])
  172.  
  173. return (summ/a)**(1/2)
  174.  
  175. y1 = lambda x1,x2: x1+x2
  176. y2 = lambda x1,x2,x3: x3 - 2*x1 + x2
  177.  
  178. CNT_EX = 200
  179. TR_PRC = 0.5
  180.  
  181. x = Dataset([[np.random.randint(-10,10), np.random.randint(-10,10),np.random.randint(-10,10)] for i in range(CNT_EX)])
  182. x.tune_up()
  183. x.normalisation_linear([-1,1])
  184. y = Dataset([[y1(x[i][0],x[i][1]), y2(x[i][0], x[i][1], x[i][2])] for i in range(CNT_EX)])
  185. y.tune_up()
  186. y.normalisation_linear([-1,1])
  187.  
  188. end = int(CNT_EX - CNT_EX*TR_PRC)
  189.  
  190.  
  191. x_tr = x[:end]
  192. x_tst = x[end:]
  193. y_tr = y[:end]
  194. y_tst = y[end:]
  195.  
  196.  
  197. fig, ax = plt.subplots()
  198. ax.set_title("Зависимость количества эпох от скорости")
  199. ax.set_xlabel("Скорость обучения")
  200. ax.set_ylabel("Количество эпох")
  201.  
  202. ax_x = [x for x in range(100, 1100, 100)]
  203.  
  204. nets = []
  205. tr_err = []
  206. tst_err = []
  207.  
  208. epoches_cnt = []
  209. tr_speed = []
  210. for i in range(4):
  211. nets.append(Percep(3,2, TanH(0.001,0)))
  212. cnt = 0
  213. out = [nets[i].predict(ex) for ex in x_tr]
  214. while(RMSE(y_tr, out) >= 0.06):
  215. nets[i].train((x_tr,y_tr), 1, 1/(i+1))
  216. out = [nets[i].predict(ex) for ex in x_tr]
  217. cnt+=1
  218. epoches_cnt.append(cnt)
  219. tr_speed.append(1/(i+1))
  220.  
  221. ax.plot(tr_speed,epoches_cnt, label ="Error = 0.06")
  222.  
  223. ax.legend()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement