package Ġcom . trade shift . b lay ze . features Ċ Ċ import Ġcom . trade shift . b lay ze . Protos Ċ import Ġcom . trade shift . b lay ze . dto . Outcome Ċ import Ġcom . trade shift . b lay ze . log Student T Ċ import Ġkotlin . math .* Ċ Ċ /** Ċ Ġ* ĠA Ġfeature Ġfor Ġnumbers Ġthat Ġapproximately Ġfollow Ġa Ġnormal Ġdistribution , Ġe . g . Ġage , Ġamounts , Ġetc . Ċ Ġ* Ċ Ġ* ĠUses Ġa ĠNormal - inverse Ġgamma Ġprior Ġon Ġthe Ġparameters Ġof Ġthe Ġgaussian . ĠSee Ġhttps :// en . wikipedia . org / wiki / Con j ug ate _ prior # Continuous _ distributions Ċ Ġ* Ġand Ġhttps :// en . wikipedia . org / wiki / Student % 2 7 s _ t - distribution # General ized _ Student 's _ t - distribution Ċ Ġ* Ċ Ġ* ĠNote , Ġafter Ġmuch Ġdeli ber ation Ġwe 've Ġset Ġthe Ġfour Ġdefault Ġprior Ġhyper - parameters Ġto Ġzero . ĠFor Ġoutcomes Ġwith Ġzero Ġvariance Ġor Ġless Ġthan Ġtwo Ġsamples Ġwe Ġreturn Ċ Ġ* Ġthe Ġminimum Ġlog Ġprobability Ġof Ġthe Ġother Ġoutcomes . ĠIf Ġall Ġthe Ġoutcomes Ġare Ġundefined Ġ( e . g . Ġfirst Ġtime Ġyou Ġadd Ġa Ġgaussian Ġfeature ), Ġthe Ġfeature Ġreturns Ġ 0 Ġfor Ċ Ġ* Ġall Ġoutcomes , Ġeffectively Ġignoring Ġthe Ġfeature . ĠYes Ġthis Ġis Ġa Ġg iant Ġhack , Ġbut Ġit Ġworks , Ġand Ġafter Ġ 2 Ġdays Ġof Ġf idd ling Ġwith Ġthe Ġhyper - parameters Ġit Ġbecame Ċ Ġ* Ġapparent Ġthat Ġthere 'd Ġalways Ġbe Ġa Ġcounter Ġargument Ġagainst Ġa Ġcertain Ġset Ġof Ġhyper Ġpri ors . Ċ Ġ* Ċ Ġ* ĠThe Ġcurrent Ġsolution Ġsatisfies : Ċ Ġ* Ġ Ġ- ĠThe Ġgaussian Ġfeature Ġis Ġscale Ġand Ġshift Ġinvariant , Ġwhich Ġis Ġvery Ġnice Ġ( adding Ġpri ors Ġbreak Ġthis ) Ċ Ġ* Ġ Ġ- ĠAdding Ġnew Ġoutcomes Ġdoesn 't Ġbreak Ġthe Ġclassifier Ġ( with Ġpri ors , Ġnew Ġoutcomes Ġmight Ġbe Ġmore Ġor Ġless Ġlikely Ġthan Ġpreviously Ġobserved Ġoutcomes Ġwith Ġproperly Ġestimated Ġdistributions , Ġwhich Ġcan Ġquickly Ġover rule Ġother Ġfeatures ) Ċ Ġ* Ġ Ġ- ĠAdding Ġnew Ġgaussian Ġfeatures Ġdoesn 't Ġbreak Ġthe Ġclassifier Ġ( same Ġas Ġabove ) Ċ Ġ*/ Ċ class ĠGaussian Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġdefault Parameters : ĠGaussian . Parameters , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġestim ators : ĠMap < Outcome , ĠStreaming Estimator > Ċ ) Ġ: ĠFeature < Gaussian , ĠDouble , ĠGaussian . Parameters > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġmu 0 ĠPri or Ġmean ĊĠĠĠĠ Ġ* Ġ@ param Ġnu ĠPri or Ġmean Ġwas Ġestimated Ġfrom Ġnu Ġobservations ĊĠĠĠĠ Ġ* Ġ@ param Ġbeta Ġ 1 / 2 Ġprior Ġsum Ġof Ġsquared Ġde viations ĊĠĠĠĠ Ġ* Ġ@ param Ġalpha ĠPri or Ġvariance Ġwas Ġestimated Ġfrom Ġ 2 Â· alpha Ġobservations Ġwith Ġsample Ġmean Ġmu 0 Ġand Ġsum Ġof Ġsquared Ġde viations Ġ 2 Â· beta ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġhttps :// en . wikipedia . org / wiki / Con j ug ate _ prior # Continuous _ distributions Ġand Ġthe Ġdocs Ġof Ġ[ Gaussian ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThese Ġparameters Ġare Ġonly Ġused Ġin Ġ[ log Post er ior Predict ive ], Ġnot Ġ[ batch Update ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUnless Ġyou Ġreally Ġknow Ġwhat Ġyou 're Ġdoing , Ġyou Ġprobably Ġshouldn 't Ġchange Ġthese Ġfrom Ġthe Ġdefault Ġvalues . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠParameters ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmu 0 : ĠDouble Ġ= Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnu : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbeta : ĠDouble Ġ= Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalpha : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġnew Ġgaussian Ġfeature . ĊĠĠĠĠ Ġ* ĠUnless Ġyou Ġreally Ġknow Ġwhat Ġyou 're Ġdoing , Ġyou Ġshould Ġprobably Ġuse Ġthe Ġdefault Ġparameters . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġ[ Parameters ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( parameters : ĠParameters Ġ= ĠParameters ()) Ġ: Ġthis ( parameters , Ġmap Of ()) ĊĊĊĠĠĠ Ġoverride Ġfun Ġwith Parameters ( parameters : ĠParameters ): ĠGaussian Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGaussian ( parameters , Ġestim ators ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[ Feature . batch Update ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠParameters Ġare Ġnot Ġused . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġbatch Update ( updates : ĠList < Pair < Outcome , ĠDouble >>, Ġparameters : ĠParameters ?): ĠGaussian Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġestim ators . to Mutable Map () ĊĠĠĠĠĠĠĠ Ġfor Ġ(( outcome , Ġx ) Ġin Ġupdates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ outcome ] Ġ= Ġmap [ outcome ]?. add ( x ) Ġ?: ĠStreaming Estimator ( x ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠGaussian ( default Parameters , Ġmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlog Post er ior Predict ive ( outcome s : ĠSet < Outcome >, Ġvalue : ĠDouble , Ġparameters : ĠParameters ?): ĠMap < Outcome , ĠDouble > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġmutable Map Of < Outcome , ĠDouble ?> () ĊĠĠĠĠĠĠĠ Ġfor Ġ( outcome Ġin Ġoutcomes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults [ outcome ] Ġ= Ġlog Prop ability Outcome ( outcome , Ġvalue , Ġparameters ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠG iant Ġhack ĊĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġresults . values . filter NotNull (). min () Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġresults . map Ġ{ Ġ( k , Ġv ) Ġ-> Ġk Ġto Ġ( v Ġ?: Ġmin ) Ġ}. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġhttps :// en . wikipedia . org / wiki / Con j ug ate _ prior # Continuous _ distributions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġlog Prop ability Outcome ( outcome : ĠOut come , Ġvalue : ĠDouble , Ġparameters : ĠParameters ?): ĠDouble ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġparameters Ġ?: Ġdefault Parameters ĊĊĠĠĠĠĠĠĠ Ġval Ġest Ġ= Ġestim ators [ outcome ] ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġ( est ?. count Ġ?: Ġ 0 ). toDouble () ĊĠĠĠĠĠĠĠ Ġval Ġmu Ġ= Ġest ?. mean Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġsigma Ġ= Ġest ?. st dev Ġ?: Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ< Ġ 2 Ġ|| Ġsigma Ġ== Ġ 0 . 0 ) Ġ{ Ġ// ĠHack ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġp mu Ġ= Ġ( p . nu Ġ* Ġp . mu 0 Ġ+ Ġn Ġ* Ġmu ) Ġ/ Ġ( p . nu Ġ+ Ġn ) ĊĠĠĠĠĠĠĠ Ġval Ġp nu Ġ= Ġ( p . nu Ġ+ Ġn ) ĊĠĠĠĠĠĠĠ Ġval Ġp alpha Ġ= Ġ( p . alpha Ġ+ Ġn Ġ/ Ġ 2 . 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġss Ġ= Ġsigma . pow ( 2 . 0 ) Ġ* Ġ( n Ġ- Ġ 1 ) Ġ// Ġn - 1 Ġhere , Ġsince Ġthe Ġway Ġstd Ġis Ġcalculated ĊĠĠĠĠĠĠĠ Ġval Ġp beta Ġ= Ġ( p . beta Ġ+ Ġ( 1 . 0 Ġ/ Ġ 2 . 0 ) Ġ* Ġss Ġ+ Ġn Ġ* Ġp . nu Ġ/ Ġ( n Ġ+ Ġp . nu ) Ġ* Ġ( mu Ġ- Ġp . mu 0 ). pow ( 2 . 0 ) Ġ/ Ġ 2 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlog Student T ( value , Ġ 2 Ġ* Ġp alpha , Ġp mu , Ġsqrt ( pb eta Ġ* Ġ( pn u Ġ+ Ġ 1 ) Ġ/ Ġ( p alpha Ġ* Ġp nu ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠB . ĠP . ĠW elf ord Ġ( 1 9 6 2 ). Ġ" Note Ġon Ġa Ġmethod Ġfor Ġcalculating Ġcorrected Ġsums Ġof Ġsquares Ġand Ġproducts ". ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠStreaming Estimator Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmean : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġm 2 : ĠDouble ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( x : ĠDouble ) Ġ: Ġthis ( 1 , Ġx , Ġ 0 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( x : ĠDouble ): ĠStreaming Estimator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ( count , Ġmean , Ġm 2 ) Ġ= ĠTrip le ( count , Ġmean , Ġm 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġx Ġ- Ġmean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmean Ġ+= Ġdelta Ġ/ Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta 2 Ġ= Ġx Ġ- Ġmean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm 2 Ġ+= Ġdelta Ġ* Ġdelta 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStreaming Estimator ( count , Ġmean , Ġm 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġst dev : ĠDouble Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsqrt ( m 2 Ġ/ Ġ( count Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġcomponent 1 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcount ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġcomponent 2 (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmean ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġcomponent 3 (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġst dev ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġto Proto (): ĠProto s . Streaming Estimator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠProto s . Streaming Estimator . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Count ( count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Mean ( mean ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set M 2 ( m 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom Proto ( proto : ĠProto s . Streaming Estimator ): ĠStreaming Estimator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStreaming Estimator ( proto . count , Ġproto . mean , Ġproto . m 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Proto (): ĠProto s . Gaussian Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠProto s . Gaussian . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Mu 0 ( default Parameters . mu 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Nu ( default Parameters . nu ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Beta ( default Parameters . beta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Alpha ( default Parameters . alpha ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put All Est im ators ( estimators . map Values Ġ{ Ġit . value . to Proto () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Proto ( proto : ĠProto s . Gaussian ): ĠGaussian Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGaussian ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameters ( proto . mu 0 , Ġproto . nu , Ġproto . beta , Ġproto . alpha ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproto . estimators Map . map Values Ġ{ ĠStreaming Estimator . from Proto ( it . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ