Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- clear all
- close all
- clc
- % macierz wejściowa
- % x1 x2 stała
- in=[0 0 1;
- 0 1 1;
- 1 0 1;
- 1 1 1];
- for i=1:1:5
- %wektor wyjściowy
- AND = [0; 0; 0; 1];
- OR = [0; 1; 1; 1];
- NAND = [1; 1; 1; 0];
- NOR = [1; 0; 0; 0];
- XOR = [0; 1; 1; 0];
- out=[AND OR NAND NOR XOR]; %co do chuja
- lr=1; %prędkość uczenia
- max_epochs=10000; %maksymalna liczba epok
- max_error=0.001; %maksymalny błąd
- n_in=size(in,2); %liczba wejść neuronu = 3
- wagi=2*rand(n_in,1)-1; %wagi początkowe, przedzial (-1,1)
- epochs=1; % pierwsza epoka
- error=1; % wartość początkowa błędu
- err=error; % zmienna przydatna do rysowania wykresu błedu
- while error>max_error && epochs<max_epochs
- y=sigmoid(in*wagi); %obliczanie aktualnego wektora wyjsciowego
- blad=out(:,i)-y; % różnica między wartościami wzorcowymi a aktualnymi
- poprawka=blad.*sigmoid_der(y);
- wagi=wagi+lr*in'*poprawka; % korekta wektora wag
- error=sum(blad.^2)/length(blad); % obliczanie błędu średniokwadratowego MSE
- epochs=epochs+1; % kolejna epoka
- err(epochs)=error; % tworzenie wektora błedów w kolejnych epokach do wykresu bledu
- % disp('epoka:')
- % disp(epochs)
- % disp('błąd:')
- % disp(error)
- end
- Y=sigmoid(in*wagi);
- disp('Aproksymowacja funcji logicznej pojedynczym perceptronem:')
- disp('-macierz wejść:')
- disp(in(:,1:2)) % tylko x1 i x2
- disp('-współczynniki wagowe:')
- disp(wagi)
- disp('-wynik aproksymowany sztucznym neuronem')
- disp(Y)
- disp('-wynik dokładny')
- disp(out(:,i))
- figure(i)
- subplot(2,1,1) %wybór wykresu -> help subplot
- semilogy(1:epochs,err) %wykres ze skalą logarytmiczną na osi y
- grid on % dodanie siatki
- xlabel('epoka')
- ylabel('błąd')
- subplot(2,1,2) % wybór wykresu
- %tworzenie wykresu płasczyzny x1 i x2 z podziałem na wartosci 0 i 1
- [X1,X2]=meshgrid(-0.1:0.1:1.1); %tworzenie siatki punktów x1 i x2 w zadanym przedziale
- YY=X1*wagi(1)+X2*wagi(2)+1*wagi(3); % obliczenie wyniku f.logicznej
- YY=sign(YY); %YY=1 gdy YY>0 oraz YY=-1 gdy YY<0
- contourf(X1,X2,YY,1) % wykres konturowy z wypełnieniem
- hold on % dzięki temu kolejny wykres nie usunie poprzedniego
- plot(in(:,1),in(:,2),'ro') % rysowanie punktów wejściowych kolorem czerwonym
- xlabel('x_1')
- ylabel('x_2')
- % ograniczenie osi wykresu
- xlim([-0.1,1.1])
- ylim([-0.1,1.1])
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement