Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.84 KB | None | 0 0
  1. clear all;
  2. close all;
  3. clc;
  4. % macierz wejściowa
  5. % x1 x2 stała
  6. in = [1 1 1;
  7. 1 0 1;
  8. 0 1 1;
  9. 0 0 1];
  10. %wektor wyjsciowy
  11. out= [1;
  12. 0;
  13. 0;
  14. 0];
  15.  
  16. lr=1 %prędkośc uczenia
  17. max_epochs=10000; %maksymalna liczba epok
  18. max_error=0.001; %maksymalny błąd
  19.  
  20. n_in=size(in, 2); %liczba wejściowa neuronu = 3
  21. wagi=2*rand(n_in,1)-1; %wagi początkowe, przedział (-1,1)
  22. epochs=1; %pierwsza epoka
  23. error=1; %wartość początkowa błędu
  24. err=error; %zmienna przydatna do rysowania wykresu błędu
  25.  
  26. %Tworzenie pętli uczacejpercepton
  27.  
  28. while error>max_error && epochs<max_epochs
  29.  
  30. y=sigmoid (in*wagi); %obliczanie aktualnego wektora wyjściowego
  31. blad=out-y; %różnica między wartościami wzorcowymi a aktualnymi
  32. poprawka=blad.*sogmoid_der(y);
  33. wagi=wagi+lr*in'*poprawka; %korekta wektora wag
  34. error=sum(blad.^2)/length(blad); %obliczanie blędu średniokwadratowego MSE
  35. epochs=epochs+1; %kolejna epoka
  36. err(epochs)=error; %tworzenie wektora błędów w kolejnych epokach do wykresu błędów
  37. disp('epoka:')
  38. disp(epochs)
  39. disp('błąd:')
  40. disp(error)
  41. end
  42.  
  43. % Mnożymy macierz wzorców
  44. %wejściowych z otrzymanym wektorem współczynników wagowych. Wynik umieszczamy
  45. %w funkcji aktywacji (sigmoid), a następnie wyświetlamy wyniki w oknie poleceń.
  46. %Porównujemy wartości otrzymane z neuronu z wartościami wzorcowymi.
  47.  
  48. Y=sigmoid(in*wagi);
  49. disp('Aproksymowacja funcji logicznej pojedynczym perceptronem:')
  50. disp('-macierz wejść:')
  51. disp(in(:,1:2)) % tylko x1 i x2
  52. disp('-współczynniki wagowe:')
  53. disp(wagi)
  54. disp('-wynik aproksymowany sztucznym neuronem')
  55. disp(Y)
  56. disp('-wynik dokładny')
  57. disp(out)
  58.  
  59. %wykreślenie zmienności błędu w kolejnych epokach
  60. %uczenia oraz narysowanie płaszczyzny x1x2 z „wyuczonym” podziałem na wartość 1 i 0
  61.  
  62. figure
  63. subplot(2,1,1) %wybór wykresu -> help subplot
  64. semilogy(1:epochs,err) %wykres ze skalą logarytmiczną na osi y
  65. grid on % dodanie siatki
  66. xlabel('epoka')
  67. ylabel('błąd')
  68.  
  69. %Drugi wykres - płaszczyzna x1x2 wraz ze zbiorem punktów wejściowych i zaznaczoną
  70. %granicą między wartością 1 i 0.
  71. subplot(2,1,2) % wybór wykresu
  72. %tworzenie wykresu płasczyzny x1 i x2 z podziałem na wartosci
  73. %0 i 1
  74. [X1,X2]=meshgrid(-0.1:0.1:1.1); %tworzenie siatki punktów x1 i
  75. %x2 w zadanym przedziale
  76. YY=X1*wagi(1)+X2*wagi(2)+1*wagi(3); % obliczenie wyniku
  77. %f.logicznej
  78. YY=sign(YY); %YY=1 gdy YY>0 oraz YY=-1 gdy YY<0
  79. contourf(X1,X2,YY,1) % wykres konturowy z wypełnieniem
  80. hold on % dzięki temu kolejny wykres nie usunie poprzedniego
  81. plot(in(:,1),in(:,2),'ro') % rysowanie punktów in kolorem
  82. %czerwonym
  83. xlabel('x_1')
  84. ylabel('x_2')
  85. % ograniczenie osi wykresu
  86. xlim([-0.1,1.1])
  87. ylim([-0.1,1.1])
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96. SIGMOID.M
  97. function y=sigmoid(x)
  98. y=1./(1+exp(-x));
  99. end
  100.  
  101. SOGMOID_DER
  102.  
  103. function y = sigmoid_der(x)
  104. y = x.*(1-x);
  105. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement