echo off disp('Nasz detektor ma rozmiar NxN') echo on N=30; echo off x=zeros(60,900); t=zeros(60,1); disp('ustalamy amplitude szumu r') echo on r=1; % do 7 echo off disp('Przygotowujemy zestaw wzorcow treningowych: losowo umieszczonych kol i kwadratow ') disp('Pola figur dobieramy mozliwie podobne') disp('---> nacisnij klawisz') pause for k=1:60 % k - numer wzorca if(rand(1)<0.5) % to wzorzec bedzie kwadratem x0=1+round(20*rand(1)); y0=1+round(20*rand(1)); kw=zeros(N,N); for i=x0:N-(21-x0) for j=y0:N-(21-y0) kw(i,j)=1; end end kwadrat=sum(sum(kw)); disp(sprintf('wzorzec %d: kwadrat o polu= %d',k,kwadrat)) x(k,:)=reshape(kw+r*(rand(size(kw))-0.5),1,N*N); t(k)=1 ; imagesc(kw); pause(0.1) else %to wzorzec bedzie kolem sx=15-round(20*(rand(1)-0.5)); sy=15-round(20*(rand(1)-0.5)); kolo=zeros(N,N); for i=1:N for j=1:N if((i-sx).^2+(j-sy).^2<34) kolo(i,j)=1; end end end kolo_s=sum(sum(kolo)); disp(sprintf('wzorzec %d: kolo o polu= %d',k,kolo_s)) x(k,:)=reshape(kolo+r*(rand(size(kolo))-0.5),1,N*N); t(k)=0 ; imagesc(kolo); pause(0.1) end end disp('Mamy juz wzorce...') disp('Tworzymy siec') echo on N_hid=20; N_out=1; %alfa=0.001; net = mlp(N*N, N_hid, N_out, 'logistic');%,alfa); echo off disp(sprintf(' nasza siec ma wejscie o rozmiarze %dx%d \n %d jednostek ukrytych i \n %d jednostek wyjsciowych',N,N, N_hid, N_out)); disp(sprintf(' jednostka wyjsciowa ma funkcje aktywacjii logistyczna i wsp. zanikania wag %f',alfa)) % ustawiamu opcje uczenia options(1)=1; options(2)= 0.1; options(14)=200;% is the maximum number of iterations; default 100. options(18)=0; disp('uczymy siec') disp('--->nacisnij klawisz') pause echo on [net, options, errlog] = netopt(net, options, x, t, 'scg'); echo off disp('zrobimy zbior testowy i zobaczymy jak siec sobie radzi z nowymi danymi') disp('--->nacisnij klawisz') pause for k=1:60 % k - numer wzorca if(rand(1)<0.5) % to wzorzec bedzie kwadratem x0=1+round(20*rand(1)); y0=1+round(20*rand(1)); kw=zeros(N,N); for i=x0:N-(21-x0) for j=y0:N-(21-y0) kw(i,j)=1; end end kwadrat=sum(sum(kw)); disp(sprintf('wzorzec %d: kwadrat o polu= %d',k,kwadrat)) x(k,:)=reshape(kw+r*(rand(size(kw))-0.5),1,N*N); t(k)=1 ; imagesc(kw); pause(0.1) else %to wzorzec bedzie kolem sx=15-round(20*(rand(1)-0.5)); sy=15-round(20*(rand(1)-0.5)); kolo=zeros(N,N); for i=1:N for j=1:N if((i-sx).^2+(j-sy).^2<34) kolo(i,j)=1; end end end kolo_s=sum(sum(kolo)); disp(sprintf('wzorzec %d: kolo o polu= %d',k,kolo_s)) x(k,:)=reshape(kolo+r*(rand(size(kolo))-0.5),1,N*N); t(k)=0 ; imagesc(kolo); pause(0.1) end end disp('przepuscimy nowe dane przez siec') echo on y=mlpfwd(net,x); echo off disp(' ogladamy wyniki klasyfikacjii na nowym zbiorze') for k=1:60 imagesc(reshape(x(k,:),30,30)) if t(k)==1 s=sprintf('to jest kwadrat'); if y(k)>0.5 s1=sprintf('%s\n rozpoznany jako kwadrat', s); title(s1) else s1=sprintf('%s\n rozpoznany jako kolo', s); title(s1) end else s=sprintf('to jest kolo'); if y(k)>0.5 s1=sprintf('%s\n rozpoznane jako kwadrat', s); title(s1) else s1=sprintf('%s\n rozpoznane jako kolo', s); title(s1) end end disp('--->nacisnij klawisz') pause end disp(' i konstruujemy krzywą ROC') p=0; for prog=0:0.01:1 p=p+1; kw_kw=0; kw_kolo=0; kolo_kw=0; kolo_kolo=0; for k=1:60 if t(k)==1 % kwadrat if y(k)>prog kw_kw=kw_kw+1; %rozpoznany jako kwadrat else kw_kolo=kw_kolo+1; %rozpoznany jako kolo end else % kolo if y(k)>prog kolo_kw=kolo_kw+1; %rozpoznane jako kwadrat else kolo_kolo=kolo_kolo+1; %rozpoznane jako kolo end end end % zakladamy ze szukamy kwadratow wowczas czulosc to prawdopodobienstwo, % ze gdy prezentowany jest kwadrat to zostanie on prawidlowo % sklasyfikowany czulosc(p)=kw_kw/(kw_kw+kw_kolo); % specyficznosc jest wowczas prawdopodobienstwem, ze jesli prezentowany % jest nie kwadrat to odpowiedz sieci bedzie ze nie jest to kwadrat specyf(p)=kolo_kolo/(kolo_kolo+kolo_kw); end plot(1-specyf, czulosc) title( 'krzywa ROC') xlabel('1-specyficznosc') ylabel('czulosc')