package Ġcom . github . m rob ak owski . per ce ptr on Ċ Ċ import Ġgo lem .* Ċ import Ġgo lem . matrix . Matrix Ċ Ċ class ĠNe uron ( ĊĠĠĠĠĠĠĠ Ġnum Inputs : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġactivation Function Un ip olar ( it : ĠMatrix < Double >) Ġ= Ġit . map Mat Ġ{ Ġ( it Ġ>= Ġ 0 ). toDouble () Ġ} ĊĠĠĠ Ġfun Ġactivation Function B ip olar ( it : ĠMatrix < Double >) Ġ= Ġit . map Mat Ġ{ Ġif Ġ( it Ġ>= Ġ 0 ) Ġ 1 . 0 Ġelse Ġ- 1 . 0 Ġ} ĊĊĠĠĠ Ġvar Ġweights Ġ= Ġrand n ( num Inputs Ġ+ Ġ 1 ) ĊĊĠĠĠ Ġfun Ġresponse ( x : ĠMatrix < Double >, Ġb ip olar : ĠBoolean Ġ= Ġfalse ) Ġ= Ġif Ġ(! bip olar ) ĊĠĠĠĠĠĠĠ Ġactivation Function Un ip olar ( net ( x )) ĊĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġactivation Function B ip olar ( x ) ĊĊĠĠĠ Ġfun Ġnet ( x : ĠMatrix < Double >) Ġ= Ġweights Ġ* Ġx . extend With Columns ( mat [ 1 ]). T ĊĠĠĠ Ġfun Ġper ce ptr on Learn ( examples : ĠList < DataPoint >, Ġtrain Rate : ĠDouble Ġ= Ġ 0 . 1 , Ġmax Epoch s : ĠInt Ġ= Ġ 5 ): ĠPair < Double , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast Error Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġnum Iter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( epoch Ġin Ġ 1 .. max Epoch s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Iter Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh uffled Ġ= Ġexamples . shuffle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Error Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( inputs , Ġdesired Output ) Ġin Ġsh uffled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġresponse ( inputs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġdesired Output Ġ- Ġoutput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Error Ġ+= Ġabs ( error ). sum () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweights Ġ+= Ġtrain Rate Ġ* Ġerror Ġ* Ġinputs . extend With Columns ( mat [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Epoch Ġ#$ epoch Ġerr =$ total Error ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Error Ġ= Ġtotal Error ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Error Ġ== Ġ 0 . 0 ) Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlast Error Ġto Ġnum Iter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġad al ine Learn ( examples : ĠList < DataPoint >, Ġtrain Rate : ĠDouble Ġ= Ġ 0 . 1 , Ġmax Epoch s : ĠInt Ġ= Ġ 5 , Ġeps : ĠDouble Ġ= Ġ 0 . 0 0 1 ): ĠPair < Double , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast Error Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġnum Iter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( epoch Ġin Ġ 1 .. max Epoch s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Iter Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh uffled Ġ= Ġexamples . shuffle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Error Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( inputs , Ġun ip olar Out , Ġb ip olar Out ) Ġin Ġsh uffled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġnet ( inputs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġb ip olar Out Ġ- Ġoutput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Error Ġ+= Ġ( error Ġem ul Ġerror ). sum () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweights Ġ+= Ġtrain Rate Ġ* Ġerror Ġ* Ġinputs . extend With Columns ( mat [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Error Ġ/= Ġsh uffled . size Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Epoch Ġ#$ epoch Ġerr =$ total Error Ġ( ad al ine )") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Error Ġ= Ġtotal Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Error Ġin Ġ- eps .. eps ) Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlast Error Ġto Ġnum Iter ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠData Point ( val Ġinput : ĠMatrix < Double >, Ġval Ġun ip olar Out : ĠMatrix < Double >, Ġvar Ġb ip olar Out : ĠMatrix < Double >) Ġ{ ĊĠĠĠ Ġconstructor ( combined : ĠMatrix < Double >) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcombined [ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 .. ( combined . num Rows () Ġ- Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 .. ( combined . num Cols () Ġ- Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcombined [ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 .. ( combined . num Rows () Ġ- Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombined . num Cols () Ġ- Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcombined [ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 .. ( combined . num Rows () Ġ- Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombined . num Cols () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ] ĊĠĠĠ Ġ) Ċ }