Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Groovy 6.27 KB | None | 0 0
  1. import static Utils.formatDoubleValue
  2. import static java.lang.Math.pow
  3. import static java.lang.Math.sqrt
  4. import static java.lang.String.format
  5. import static org.apache.ivy.util.StringUtils.repeat
  6.  
  7. class WstecznaPropagacjaBledu {
  8.    
  9.     private static final int DOUBLE_PRECISION = 3
  10.     private static final double e = 2.718
  11.     private static final String DIVIDER = repeat('#', 100)
  12.    
  13.     static void main(String[] args) {
  14.         println(
  15.             "ALGORYTM WSTECZNEJ PROPAGACJI BLEDU\n\n" +
  16.                 "Siec dwuwarstwowa zlozona z dwoch neuronow unipolarnych ciaglych" +
  17.                 "\nw warstwie ukrytej i jednego liniowego w warstwie wyjsciowej\n${DIVIDER}\n"
  18.         )
  19.         double wspUczenia = 1
  20.         println("Wspolczynnik uczenia: ${wspUczenia}")
  21.        
  22.         List<List<Double>> stopniePewnosci = [
  23.             [1, 0, 0.3, 0.7]
  24.         ]
  25.        
  26.         List<List<Double>> wzorce = [
  27.             [0, 0, 0, 0, 0],
  28.             [1, 1, 1, 1, 1],
  29.             [1, 1, 0, 0, 0],
  30.             [1, 0, 1, 0, 1]
  31.         ]
  32.         println("\nPrzykladowe wzorce: " + format("%40s", "Stopnie pewnosci:"))
  33.         drukujWzorce(wzorce, stopniePewnosci)
  34.        
  35.         //      println("\nStopien pewnosci odpowiednio dla kazdego wiersza:")
  36.         //      drukujStopniePewnosci(stopniePewnosci as List<Double>)
  37.        
  38.         println("\nUnormowane wzorce:")
  39.         normalizujWzorce(wzorce)
  40.         drukujWzorce(wzorce)
  41.        
  42.         Random r = new Random()
  43.         List<List<Double>> wagiWarstwyUkrytej = [
  44.             [4, -3, 0.5, 1, 0.7],
  45.             [3, 0.5, -2, 0.7, 1]
  46.         ]
  47.         List<Double> wagiWarstwyWyjsciowej = [-0.4, -2]
  48.        
  49.         println("\nPoczatkowe wartosci wag dla warstwy ukrytej: ")
  50.         drukujWagi(wagiWarstwyUkrytej[0])
  51.         println()
  52.         drukujWagi(wagiWarstwyUkrytej[1])
  53.         println("\n\nPoczatkowe wartosci wag dla warstwy wyjsciowej: ")
  54.         drukujWagi(wagiWarstwyWyjsciowej)
  55.         println()
  56.        
  57.         //      List<List<Double>> wagi = new ArrayList<>()
  58.         //      for (int i = 0; i < stopniePewnosci.size(); i++) {
  59.         //          wagi.add(
  60.         //              [
  61.         //                  (-1.0 + (1.0 - (-1.0)) * r.nextDouble()).round(1),
  62.         //                  (-1.0 + (1.0 - (-1.0)) * r.nextDouble()).round(1),
  63.         //                  (-1.0 + (1.0 - (-1.0)) * r.nextDouble()).round(1),
  64.         //                  (-1.0 + (1.0 - (-1.0)) * r.nextDouble()).round(1),
  65.         //                  (-1.0 + (1.0 - (-1.0)) * r.nextDouble()).round(1)
  66.         //              ]
  67.         //          )
  68.         //      }
  69.         println(DIVIDER + "\n")
  70.        
  71.         List<Boolean> bledyRowneZero = [false, false, false, false]
  72.        
  73.         //      petla po wzorcach
  74.         int licznikEpok = 1
  75.         while (true) {
  76.             println(format("%26s", "--==|Epoka ${licznikEpok}|==--"))
  77.            
  78.             for (int i = 0; i < wzorce.size(); i++) {
  79.                 double y1 = 0
  80.                 double y2 = 0
  81.                 for (int j = 0; j < wzorce[i].size(); j++) {
  82.                     y1 += wzorce[i][j] * wagiWarstwyUkrytej[0][j]
  83.                     y2 += wzorce[i][j] * wagiWarstwyUkrytej[1][j]
  84.                 }
  85.                
  86.                 y1 = f(y1)
  87.                 y2 = f(y2)
  88.                
  89.                 double z = wagiWarstwyWyjsciowej[0] * y1 + wagiWarstwyWyjsciowej[1] * y2
  90.                
  91.                 double delta_blad = (double) (stopniePewnosci[0][i] - z)
  92.                
  93.                 double delta_y1 = delta_blad * wagiWarstwyWyjsciowej[0]
  94.                 double delta_y2 = delta_blad * wagiWarstwyWyjsciowej[1]
  95.                
  96.                 for (int j = 0; j < wagiWarstwyUkrytej[0].size(); j++) {
  97.                     wagiWarstwyUkrytej[0][j] += wspUczenia * delta_y1 * wzorce[i][j]
  98.                     wagiWarstwyUkrytej[1][j] += wspUczenia * delta_y2 * wzorce[i][j]
  99.                 }
  100.                
  101.                 wagiWarstwyWyjsciowej[0] += wspUczenia * delta_blad * y1
  102.                 wagiWarstwyWyjsciowej[1] += wspUczenia * delta_blad * y2
  103.                
  104.                
  105.                
  106.                
  107.                 //              double delta_blad1 = (double) (stopniePewnosci[0][i] - y1)
  108.                 //              double delta_blad2 = (double) (stopniePewnosci[0][i] - y2)
  109.                
  110.                
  111.                 //              println("Wynik 1 neuronu dla ${i + 1} wzorca wynosi: ${formatDoubleValue(y1, DOUBLE_PRECISION, 8)}")
  112.                 //              println("Blad: ${formatDoubleValue(delta_blad1, DOUBLE_PRECISION, 8)}")
  113.                 //              print("Wagi po nauczeniu: ")
  114.                 //              drukujWagi(wagiWarstwyUkrytej[0])
  115.                 //
  116.                 //              println("\n\nWynik 2 neuronu dla ${i + 1} wzorca wynosi: ${formatDoubleValue(y2, DOUBLE_PRECISION, 8)}")
  117.                 //              println("Blad: ${formatDoubleValue(delta_blad2, DOUBLE_PRECISION, 8)}")
  118.                 //              print("Wagi po nauczeniu: ")
  119.                 //              drukujWagi(wagiWarstwyUkrytej[1])
  120.                
  121.                 println("\nWynik dla ${i + 1} wzorca wynosi: ${formatDoubleValue(z, DOUBLE_PRECISION, 8)}")
  122.                 println("Blad: ${formatDoubleValue(delta_blad, DOUBLE_PRECISION, 8)}")
  123.                
  124.                 delta_blad = delta_blad.round(4)
  125.                 bledyRowneZero[i] = delta_blad < 0.001
  126.                 //
  127.                 //              delta_blad1 = delta_blad1.round(4)
  128.                 //              delta_blad2 = delta_blad2.round(4)
  129.                 //
  130.                 //              double temp = delta_blad1 * delta_blad1 + delta_blad2 * delta_blad2
  131.                 //              bledyRowneZero[i] = sqrt(temp) < 0.001
  132.             }
  133.             print("\nWagi po nauczeniu: ")
  134.             drukujWagi(wagiWarstwyWyjsciowej)
  135.             println("\n${DIVIDER}\n")
  136.            
  137.             //          print("\n\n\tAby przerwać naukę wciśnij 'k', aby kontynuować inny klawisz...")
  138.             //          if (System.in.newReader().readLine() == 'k') {
  139.             //              break
  140.             //          }
  141.            
  142.             licznikEpok++
  143.             if (!(false in bledyRowneZero)) {
  144.                 break
  145.             }
  146.         }
  147.     }
  148.    
  149.     private static double f(double y) {
  150.         //      println("y=${y}")
  151.         //      println("pow(e, -y)=${pow(e, -y)}")
  152.         double wynik = 1 / (1 + pow(e, -y))
  153.         //      println("wynik=${wynik}")
  154.         return wynik
  155.     }
  156.    
  157.     private static void drukujWagi(List<Double> wagi) {
  158.         wagi.each { value ->
  159.             print(formatDoubleValue(value, DOUBLE_PRECISION, 8))
  160.         }
  161.         //      println("\n")
  162.     }
  163.    
  164.     private static void normalizujWzorce(List<List<Double>> wzorce) {
  165.         wzorce.each { line ->
  166.             def dlugoscWektora = 0
  167.             line.each { value ->
  168.                 dlugoscWektora += value * value
  169.             }
  170.             dlugoscWektora = sqrt(dlugoscWektora)
  171.            
  172.             if (dlugoscWektora != 0) {
  173.                 for (int i = 0; i < line.size(); i++) {
  174.                     line[i] = line[i] / dlugoscWektora
  175.                 }
  176.             }
  177.         }
  178.     }
  179.    
  180.     private static void drukujWzorce(List<List<Double>> wzorce, List<List<Double>> listaStopniPewnosciDlaNeuronow = null) {
  181.         for (int i = 0; i < wzorce.size(); i++) {
  182.             wzorce[i].each { value ->
  183.                 print(formatDoubleValue(value, DOUBLE_PRECISION, 8))
  184.             }
  185.             if (listaStopniPewnosciDlaNeuronow) {
  186.                 print("\t")
  187.                 for (int j = 0; j < listaStopniPewnosciDlaNeuronow.size(); j++) {
  188.                     print(format("%-20s", "| dla ${j + 1} jest ${listaStopniPewnosciDlaNeuronow[j][i]}"))
  189.                 }
  190.             }
  191.             println()
  192.         }
  193.     }
  194.    
  195.     private static void drukujStopniePewnosci(List<Double> stopniePewnosci) {
  196.         stopniePewnosci.each { value ->
  197.             print(formatDoubleValue(value, DOUBLE_PRECISION, 8) + '\n')
  198.         }
  199.     }
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement