Advertisement
Guest User

Untitled

a guest
Dec 12th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <cmath>
  2. #include <iostream>
  3.  
  4. #define pi 3.14159265
  5. #define N 160 // liczba neuronow
  6. #define alpha 0.5 // wspolczynnik uczenia
  7. #define numberOfTrainings 10000 // ile razy trenowana jest siec - w excelu są podane różne wartości dla porównania
  8.  
  9. using namespace std;
  10.  
  11.  
  12. // funkcja, ktora opisane jest wahadlo matematyczne: f(t)=2cos(2t + pi/2)
  13. double f(double t){
  14.     return 2*cos(2*t + pi/2);
  15. }
  16.  
  17. // funkcja aktywacji +1/-1 - w przypadku uczenia się daje 1 rozwiązaniom blisko ( <= 1),
  18. // natomiast rozwiązania dalekie dostają wartość -1
  19. double bipolar(double x){
  20.     if (x > 1) return 1;
  21.     return -1;
  22. }
  23.  
  24. // uczenie sieci zgodnie z zasada Hebba
  25. void train(double *w, double *y, double *out){
  26.     // pętla ucząca przechodzi tyle razy, ile ustawimy w liczbie treningów
  27.     for(int j=0; j<numberOfTrainings; j++){
  28.         // aktualizujemy wagę dla każdego ze 160 neuronów
  29.         for(int i=0; i<N; i++)
  30.             // wzór hebba - do wagi dodajemy wyjście neuronu out(+1/-1), wyjście oryginalnej funkcji
  31.             // i to wszystko mnożymy przez współczynnik uczenia alfa (przyjęty 0.5)
  32.             w[i] = w[i] + alpha * y[i] * out[i];
  33.         cout << "Network trained " << j << " times." << endl;
  34.     }
  35. }
  36.  
  37. int main(int, char const**)
  38. {
  39.     // wejscie osi OX - wartosci od 0 do pi/2 co 1/100 - wychodzi 1.60, czyli podobnie do wartości pi/2, który określa
  40.     // ruch wahadła w jedną stronę
  41.     double xG[N];
  42.    
  43.     // wejscie osi OY - wyliczane na podstawie funkcji f(x)
  44.     double yG[N];
  45.    
  46.     // Wartosc funkcji aktywacji - dla dobrych wartości przyjmuje +1
  47.     double out[N];
  48.    
  49.     // Wektor wag
  50.     double w[N];
  51.    
  52.     // Obliczanie wartosci funkcji i przypisywanie wartosci z funkcji aktywacji
  53.     for(double i=0; i<N; i+=1){
  54.         xG[(int)i] = (double)(i/100); // oś X
  55.         yG[(int)i] = f(xG[(int)i]); // oś Y
  56.         out[(int)i] = bipolar((yG[(int)i] - w[(int)i])); //wartość liczona z funkcji przystosowania
  57.     }
  58.    
  59.     // Tworzenie randomowych wag w[i]
  60.     for(int i=0; i<N; i++){
  61.         w[i] = (rand() % 100);
  62.         w[i] /= 100;
  63.        
  64.         if (rand() % 100 >= 50)
  65.             w[i] = -w[i];
  66.     }
  67.  
  68.     //wchodzenie w funkcję trenującą
  69.     train(w, yG, out);
  70.    
  71.     //dopasowywanie wag do liczby treningów - im więcej treningów, tym większe wartości przyjmują wagi
  72.     for(int i=0; i<N; i++){
  73.         w[i] = (w[i]*2/numberOfTrainings);
  74.     }
  75.    
  76.     // wypisuje nauczone wagi
  77.     for(int i=0; i<N; i++){
  78.         cout << w[i] << endl;
  79.     }
  80.  
  81.     return 0;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement