Advertisement
Guest User

Аблација

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