% Berechnung der Exklusiv-ODER-Funktion mit zwei Eingängen
% mittels eines Backprpagations - Netzes
%           E1 E2 | A
% Muster    =========
%    1      0  0  | 0
%    2      0  1  | 1
%    3      1  0  | 1 
%    4      1  1  | 0
% Lernen mit Unterweisung;
% notwendig :  Definition eines Eingabe- u. eines Zielvektors
ein = [0 0 1 1; 0 1 0 1];
soll = [0 1 1 0];
%
% Erstellen des BACKPROPAGATION-Netzes (feedforward network)
% Eingabeschicht mit zwei Neuronen (Datenpuffer)
% versteckte Schicht mit drei Neuronen; Transferfkt.: Tangens Hyperbolikus
% Ausgabeschicht mit einem Neuron; lineare Transferfunktion
% Trainingsfunktion : Gradientenabstieg Backpropagation
netz = newff(ein,soll,3,{'tansig'},'traingd');
% Initialisierung des Netzes erfolgt definiert mit init - Kommando
% Eingabeschicht
disp('Eingabeschicht')
IW11 = [0.5853 0.2551; 0.2238 0.5060; 0.7513 0.6991];
netz.IW{1,1} = IW11;
BIAS1 = [0.8909; 0.9593; 0.5472];
netz.b{1} = BIAS1;
Ein11Mat = netz.IW{1,1}
WertBIAS1 = netz.b{1}
% Layerschicht
disp('Hiddenschicht')
LW21 = [0.1386 0.1493 0.2575];
netz.LW{2,1} = LW21;
BIAS2 = [0.8407];
netz.b{2} = BIAS2;
Lay21Mat = netz.LW{2,1}
WertBIAS2 = netz.b{2}
pause
% Belegung der Gewichte u. des Bias mit Null
netz = init (netz);
% Darstellung der Entscheidungsgrenze des untrainierten Netzes
% plotpc(netz.IW{1,1}, netz.b{1})
% display('Ergebnis : Die Entscheidungsgrenze trennt die Null- nicht von den Eins-Mustern');
% pause;
% Trainieren des Netzes
netz.trainParam.show = 50;
netz.trainParam.lr = 0.05;
netz.trainParam.epochs = 850;
netz.trainParam.goal = 1e-5;
[netz,tr] = train(netz,ein,soll);
% pause;
% Darstellung der Entscheidungsgrenze des trainierten Netzes
% plotpv(ein,soll)
% pause;
% plotpc(netz.IW{1,1}, netz.b{1})
% display('Ergebnis : Die Entscheidungsgrenze trennt die Null- von den Eins-Mustern')
