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 = [1 1 1;
- 1 0 1;
- 0 1 1;
- 0 0 1];
- %wektor wyjsciowy
- out= [1;
- 0;
- 0;
- 0];
- lr=1 %prędkośc uczenia
- max_epochs=10000; %maksymalna liczba epok
- max_error=0.001; %maksymalny błąd
- n_in=size(in, 2); %liczba wejściowa neuronu = 3
- wagi=2*rand(n_in,1)-1; %wagi początkowe, przedział (-1,1)
- epochs=1; %pierwsza epoka
- error=1; %wartość początkowa błędu
- err=error; %zmienna przydatna do rysowania wykresu błędu
- %Tworzenie pętli uczacejpercepton
- while error>max_error && epochs<max_epochs
- y=sigmoid (in*wagi); %obliczanie aktualnego wektora wyjściowego
- blad=out-y; %różnica między wartościami wzorcowymi a aktualnymi
- poprawka=blad.*sogmoid_der(y);
- wagi=wagi+lr*in'*poprawka; %korekta wektora wag
- error=sum(blad.^2)/length(blad); %obliczanie blędu średniokwadratowego MSE
- epochs=epochs+1; %kolejna epoka
- err(epochs)=error; %tworzenie wektora błędów w kolejnych epokach do wykresu błędów
- disp('epoka:')
- disp(epochs)
- disp('błąd:')
- disp(error)
- end
- % Mnożymy macierz wzorców
- %wejściowych z otrzymanym wektorem współczynników wagowych. Wynik umieszczamy
- %w funkcji aktywacji (sigmoid), a następnie wyświetlamy wyniki w oknie poleceń.
- %Porównujemy wartości otrzymane z neuronu z wartościami wzorcowymi.
- 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)
- %wykreślenie zmienności błędu w kolejnych epokach
- %uczenia oraz narysowanie płaszczyzny x1x2 z „wyuczonym” podziałem na wartość 1 i 0
- figure
- 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')
- %Drugi wykres - płaszczyzna x1x2 wraz ze zbiorem punktów wejściowych i zaznaczoną
- %granicą między wartością 1 i 0.
- 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 in kolorem
- %czerwonym
- xlabel('x_1')
- ylabel('x_2')
- % ograniczenie osi wykresu
- xlim([-0.1,1.1])
- ylim([-0.1,1.1])
- SIGMOID.M
- function y=sigmoid(x)
- y=1./(1+exp(-x));
- end
- SOGMOID_DER
- function y = sigmoid_der(x)
- y = x.*(1-x);
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement