class Example{
int x1, x2;
double o;
Example(int x1, int x2, double o){
this.x1 = x1;
this.x2 = x2;
this.o = o;
}
}
class DeltaRulePerceptron {
double w1, w2;
double dw1, dw2;
double n;
DeltaRulePerceptron(){
//Random values
w1 = -0.8;
w2 = 0.7;
n = 0.05;
}
public double computeOutput(Example example){
return example.x1 * w1 + example.x2*w2;
}
public void trianWithDelta(Example[] examples){
for(int i=0;i<1000;++i){
//System.out.println("Iteration #"+i);
dw1 = 0;
dw2 = 0;
for(Example ex:examples){
double o = computeOutput(ex);
double t = ex.o;
//System.out.println("o = "+o+" t = "+t);
dw1 = dw1 + n*(t-o)*ex.x1;
dw2 = dw2 + n*(t-o)*ex.x2;
}
w1 += dw1;
w2 += dw2;
}
}
public static void main
(String[] args
){ DeltaRulePerceptron dr = new DeltaRulePerceptron();
//AND boolean function
Example[] examples = new Example[]{
new Example(-1, -1, -1),
new Example(-1 , 1, -1),
new Example( 1, -1, -1),
new Example( 1, 1, 1)
};
dr.trianWithDelta(examples);
System.
out.
println("Trained weights : "+dr.
w1+" "+dr.
w2);
//Test
System.
out.
println(dr.
sign(dr.
computeOutput(examples
[0]))); System.
out.
println(dr.
sign(dr.
computeOutput(examples
[1]))); System.
out.
println(dr.
sign(dr.
computeOutput(examples
[2]))); System.
out.
println(dr.
sign(dr.
computeOutput(examples
[3])));
}
public int sign(double output){
return output>0?+1:-1;
}
}
CmNsYXNzIEV4YW1wbGV7CiAgICBpbnQgeDEsIHgyOwogICAgZG91YmxlIG87CiAgICBFeGFtcGxlKGludCB4MSwgaW50IHgyLCBkb3VibGUgbyl7CiAgICAgICAgdGhpcy54MSA9IHgxOwogICAgICAgIHRoaXMueDIgPSB4MjsKICAgICAgICB0aGlzLm8gPSBvOwogICAgfQp9CgpjbGFzcyBEZWx0YVJ1bGVQZXJjZXB0cm9uIHsKICAgIGRvdWJsZSB3MSwgdzI7CiAgICBkb3VibGUgZHcxLCBkdzI7CiAgICBkb3VibGUgbjsKICAgIAogICAgRGVsdGFSdWxlUGVyY2VwdHJvbigpewogICAgICAgIC8vUmFuZG9tIHZhbHVlcwogICAgICAgIHcxID0gLTAuODsKICAgICAgICB3MiA9IDAuNzsKICAgICAgICBuID0gMC4wNTsKICAgIH0KICAgIAogICAgcHVibGljIGRvdWJsZSBjb21wdXRlT3V0cHV0KEV4YW1wbGUgZXhhbXBsZSl7CiAgICAgICAgcmV0dXJuIGV4YW1wbGUueDEgKiB3MSArIGV4YW1wbGUueDIqdzI7CiAgICB9CiAgICAKICAgIHB1YmxpYyB2b2lkIHRyaWFuV2l0aERlbHRhKEV4YW1wbGVbXSBleGFtcGxlcyl7IAogICAgICAgIGZvcihpbnQgaT0wO2k8MTAwMDsrK2kpewogICAgICAgICAgIAogICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiSXRlcmF0aW9uICMiK2kpOwogICAgICAgICAgICBkdzEgPSAwOwogICAgICAgICAgICBkdzIgPSAwOwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yKEV4YW1wbGUgZXg6ZXhhbXBsZXMpewogICAgICAgICAgICAgICAgZG91YmxlIG8gPSBjb21wdXRlT3V0cHV0KGV4KTsKICAgICAgICAgICAgICAgIGRvdWJsZSB0ID0gZXgubzsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm8gPSAiK28rIiB0ID0gIit0KTsgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGR3MSA9IGR3MSArIG4qKHQtbykqZXgueDE7CiAgICAgICAgICAgICAgICBkdzIgPSBkdzIgKyBuKih0LW8pKmV4LngyOwogICAgICAgICAgICB9IAogICAgICAgICAgICAgCiAgICAgICAgICAgIHcxICs9IGR3MTsKICAgICAgICAgICAgdzIgKz0gZHcyOyAKICAgICAgICB9ICAgICAgICAKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CiAgICAgICAgRGVsdGFSdWxlUGVyY2VwdHJvbiBkciA9IG5ldyBEZWx0YVJ1bGVQZXJjZXB0cm9uKCk7IAogICAgICAgIAogICAgICAgIC8vQU5EIGJvb2xlYW4gZnVuY3Rpb24KICAgICAgICBFeGFtcGxlW10gZXhhbXBsZXMgPSBuZXcgRXhhbXBsZVtdewogICAgICAgICAgICBuZXcgRXhhbXBsZSgtMSwgLTEsIC0xKSwKICAgICAgICAgICAgbmV3IEV4YW1wbGUoLTEgLCAxLCAtMSksCiAgICAgICAgICAgIG5ldyBFeGFtcGxlKCAxLCAtMSwgLTEpLAogICAgICAgICAgICBuZXcgRXhhbXBsZSggMSwgIDEsIDEpCiAgICAgICAgfTsKICAgICAgICBkci50cmlhbldpdGhEZWx0YShleGFtcGxlcyk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFpbmVkIHdlaWdodHMgOiAiK2RyLncxKyIgIitkci53Mik7CiAgICAgICAgCiAgICAgICAgLy9UZXN0CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRyLnNpZ24oZHIuY29tcHV0ZU91dHB1dChleGFtcGxlc1swXSkpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZHIuc2lnbihkci5jb21wdXRlT3V0cHV0KGV4YW1wbGVzWzFdKSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkci5zaWduKGRyLmNvbXB1dGVPdXRwdXQoZXhhbXBsZXNbMl0pKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRyLnNpZ24oZHIuY29tcHV0ZU91dHB1dChleGFtcGxlc1szXSkpKTsKICAgICAgICAKICAgICAgICAKICAgIH0KICAgIAogICAgcHVibGljIGludCBzaWduKGRvdWJsZSBvdXRwdXQpewogICAgICAgIHJldHVybiBvdXRwdXQ+MD8rMTotMTsKICAgIH0KfQo=