Perceptron: Difference between revisions

2,697 bytes added ,  4 years ago
Forth version
m (Preapre for Forth)
(Forth version)
Line 20:
 
=={{header|Forth}}==
{{works with|GNU Forth}}
Where it says <code>[email protected]</code> it should say <code>f&#64;</code>.
<lang Forth>require random.fs
here seed !
 
warnings off
 
( THE PERCEPTRON )
 
: randomWeight 2000 random 1000 - s>f 1000e f/ ;
: createPerceptron create dup , 0 ?DO randomWeight f, LOOP ;
 
variable arity
variable ^weights
variable ^inputs
 
: perceptron! dup @ arity ! cell+ ^weights ! ;
: inputs! ^inputs ! ;
 
0.0001e fconstant learningConstant
: activate 0e f> IF 1e ELSE -1e THEN ;
 
: feedForward
^weights @ ^inputs @ 0e
arity @ 0 ?DO
dup f@ float + swap
dup f@ float + swap
f* f+
LOOP 2drop activate ;
 
: train
feedForward f- learningConstant f*
^weights @ ^inputs @
arity @ 0 ?DO
fdup dup f@ f* float + swap
dup f@ f+ dup f! float + swap
LOOP 2drop fdrop ;
 
( THE TRAINER )
 
create point 0e f, 0e f, 1e f, \ x y bias
 
: x point ;
: y point float + ;
: randomX 640 random s>f ;
: randomY 360 random s>f ;
 
\ y = Ax + B
2e fconstant A
1e fconstant B
 
: randomizePoint
randomY fdup y f!
randomX fdup x f!
A f* B f+ f< IF -1e ELSE 1e THEN ;
 
3 createPerceptron myPerceptron
variable trainings
10000 constant #rounds
 
: setup 0 ; \ success counter
: calculate s>f #rounds s>f f/ 100e f* ;
: report ." After " trainings @ . ." trainings: "
calculate f. ." % accurate" cr ;
: check learningConstant f~ IF 1+ THEN ;
: evaluate randomizePoint feedForward check ;
: evaluate setup #rounds 0 ?DO evaluate LOOP report ;
 
: tally 1 trainings +! ;
: timesTrain 0 ?DO randomizePoint train tally LOOP ;
 
: initialize
myPerceptron perceptron!
point inputs!
0 trainings ! ;
: go
initialize evaluate
1 timesTrain evaluate
1 timesTrain evaluate
1 timesTrain evaluate
1 timesTrain evaluate
1 timesTrain evaluate
5 timesTrain evaluate
10 timesTrain evaluate
30 timesTrain evaluate
50 timesTrain evaluate
100 timesTrain evaluate
300 timesTrain evaluate
500 timesTrain evaluate ;
 
go bye</lang>
Example output:
<pre>After 0 trainings: 10.16 % accurate
After 1 trainings: 7.43 % accurate
After 2 trainings: 7.71 % accurate
After 3 trainings: 4.93 % accurate
After 4 trainings: 3.11 % accurate
After 5 trainings: 0.6 % accurate
After 10 trainings: 48.72 % accurate
After 20 trainings: 85.55 % accurate
After 50 trainings: 86.36 % accurate
After 100 trainings: 98.59 % accurate
After 200 trainings: 98.84 % accurate
After 500 trainings: 95.86 % accurate
After 1000 trainings: 99.8 % accurate</pre>
 
=={{header|Go}}==
Anonymous user