Advertisement
Guest User

Untitled

a guest
Jan 26th, 2020
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.60 KB | None | 0 0
  1. from copy import deepcopy
  2. from math import exp
  3. from os import truncate
  4. from random import random, seed
  5.  
  6.  
  7. # Иницијализација на мрежа
  8. # Ставете фиксни тежини од 0.5 на code.finki.ukim.mk ако постои проблем со random()
  9. def initialize_network(n_inputs, n_hidden, n_outputs):
  10. """Изградба на мрежата и иницијализација на тежините
  11.  
  12. :param n_inputs: број на неврони во влезниот слој
  13. :type n_inputs: int
  14. :param n_hidden: број на неврони во скриениот слој
  15. :type n_hidden: int
  16. :param n_outputs: број на неврони во излезниот слој
  17. (број на класи)
  18. :type n_outputs: int
  19. :return: мрежата како листа на слоеви, каде што секој
  20. слој е речник со клуч 'weights' и нивните вредности
  21. :rtype: list(list(dict(str, list)))
  22. """
  23. network = list()
  24. hidden_layer = [{'weights': [random() for _ in range(n_inputs + 1)]}
  25. for _ in range(n_hidden)]
  26. network.append(hidden_layer)
  27. output_layer = [{'weights': [random() for _ in range(n_hidden + 1)]}
  28. for _ in range(n_outputs)]
  29. network.append(output_layer)
  30. return network
  31.  
  32.  
  33. def neuron_calculate(weights, inputs):
  34. """Пресметување на вредноста за активација на неврон
  35.  
  36. :param weights: даден вектор (листа) на тежини
  37. :type weights: list(float)
  38. :param inputs: даден вектор (листа) на влезови
  39. :type inputs: list(float)
  40. :return: пресметка на невронот
  41. :rtype: float
  42. """
  43. activation = weights[-1]
  44. for i in range(len(weights) - 1):
  45. activation += weights[i] * inputs[i]
  46. return activation
  47.  
  48.  
  49. def sigmoid_activation(activation):
  50. """Sigmoid активациска функција
  51.  
  52. :param activation: вредност за активациската функција
  53. :type activation: float
  54. :return: вредност добиена од примена на активациската
  55. функција
  56. :rtype: float
  57. """
  58. return 1.0 / (1.0 + exp(-activation))
  59.  
  60.  
  61. def forward_propagate(network, row):
  62. """Пропагирање нанапред на влезот кон излезот на мрежата
  63.  
  64. :param network: дадената мрежа
  65. :param row: моменталната податочна инстаца
  66. :return: листа на излезите од последниот слој
  67. """
  68. inputs = row
  69. for layer in network:
  70. new_inputs = []
  71. for neuron in layer:
  72. activation = neuron_calculate(neuron['weights'], inputs)
  73. neuron['output'] = sigmoid_activation(activation)
  74. new_inputs.append(neuron['output'])
  75. inputs = new_inputs
  76. return inputs
  77.  
  78.  
  79. def sigmoid_activation_derivative(output):
  80. """Пресметување на изводот на излезот од невронот
  81.  
  82. :param output: излезни вредности
  83. :return: вредност на изводот
  84. """
  85. return output * (1.0 - output)
  86.  
  87.  
  88. def backward_propagate_error(network, expected):
  89. """Пропагирање на грешката наназад и сочувување во невроните
  90.  
  91. :param network: дадена мрежа
  92. :type network: list(list(dict(str, list)))
  93. :param expected: очекувани вредности за излезот
  94. :type expected: list(int)
  95. :return: None
  96. """
  97. for i in reversed(range(len(network))):
  98. layer = network[i]
  99. errors = list()
  100. if i != len(network) - 1:
  101. for j in range(len(layer)):
  102. error = 0.0
  103. for neuron in network[i + 1]:
  104. error += (neuron['weights'][j] * neuron['delta'])
  105. errors.append(error)
  106. else:
  107. for j in range(len(layer)):
  108. neuron = layer[j]
  109. errors.append(expected[j] - neuron['output'])
  110. for j in range(len(layer)):
  111. neuron = layer[j]
  112. neuron['delta'] = errors[j] * sigmoid_activation_derivative(neuron['output'])
  113.  
  114.  
  115. def update_weights(network, row, l_rate):
  116. """Ажурирање на тежините на мрежата со грешката
  117.  
  118. :param network: дадена мрежа
  119. :type network: list(list(dict(str, list)))
  120. :param row: една инстанца на податоци
  121. :type row: list
  122. :param l_rate: рата на учење
  123. :type l_rate: float
  124. :return: None
  125. """
  126. for i in range(len(network)):
  127. inputs = row[:-1]
  128. if i != 0:
  129. inputs = [neuron['output'] for neuron in network[i - 1]]
  130. for neuron in network[i]:
  131. for j in range(len(inputs)):
  132. neuron['weights'][j] += l_rate * neuron['delta'] * inputs[j]
  133. neuron['weights'][-1] += l_rate * neuron['delta']
  134.  
  135.  
  136. def train_network(network, train, l_rate, n_epoch, n_outputs, verbose=True):
  137. """Тренирање на мрежата за фиксен број на епохи
  138.  
  139. :param network: дадена мрежа
  140. :type network: list(list(dict(str, list)))
  141. :param train: тренирачко множество
  142. :type train: list
  143. :param l_rate: рата на учење
  144. :type l_rate: float
  145. :param n_epoch: број на епохи
  146. :type n_epoch: int
  147. :param n_outputs: број на неврони (класи) во излезниот слој
  148. :type n_outputs: int
  149. :param verbose: True за принтање на лог, инаку False
  150. :type: verbose: bool
  151. :return: None
  152. """
  153. for epoch in range(n_epoch):
  154. sum_error = 0
  155. for row in train:
  156. outputs = forward_propagate(network, row)
  157. expected = [0] * n_outputs
  158. expected[row[-1]] = 1
  159. sum_error += sum([(expected[i] - outputs[i]) ** 2 for i in range(len(expected))])
  160. backward_propagate_error(network, expected)
  161. update_weights(network, row, l_rate)
  162.  
  163. def predict(network, row):
  164. """Направи предвидување
  165.  
  166. :param network: дадена мрежа
  167. :type network: list(list(dict(str, list)))
  168. :param row: една податочна инстанца
  169. :type row: list
  170. :return: предвидени класи
  171. """
  172. outputs = forward_propagate(network, row)
  173. return outputs.index(max(outputs))
  174.  
  175.  
  176. dataset = [[-0.25373134328358204, 0.5652173913043477, -0.4280788177339901, 0.4875, 0.5399999999999994, 0],
  177. [0.3731343283582091, 0.5, -0.4766734279918865, 0.625, 1.0, 0],
  178. [-0.11940298507462675, 0.5061728395061729, -0.5091025915613623, 0.6630434782608701, 1.0, 0],
  179. [0.7313432835820894, 0.5833333333333333, -0.6284306826178747, 0.8214285714285718, -0.7523809523809535, 0],
  180. [0.05970149253731361, 0.5698924731182795, -0.7504105090311989, 0.5740740740740742, 0.3185185185185191, 0],
  181. [0.4626865671641791, 0.393939393939394, -0.4302134646962229, 0.8888888888888891, 1.0, 0],
  182. [-0.7462686567164178, 0.393939393939394, -0.7290640394088669, 0.41666666666666696, 0.4888888888888882, 1],
  183. [-0.11940298507462675, 0.8611111111111112, -0.7763975155279502, 0.8478260869565221, -1.0, 1],
  184. [-0.6567164179104478, 0.2857142857142856, -0.16435288849081894, 0.3522727272727275, 1.0, 1],
  185. [0.28358208955223896, 0.4736842105263157, -0.16871921182266006, 0.5937500000000002, 1.0, 0],
  186. [-0.16417910447761186, 0.7222222222222221, -0.4088669950738916, 0.7386363636363638, 1.0, 1],
  187. [-0.6119402985074627, 0.16666666666666674, -0.2487684729064035, 0.41666666666666696, 0.2333333333333325, 1],
  188. [-0.07462686567164167, 0.5238095238095237, -0.4889162561576354, 0.6822916666666667, 0.6166666666666667, 0],
  189. [-0.16417910447761186, 0.4871794871794872, -0.5136587550380649, 0.3522727272727275, 1.0, 1],
  190. [-0.4328358208955224, 0.3333333333333335, -0.480911330049261, 0.5937500000000002, -0.1500000000000008, 1],
  191. [0.3731343283582091, 0.8148148148148147, -0.3184584178498988, 0.8750000000000002, 1.0, 0],
  192. [-0.29850746268656714, 0.6825396825396826, -0.4897588799585165, 0.5657894736842108, 0.5157894736842108, 0],
  193. [0.28358208955223896, 0.20634920634920628, -0.4568965517241379, 0.7265625000000002, 1.0, 0],
  194. [-0.4776119402985075, 0.44444444444444464, -0.2807881773399016, 0.41666666666666696, 1.0, 1],
  195. [0.28358208955223896, 0.3333333333333335, -0.312807881773399, 0.5937500000000002, 0.4249999999999996, 0],
  196. [-0.46268656716417894, 0.6153846153846152, -0.943456843007068, 0.4782608695652175, 1.0, 1],
  197. [-0.20895522388059692, 0.4666666666666666, -0.20760028149190712, 0.7202380952380956, -0.3142857142857156, 1],
  198. [-0.5671641791044777, 0.5555555555555556, -0.3497536945812809, 0.961538461538462, 1.0, 1],
  199. [-0.07462686567164167, 0.7435897435897441, -0.6330049261083743, 0.9479166666666669, 1.0, 0],
  200. [-0.4776119402985075, 0.44444444444444464, -0.4088669950738916, 0.7000000000000004, -0.22666666666666724, 0],
  201. [0.1940298507462688, 0.29824561403508776, -0.30640394088669953, 0.5583333333333336, 1.0, 1],
  202. [0.28358208955223896, 0.4736842105263157, -0.7450738916256158, 0.8593750000000002, 0.4249999999999996, 1],
  203. [-0.4776119402985075, 0.04761904761904767, -0.3320197044334974, 0.841666666666667, 1.0, 1],
  204. [-0.16417910447761186, 0.6000000000000001, -0.3390058217644425, 0.7386363636363638, 0.581818181818182, 1],
  205. [-0.07462686567164167, 0.5238095238095237, -0.5049261083743842, 0.2395833333333333, 1.0, 0]]
  206.  
  207.  
  208. def reduceDataset(training,testing,column):
  209.  
  210. new_training = deepcopy(training)
  211. new_testing = deepcopy(testing)
  212.  
  213. for el in new_training:
  214. el.remove(el[column])
  215. for el in new_testing:
  216. el.remove(el[column])
  217.  
  218. return (new_training,new_testing)
  219.  
  220.  
  221. if __name__ == "__main__":
  222. seed(1)
  223.  
  224. n_inputs = len(dataset[0]) - 1
  225. n_outputs = len(set([row[-1] for row in dataset]))
  226.  
  227. # Vashiot kod tuka
  228.  
  229. skrieni = int(input())
  230. rata = float(input())
  231. epohi = int(input())
  232. particija = float(input())
  233.  
  234. part = int(len(dataset)*(1-particija))
  235.  
  236. training_set = dataset[:part]
  237. testing_set = dataset[part:]
  238.  
  239. network = initialize_network(n_inputs,skrieni,n_outputs)
  240. train_network(network,training_set,rata,epohi,n_outputs,False)
  241.  
  242. total = len(testing_set)
  243. suma = 0
  244.  
  245. for el in testing_set:
  246. if predict(network,el) == el[-1]:
  247. suma+=1
  248.  
  249. print("Tochnost so site karakteristiki:",round(suma/total,4))
  250.  
  251. index = -1
  252. percision = round(suma/total,4)
  253. new_percision = percision
  254.  
  255.  
  256. for j in range(0,len(dataset[0])-1):
  257.  
  258. data = reduceDataset(training_set,testing_set,j)
  259.  
  260. network1 = initialize_network(n_inputs,skrieni,n_outputs)
  261. train_network(network1,data[0],rata,epohi,n_outputs,False)
  262.  
  263. suma=0
  264.  
  265. for el in data[1]:
  266. if predict(network1,el) == el[-1]:
  267. suma+=1
  268.  
  269. if new_percision > suma/total:
  270. index = j
  271. new_percision = suma/total
  272.  
  273. print("Najgolem pad na tochnost:",round(percision-new_percision,4))
  274. print("Najvazhna karakteristika:",index+1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement