Advertisement
cimona

Normalizacija

Sep 14th, 2018
341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.97 KB | None | 0 0
  1. from __future__ import division
  2. from math import exp
  3. from random import seed
  4. from random import random
  5. from collections import defaultdict
  6.  
  7. # Initialize a network
  8. # Put fixed weigths to 0.5 on code.finki.ukim.mk if there is a problem with random()
  9. def initialize_network(n_inputs, n_hidden, n_outputs):
  10. network = list()
  11. hidden_layer = [{'weights':[random() for i in range(n_inputs + 1)]} for i in range(n_hidden)]
  12. network.append(hidden_layer)
  13. output_layer = [{'weights':[random() for i in range(n_hidden + 1)]} for i in range(n_outputs)]
  14. network.append(output_layer)
  15. return network
  16.  
  17.  
  18. # Calculate neuron activation for an input
  19. def activate(weights, inputs):
  20. activation = weights[-1]
  21. for i in range(len(weights)-1):
  22. activation += weights[i] * inputs[i]
  23. return activation
  24.  
  25. # Transfer neuron activation
  26. def transfer(activation):
  27. return 1.0 / (1.0 + exp(-activation))
  28. def predict(network, row):
  29. outputs = forward_propagate(network,row)
  30. return outputs.index(max(outputs))
  31. # Forward propagate input to a network output
  32. def forward_propagate(network, row):
  33. inputs = row
  34. for layer in network:
  35. new_inputs = []
  36. for neuron in layer:
  37. activation = activate(neuron['weights'], inputs)
  38. neuron['output'] = transfer(activation)
  39. new_inputs.append(neuron['output'])
  40. inputs = new_inputs
  41. return inputs
  42.  
  43. # Calculate the derivative of an neuron output
  44. def transfer_derivative(output):
  45. return output * (1.0 - output)
  46.  
  47. # Backpropagate error and store in neurons
  48. def backward_propagate_error(network, expected):
  49. for i in reversed(range(len(network))):
  50. layer = network[i]
  51. errors = list()
  52. if i != len(network)-1:
  53. for j in range(len(layer)):
  54. error = 0.0
  55. for neuron in network[i + 1]:
  56. error += (neuron['weights'][j] * neuron['delta'])
  57. errors.append(error)
  58. else:
  59. for j in range(len(layer)):
  60. neuron = layer[j]
  61. errors.append(expected[j] - neuron['output'])
  62. for j in range(len(layer)):
  63. neuron = layer[j]
  64. neuron['delta'] = errors[j] * transfer_derivative(neuron['output'])
  65.  
  66. # Update network weights with error
  67. def update_weights(network, row, l_rate):
  68. for i in range(len(network)):
  69. inputs = row[:-1]
  70. if i != 0:
  71. inputs = [neuron['output'] for neuron in network[i - 1]]
  72. for neuron in network[i]:
  73. for j in range(len(inputs)):
  74. neuron['weights'][j] += l_rate * neuron['delta'] * inputs[j]
  75. neuron['weights'][-1] += l_rate * neuron['delta']
  76.  
  77. # Train a network for a fixed number of epochs
  78. def train_network(network, train, l_rate, n_epoch, n_outputs):
  79. for epoch in range(n_epoch):
  80. sum_error = 0
  81. for row in train:
  82. outputs = forward_propagate(network, row)
  83. expected = [0 for i in range(n_outputs)]
  84. expected[int(row[-1])] = 1
  85. sum_error += sum([(expected[i]-outputs[i])**2 for i in range(len(expected))])
  86. backward_propagate_error(network, expected)
  87. update_weights(network, row, l_rate)
  88.  
  89.  
  90. # Test training backprop algorithm
  91. seed(1)
  92. dataset = [[2.7810836,2.550537003,0],
  93. [1.465489372,2.362125076,0],
  94. [3.396561688,4.400293529,0],
  95. [1.38807019,1.850220317,0],
  96. [3.06407232,3.005305973,0],
  97. [7.627531214,2.759262235,1],
  98. [5.332441248,2.088626775,1],
  99. [6.922596716,1.77106367,1],
  100. [8.675418651,-0.242068655,1],
  101. [7.673756466,3.508563011,1]]
  102.  
  103. n_inputs = len(dataset[0]) - 1
  104. n_outputs = len(set([row[-1] for row in dataset]))
  105. network = initialize_network(n_inputs, 2, n_outputs)
  106. train_network(network, dataset, 0.5, 20, n_outputs)
  107.  
  108.  
  109. seed(1)
  110. training_data = [
  111. [3.6216, 8.6661, -2.8073, -0.44699, 0],
  112. [4.5459, 8.1674, -2.4586, -1.4621, 0],
  113. [3.866, -2.6383, 1.9242, 0.10645, 0],
  114. [3.4566, 9.5228, -4.0112, -3.5944, 0],
  115. [0.32924, -4.4552, 4.5718, -0.9888, 0],
  116. [4.3684, 9.6718, -3.9606, -3.1625, 0],
  117. [3.5912, 3.0129, 0.72888, 0.56421, 0],
  118. [2.0922, -6.81, 8.4636, -0.60216, 0],
  119. [3.2032, 5.7588, -0.75345, -0.61251, 0],
  120. [1.5356, 9.1772, -2.2718, -0.73535, 0],
  121. [1.2247, 8.7779, -2.2135, -0.80647, 0],
  122. [3.9899, -2.7066, 2.3946, 0.86291, 0],
  123. [1.8993, 7.6625, 0.15394, -3.1108, 0],
  124. [-1.5768, 10.843, 2.5462, -2.9362, 0],
  125. [3.404, 8.7261, -2.9915, -0.57242, 0],
  126. [4.6765, -3.3895, 3.4896, 1.4771, 0],
  127. [2.6719, 3.0646, 0.37158, 0.58619, 0],
  128. [0.80355, 2.8473, 4.3439, 0.6017, 0],
  129. [1.4479, -4.8794, 8.3428, -2.1086, 0],
  130. [5.2423, 11.0272, -4.353, -4.1013, 0],
  131. [5.7867, 7.8902, -2.6196, -0.48708, 0],
  132. [0.3292, -4.4552, 4.5718, -0.9888, 0],
  133. [3.9362, 10.1622, -3.8235, -4.0172, 0],
  134. [0.93584, 8.8855, -1.6831, -1.6599, 0],
  135. [4.4338, 9.887, -4.6795, -3.7483, 0],
  136. [0.7057, -5.4981, 8.3368, -2.8715, 0],
  137. [1.1432, -3.7413, 5.5777, -0.63578, 0],
  138. [-0.38214, 8.3909, 2.1624, -3.7405, 0],
  139. [6.5633, 9.8187, -4.4113, -3.2258, 0],
  140. [4.8906, -3.3584, 3.4202, 1.0905, 0],
  141. [-0.24811, -0.17797, 4.9068, 0.15429, 0],
  142. [1.4884, 3.6274, 3.308, 0.48921, 0],
  143. [4.2969, 7.617, -2.3874, -0.96164, 0],
  144. [-0.96511, 9.4111, 1.7305, -4.8629, 0],
  145. [-1.6162, 0.80908, 8.1628, 0.60817, 0],
  146. [2.4391, 6.4417, -0.80743, -0.69139, 0],
  147. [2.6881, 6.0195, -0.46641, -0.69268, 0],
  148. [3.6289, 0.81322, 1.6277, 0.77627, 0],
  149. [4.5679, 3.1929, -2.1055, 0.29653, 0],
  150. [3.4805, 9.7008, -3.7541, -3.4379, 0],
  151. [4.1711, 8.722, -3.0224, -0.59699, 0],
  152. [-0.2062, 9.2207, -3.7044, -6.8103, 0],
  153. [-0.0068919, 9.2931, -0.41243, -1.9638, 0],
  154. [0.96441, 5.8395, 2.3235, 0.066365, 0],
  155. [2.8561, 6.9176, -0.79372, 0.48403, 0],
  156. [-0.7869, 9.5663, -3.7867, -7.5034, 0],
  157. [2.0843, 6.6258, 0.48382, -2.2134, 0],
  158. [-0.7869, 9.5663, -3.7867, -7.5034, 0],
  159. [3.9102, 6.065, -2.4534, -0.68234, 0],
  160. [1.6349, 3.286, 2.8753, 0.087054, 0],
  161. [4.3239, -4.8835, 3.4356, -0.5776, 0],
  162. [5.262, 3.9834, -1.5572, 1.0103, 0],
  163. [3.1452, 5.825, -0.51439, -1.4944, 0],
  164. [2.549, 6.1499, -1.1605, -1.2371, 0],
  165. [4.9264, 5.496, -2.4774, -0.50648, 0],
  166. [4.8265, 0.80287, 1.6371, 1.1875, 0],
  167. [2.5635, 6.7769, -0.61979, 0.38576, 0],
  168. [5.807, 5.0097, -2.2384, 0.43878, 0],
  169. [3.1377, -4.1096, 4.5701, 0.98963, 0],
  170. [-0.78289, 11.3603, -0.37644, -7.0495, 0],
  171. [-1.3971, 3.3191, -1.3927, -1.9948, 1],
  172. [0.39012, -0.14279, -0.031994, 0.35084, 1],
  173. [-1.6677, -7.1535, 7.8929, 0.96765, 1],
  174. [-3.8483, -12.8047, 15.6824, -1.281, 1],
  175. [-3.5681, -8.213, 10.083, 0.96765, 1],
  176. [-2.2804, -0.30626, 1.3347, 1.3763, 1],
  177. [-1.7582, 2.7397, -2.5323, -2.234, 1],
  178. [-0.89409, 3.1991, -1.8219, -2.9452, 1],
  179. [0.3434, 0.12415, -0.28733, 0.14654, 1],
  180. [-0.9854, -6.661, 5.8245, 0.5461, 1],
  181. [-2.4115, -9.1359, 9.3444, -0.65259, 1],
  182. [-1.5252, -6.2534, 5.3524, 0.59912, 1],
  183. [-0.61442, -0.091058, -0.31818, 0.50214, 1],
  184. [-0.36506, 2.8928, -3.6461, -3.0603, 1],
  185. [-5.9034, 6.5679, 0.67661, -6.6797, 1],
  186. [-1.8215, 2.7521, -0.72261, -2.353, 1],
  187. [-0.77461, -1.8768, 2.4023, 1.1319, 1],
  188. [-1.8187, -9.0366, 9.0162, -0.12243, 1],
  189. [-3.5801, -12.9309, 13.1779, -2.5677, 1],
  190. [-1.8219, -6.8824, 5.4681, 0.057313, 1],
  191. [-0.3481, -0.38696, -0.47841, 0.62627, 1],
  192. [0.47368, 3.3605, -4.5064, -4.0431, 1],
  193. [-3.4083, 4.8587, -0.76888, -4.8668, 1],
  194. [-1.6662, -0.30005, 1.4238, 0.024986, 1],
  195. [-2.0962, -7.1059, 6.6188, -0.33708, 1],
  196. [-2.6685, -10.4519, 9.1139, -1.7323, 1],
  197. [-0.47465, -4.3496, 1.9901, 0.7517, 1],
  198. [1.0552, 1.1857, -2.6411, 0.11033, 1],
  199. [1.1644, 3.8095, -4.9408, -4.0909, 1],
  200. [-4.4779, 7.3708, -0.31218, -6.7754, 1],
  201. [-2.7338, 0.45523, 2.4391, 0.21766, 1],
  202. [-2.286, -5.4484, 5.8039, 0.88231, 1],
  203. [-1.6244, -6.3444, 4.6575, 0.16981, 1],
  204. [0.50813, 0.47799, -1.9804, 0.57714, 1],
  205. [1.6408, 4.2503, -4.9023, -2.6621, 1],
  206. [0.81583, 4.84, -5.2613, -6.0823, 1],
  207. [-5.4901, 9.1048, -0.38758, -5.9763, 1],
  208. [-3.2238, 2.7935, 0.32274, -0.86078, 1],
  209. [-2.0631, -1.5147, 1.219, 0.44524, 1],
  210. [-0.91318, -2.0113, -0.19565, 0.066365, 1],
  211. [0.6005, 1.9327, -3.2888, -0.32415, 1],
  212. [0.91315, 3.3377, -4.0557, -1.6741, 1],
  213. [-0.28015, 3.0729, -3.3857, -2.9155, 1],
  214. [-3.6085, 3.3253, -0.51954, -3.5737, 1],
  215. [-6.2003, 8.6806, 0.0091344, -3.703, 1],
  216. [-4.2932, 3.3419, 0.77258, -0.99785, 1],
  217. [-3.0265, -0.062088, 0.68604, -0.055186, 1],
  218. [-1.7015, -0.010356, -0.99337, -0.53104, 1],
  219. [-0.64326, 2.4748, -2.9452, -1.0276, 1],
  220. [-0.86339, 1.9348, -2.3729, -1.0897, 1],
  221. [-2.0659, 1.0512, -0.46298, -1.0974, 1],
  222. [-2.1333, 1.5685, -0.084261, -1.7453, 1],
  223. [-1.2568, -1.4733, 2.8718, 0.44653, 1],
  224. [-3.1128, -6.841, 10.7402, -1.0172, 1],
  225. [-4.8554, -5.9037, 10.9818, -0.82199, 1],
  226. [-2.588, 3.8654, -0.3336, -1.2797, 1],
  227. [0.24394, 1.4733, -1.4192, -0.58535, 1],
  228. [-1.5322, -5.0966, 6.6779, 0.17498, 1],
  229. [-4.0025, -13.4979, 17.6772, -3.3202, 1],
  230. [-4.0173, -8.3123, 12.4547, -1.4375, 1]
  231. ]
  232.  
  233. testing_data = [
  234. [2.888, 0.44696, 4.5907, -0.24398, 0],
  235. [0.49665, 5.527, 1.7785, -0.47156, 0],
  236. [4.2586, 11.2962, -4.0943, -4.3457, 0],
  237. [1.7939, -1.1174, 1.5454, -0.26079, 0],
  238. [5.4021, 3.1039, -1.1536, 1.5651, 0],
  239. [2.5367, 2.599, 2.0938, 0.20085, 0],
  240. [4.6054, -4.0765, 2.7587, 0.31981, 0],
  241. [-1.979, 3.2301, -1.3575, -2.5819, 1],
  242. [-0.4294, -0.14693, 0.044265, -0.15605, 1],
  243. [-2.234, -7.0314, 7.4936, 0.61334, 1],
  244. [-4.211, -12.4736, 14.9704, -1.3884, 1],
  245. [-3.8073, -8.0971, 10.1772, 0.65084, 1],
  246. [-2.5912, -0.10554, 1.2798, 1.0414, 1],
  247. [-2.2482, 3.0915, -2.3969, -2.6711, 1]
  248. ]
  249.  
  250. def findMax(data):
  251. maximums = []
  252. for i in range(0,len(data[0])-1):
  253. MAX = 0
  254. for j in range(0,len(data)):
  255. if data[j][i] > MAX:
  256. MAX = data[j][i]
  257. maximums.append(MAX)
  258.  
  259. return maximums
  260.  
  261. def findMin(data):
  262. minimums = []
  263. for i in range(0, len(data[0]) - 1):
  264. MIN = 5000
  265. for j in range(0, len(data)):
  266. if data[j][i] < MIN:
  267. MIN = data[j][i]
  268.  
  269. minimums.append(MIN)
  270.  
  271. return minimums
  272.  
  273. # f-ja za normalizacija
  274. def minMaxNrom(training_data, testing_data):
  275. MAX=0
  276. MIN=0
  277. new_data =[]
  278. new_testing_data=[]
  279.  
  280. # trainingData normalization
  281. for i in range(0, len(training_data)):
  282. row = []
  283.  
  284. for j in range(0, len(training_data[i])-1):
  285. MIN = findMin(training_data)
  286. MAX = findMax(training_data)
  287. row.append((training_data[i][j] - MIN[j])/(MAX[j] - MIN[j]))
  288.  
  289. row.append(training_data[i][-1])
  290. new_data.append(row)
  291.  
  292. #testingData normalization
  293. for i in range(0, len(testing_data)):
  294. row = []
  295.  
  296. for j in range(0, len(testing_data[i])-1):
  297. MIN = findMin(testing_data)
  298. MAX = findMax(testing_data)
  299. row.append((testing_data[i][j] - MIN[j]) / (MAX[j] - MIN[j]))
  300.  
  301. row.append(testing_data[i][-1])
  302. new_testing_data.append(row)
  303.  
  304. return (new_data, new_testing_data)
  305.  
  306.  
  307. if __name__ == "__main__":
  308. #unnormalized data
  309. n_inputs=len(training_data[0])-1
  310. n_outputs=len(set(row[-1] for row in training_data))
  311. network = initialize_network(n_inputs,3,n_outputs)
  312. train_network(network,training_data,0.3,50,n_outputs)
  313.  
  314. #normalized data
  315. Ntraining = minMaxNrom(training_data,testing_data)[0]
  316. Ntesting = minMaxNrom(training_data,testing_data)[1]
  317. n_inputs=len(Ntraining[0])-1
  318. n_outputs=len(set(row[-1] for row in Ntraining))
  319. Nnetwork = initialize_network(n_inputs,3,n_outputs)
  320. train_network(Nnetwork,Ntraining,0.3,50,n_outputs)
  321.  
  322.  
  323. correct_first = 0
  324. correct_second = 0
  325.  
  326. #testiraj nenormalizirana mreza
  327. for row in testing_data:
  328. prediction = predict(network, row)
  329. if (row[-1] == prediction):
  330. correct_first += 1
  331.  
  332.  
  333. #testiraj normalizirana mreza
  334. for row in Ntesting:
  335. prediction = predict(Nnetwork, row)
  336. if (row[-1] == prediction):
  337. correct_second += 1
  338.  
  339.  
  340. for row in Ntesting:
  341. print(row)
  342. print("Prva mrezha:")
  343. print(correct_first)
  344. print("Vtora mrezha:")
  345. print(correct_second)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement