AuD Übung 04 (Stefan Bosse) [09.12.2024] |
Punkte: | Total | /2 | 1. | /2 | 2. | /2 | 3. | /2 | 4. | /2 | 5. | /2 |
In dieser Übung sollen zwei Ziele erricht werden:
Ausgabe : 29.11.2024
Abgabe : 06.12.2024
Ab hier sollen Algorithmen in Java mit dem integrierten JS Transpiler implementiert werden.
Aufgabe 1. Implementiere die unsiverselle Zweipunkt Gradientenfunktion diff mit Lambdaausdrücken wie in der Vorlesung beschrieben. Die Lambdaausdrücke weren wie im Übungszettel bei der Integration verwendet. Weiterhin implementiere die Sigmoid Funktion sigmoid wie in der Vorlesung beschrieben sowie deren analytische Ableitungsfunktion dsigmoid. Fasse alles in der Klasse MLfun zusammen. Teste die sigmoid Funktion bei den Werten x={-1,0,1} sowie die numerische und analytisch berechneten Ableitungen an diesen Punkten. Trage die Ergebnisse unten ein.
function diff(f,x,h) {
return (f(x+h)-f(x-h))/(2*h)
}
function sigmoid(x) {
return 1/(1+exp(-x))
}
function dsigmoid(x) {
y=sigmoid(x)
return y*(1-y)
}
▸
ℂ
ℙ
[] |
✗
≡
|
▸
ℂ
ℙ
[] |
✗
≡
|
VEJB
Die sigmoid Methode (oder jede andere) muss über einen Lambda Ausdruck ((x) -> { return self.sigmoid(x); }
and diff übergeben werden, nicht direkt!
Ab hier sollen Algorithmen in Java mit dem integrierten JS Transpiler implementiert werden.
Aufgabe 2. Implementiere die Berechnung des perzeptrons gemäß der Vorlesung in Java sowie die Trainingsfunktion mit numerischer Ableitung der sigmoid Funktion. Fasse alles inklusive der MLfun Klasse (nure Methoden integriert) zu der Klasse ML zusammen. Die Methode neuronSum
berechnet nur die gewichtete Summation, die Methode neuron
berechnt die Ausgabe des gesamten Perzeptrons mit der sigmoid Funktion.
function m(x,P) {
W=slice(P,0,length(x)-2) // Teilarray [w1,w2] von P
b=P[length(x)-1] // letztes Element von P
sum=b
for(i=0;i<length(x);i++) sum+=(x[i]*W[i])
return sigmoid(sum)
}
// P=(w,b)=[w1,w2,b]
P=[random(),random(),random()]
function s(x,P) {
W=slice(P,0,length(x)-1)
b=P[length(x)]
sum=b
for(i=0;i<length(x);i++) sum+=(x[i]*W[i])
return sum
}
function train(m,P,data,epochs,alpha) {
function update(x,yt) {
y=m(x,P)
u=s(x,P)
err=(yt-y)
// df=dsigmoid(u)
df=diff(sigmoid,u,0.01)
for(k=0;k<length(x);k++) {
dw=err*alpha*df*x[k]
P[k]=P[k]+dw
}
// bias
P[length(P)-1]=P[length(P)-1]+err*alpha
}
for(e=0;e<epochs;e++) {
r=randint(0,length(data)-1) // wähle randomisiert einen Index 0-3 (Zeilenindizes der Datentabelle)
x=slice(data[r],0,1) // wähle diese Zeile aus und extrahiere die x Werte
y=data[r][2] // wähle diese Zeile aus und extrahiere den y Wert
update(x,y)
}
}
train(m,P,data,100,0.01)
▸
ℂ
ℙ
[] |
✗
≡
|
Aufgabe 3. Trainiere das Perzeptron für folgende Daten (Einfache logische Oder Funktion). Wann sollte man das Training abbrechen? Teste das trainierte Perzeptron mit den Eingabedaten. Notiere Erfahrungen und Ergebnisse.
// [[x1,x1,y]]
data=[
[0,0,0],
[0,1,1],
[1,0,1],
[1,1,1]
]
▸
ℂ
ℙ
[] |
✗
≡
|
cHVibGljIGNsYXNzIE1MIHsKICBmbG9hdCBbXSBQOwogIGludCBuaW47CiAgaW50IG5vdXQ7CiAgcHVibGljIE1MIChpbnQgaW5wdXRzKSB7CiAgICB0aGlzLlA9bmV3IGZsb2F0IFtpbnB1dHMrMV07CiAgICBmb3IoaW50IGk9MDtpPGlucHV0cztpKyspIHRoaXMuUFtpXT1NYXRoLnJhbmRvbSgpOwogICAgdGhpcy5QW2lucHV0cy0xXT1NYXRoLnJhbmRvbSgpOwogICAgdGhpcy5uaW49aW5wdXRzOwogICAgdGhpcy5ub3V0PTE7CiAgfQogIHB1YmxpYyBmbG9hdCBkaWZmKEZ1bmN0aW9uIDxGbG9hdCxGbG9hdD5mLCBmbG9hdCB4LCBmbG9hdCBoKSB7CiAgICByZXR1cm4gKGYuY2FsbCh4LWgpLWYuY2FsbCh4K2gpKS8oMipoKTsKICB9CiAgcHVibGljIGZsb2F0IHNpZ21vaWQoZmxvYXQgeCkgewogICAgcmV0dXJuIDEvKDErTWF0aC5leHAoLXgpKTsKICB9CiAgcHVibGljIGZsb2F0IGRzaWdtb2lkKGZsb2F0IHgpIHsKICAgIGZsb2F0IHk9dGhpcy5zaWdtb2lkKHgpOwogICAgcmV0dXJuIHkqKDEteSk7CiAgfQogIHB1YmxpYyBmbG9hdCBuZXVyb25TdW0oZmxvYXRbXSB4KSB7CiAgICBmbG9hdCBbXSBXPW5ldyBmbG9hdCBbXTsKICAgIGZvcihpbnQgaT0wO2k8dGhpcy5uaW47aSsrKSBXW2ldPXRoaXMuUFtpXTsKICAgIGZsb2F0ICAgIGI9dGhpcy5QW3RoaXMubmluXTsKICAgIGZsb2F0ICAgIHN1bT1iOwogICAgZm9yKGludCBpPTA7aTx0aGlzLm5pbjtpKyspIHN1bSs9KHhbaV0qV1tpXSk7CiAgICByZXR1cm4gc3VtOwogIH0KICBwdWJsaWMgZmxvYXQgbmV1cm9uKGZsb2F0W10geCkgewogICAgZmxvYXQgICAgdT10aGlzLm5ldXJvblN1bSh4LHRoaXMuUCk7CiAgICByZXR1cm4gICB0aGlzLnNpZ21vaWQodSk7CiAgfQogIHB1YmxpYyBmbG9hdCB1cGRhdGUoZmxvYXQgW10geCxmbG9hdCBbXSB5dCwgZmxvYXQgYWxwaGEpIHsKICAgIE1MIHNlbGYgPSB0aGlzOwogICAgZmxvYXQgeT10aGlzLm5ldXJvbih4KTsKICAgIGZsb2F0IHU9dGhpcy5uZXVyb25TdW0oeCk7CiAgICBmbG9hdCBlcnI9KHl0LXkpOwogICAgZmxvYXQgZGY7CiAgICAvLyBkZj10aGlzLmRzaWdtb2lkKHUpCiAgICBkZj10aGlzLmRpZmYoKHgpIC0+IHsgcmV0dXJuIHNlbGYuc2lnbW9pZCh4KTsgfSx1LDAuMDEpOwogICAgZm9yKGludCBrPTA7azx4Lmxlbmd0aDtrKyspIHsKICAgICAgZHc9ZXJyKmFscGhhKmRmKnhba107CiAgICAgIHRoaXMuUFtrXT10aGlzLlBba10rZHc7CiAgICB9CiAgICAvLyBiaWFzCiAgICBQW1AubGVuZ3RoLTFdPVBbbGVuZ3RoKFApLTFdK2VyciphbHBoYTsKICAgIHJldHVybiBlcnI7CiAgfQogIHB1YmxpYyBmbG9hdCB0cmFpbihmbG9hdCBbXVtdIGRhdGEsIGludCBlcG9jaHMsIGZsb2F0IGFscGhhKSB7CiAgICBmbG9hdCBlcnI7CiAgICBmb3IoaW50IGU9MDtlPGVwb2NocztlKyspIHsKICAgICAgaW50IHI9KGludCkoTWF0aC5yYW5kb20oKSAqIGRhdGEubGVuZ3RoKTsKICAgICAgZmxvYXQgW10geD1uZXcgZmxvYXRbXXtkYXRhW3JdWzBdLGRhdGFbcl1bMV19OwogICAgICBmbG9hdCAgICB5PWRhdGFbcl1bMl07CiAgICAgIGVycj10aGlzLnVwZGF0ZSh4LHksYWxwaGEpOwogICAgfQogICAgcmV0dXJuIGVycjsKICB9Cn0=
Aufgabe 4. Trainiere das Perzeptron für folgende Daten (Exklusive Oder Funktion). Kann das Perzeptron auch diesen Datensatz abbilden, d.h. konvergiert das Training? Wenn nicht, recherchiere nach dem EXOR Problem und Perzeptron/Neuron.
// [[x1,x1,y]]
data=[
[0,0,0],
[0,1,1],
[1,0,1],
[1,1,0]
]
▸
ℂ
ℙ
[] |
✗
≡
|