From 5ea024b9cd8c5ec14df550e4ad7bdeb75f68e754 Mon Sep 17 00:00:00 2001 From: Morten Hjorth-Jensen Date: Mon, 23 Oct 2023 07:29:30 +0200 Subject: [PATCH] update --- .../_build/.doctrees/environment.pickle | Bin 484391 -> 530597 bytes .../_build/.doctrees/exercisesweek43.doctree | Bin 0 -> 20983 bytes .../_build/.doctrees/intro.doctree | Bin 53176 -> 53219 bytes .../_build/.doctrees/week43.doctree | Bin 0 -> 844572 bytes .../_build/html/_images/week43_15_2.png | Bin 0 -> 27610 bytes .../_build/html/_images/week43_20_1.png | Bin 0 -> 4432 bytes .../_build/html/_images/week43_43_1.png | Bin 0 -> 37317 bytes .../_build/html/_images/week43_43_2.png | Bin 0 -> 47458 bytes .../_build/html/_images/week43_47_0.png | Bin 0 -> 41793 bytes .../_build/html/_images/week43_47_1.png | Bin 0 -> 47022 bytes .../html/_sources/exercisesweek43.ipynb | 169 + .../_build/html/_sources/week43.ipynb | 6035 +++++++++++++ .../_build/html/exercisesweek43.html | 654 ++ doc/LectureNotes/_build/html/genindex.html | 10 + doc/LectureNotes/_build/html/intro.html | 10 + doc/LectureNotes/_build/html/objects.inv | Bin 1216 -> 1259 bytes doc/LectureNotes/_build/html/search.html | 10 + doc/LectureNotes/_build/html/searchindex.js | 2 +- doc/LectureNotes/_build/html/week43.html | 6476 ++++++++++++++ .../jupyter_execute/exercisesweek43.ipynb | 169 + .../jupyter_execute/exercisesweek43.txt | 0 .../_build/jupyter_execute/week43.ipynb | 7761 +++++++++++++++++ .../_build/jupyter_execute/week43.py | 4183 +++++++++ .../_build/jupyter_execute/week43_15_2.png | Bin 0 -> 27610 bytes .../_build/jupyter_execute/week43_20_1.png | Bin 0 -> 4432 bytes .../_build/jupyter_execute/week43_43_1.png | Bin 0 -> 37317 bytes .../_build/jupyter_execute/week43_43_2.png | Bin 0 -> 47458 bytes .../_build/jupyter_execute/week43_47_0.png | Bin 0 -> 41793 bytes .../_build/jupyter_execute/week43_47_1.png | Bin 0 -> 47022 bytes doc/LectureNotes/_toc.yml | 2 + doc/LectureNotes/exercisesweek43.ipynb | 169 + doc/LectureNotes/week43.ipynb | 6035 +++++++++++++ 32 files changed, 31684 insertions(+), 1 deletion(-) create mode 100644 doc/LectureNotes/_build/.doctrees/exercisesweek43.doctree create mode 100644 doc/LectureNotes/_build/.doctrees/week43.doctree create mode 100644 doc/LectureNotes/_build/html/_images/week43_15_2.png create mode 100644 doc/LectureNotes/_build/html/_images/week43_20_1.png create mode 100644 doc/LectureNotes/_build/html/_images/week43_43_1.png create mode 100644 doc/LectureNotes/_build/html/_images/week43_43_2.png create mode 100644 doc/LectureNotes/_build/html/_images/week43_47_0.png create mode 100644 doc/LectureNotes/_build/html/_images/week43_47_1.png create mode 100644 doc/LectureNotes/_build/html/_sources/exercisesweek43.ipynb create mode 100644 doc/LectureNotes/_build/html/_sources/week43.ipynb create mode 100644 doc/LectureNotes/_build/html/exercisesweek43.html create mode 100644 doc/LectureNotes/_build/html/week43.html create mode 100644 doc/LectureNotes/_build/jupyter_execute/exercisesweek43.ipynb create mode 100644 doc/LectureNotes/_build/jupyter_execute/exercisesweek43.txt create mode 100644 doc/LectureNotes/_build/jupyter_execute/week43.ipynb create mode 100644 doc/LectureNotes/_build/jupyter_execute/week43.py create mode 100644 doc/LectureNotes/_build/jupyter_execute/week43_15_2.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/week43_20_1.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/week43_43_1.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/week43_43_2.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/week43_47_0.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/week43_47_1.png create mode 100644 doc/LectureNotes/exercisesweek43.ipynb create mode 100644 doc/LectureNotes/week43.ipynb diff --git a/doc/LectureNotes/_build/.doctrees/environment.pickle b/doc/LectureNotes/_build/.doctrees/environment.pickle index a19493b16cc634df885ff280cd2ae9e0595fcdfe..a98aad57d05ad7a9b8981a94c7f6dcc525ddbef9 100644 GIT binary patch literal 530597 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

Kd#mmpclK$wKFsE9 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%0DA)RUSmDZ$7v4b)X41Z#P>2^TZ7Xbuf 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�?)DN&!kH<*Er?LyxoDFKt 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

diff --git a/doc/LectureNotes/_build/html/intro.html b/doc/LectureNotes/_build/html/intro.html index 54b20091b..a13e1f18a 100644 --- a/doc/LectureNotes/_build/html/intro.html +++ b/doc/LectureNotes/_build/html/intro.html @@ -330,6 +330,16 @@ const thebe_selector_output = ".output, .cell_output" Week 42 Constructing a Neural Network code with introduction to Tensor flow +

  • + + Exercises weeks 43 and 44 + +
  • +
  • + + Week 43: Deep Learning: Constructing a Neural Network code and solving differential equations + +
  • diff --git a/doc/LectureNotes/_build/html/objects.inv b/doc/LectureNotes/_build/html/objects.inv index cf4ce901e65a04276648cd1d00d36d06cf7c4475..ac264ab1cd950f804a3909866207838748900786 100644 GIT binary patch delta 1158 zcmV;11bO?w3F`@vbbpPPOLL<*5XbL)3LTRw&z6nx^X8c(`=~rzNp|NfL&w$zBt{Z( zyq|ts5)c7$W=@G4`uA^1t?nj0&{Bh(5T&zqCQ|ZcLekpy+d&sOxn&%vB#*F{pcE54 zYMzfnPGjfwwPJb3_?}R51CWs$A&*pM~<|4C#u!ynqC* z83L|fbU1> z51Qx$kiRPHC|>$oxeP?Htkaz;+((uHRmRa^wvzFbm4DP^T2Tsa@??Xlc2Z1{i|x0~ zWy4(sxGTrK?r3_Vmf7XMxvEN#Z%kncXm2OHgT!+Obp&{wb`rGrs6OJxNQ{+C zlOADqo_{b46J|Za{5)YECd_+;#d*RaOjz^?%kzX~n6T^-R_6(;Fk#gtB$Km*WD+DK zlO7>HPl&^WxJQ_tCrm>GMbO10TarY3zy!oWz~TDlArRQKc0BVpZ;(VqRrogT5S*cpOg~kvJd{cSYi#h}>hjFN_Ly*^9eICi2$!lf~D2*4YD< z9)H08^ulXw&g&Vd>oD!Bc7ni=Fqg1X6x38OnnwyuFY3nNY;`Ae&$o0BkNYuh7mmv(f=a;C8_9YDyFO@^n&1#5FB0V8eV2H6p4Y~ISu8wT{dq-Fp^ zw|Bi0;hBu&8h>v~R;9K9;hx!!A}Xn1)Q%M{jIE@pT@BL= zYW{4%pZWY*-NPRwE`Z{`3`S5R`N_OAtm%F!cOvt3XRGo0gDfRz*HiI)hN4Ex8?-c} z2hM&}&8ijy!G$ll_)Jjs;mznVYz=-#aOCAWG|E|`-}j?olkj_kW3AR59}97*WPj!t zKdNNhCnaN#l#JIOei zNl*I)(jCw7X$H}-Tlr1O!DI80;Dfqf2^Qpv2kYI3XW$Blt9i}J6C@kW&XzzG#^LN|8;2O<{BV3&j0`b delta 1115 zcmV-h1f=`x3BU=Ebbp1HOLL<*5PxWw1?c_j94RS)1PB*DY$d?I8YS|wLUF77JaiEesLMA~eCV14m zABU92PU~yM@|5w6P;vv1k{cn9RHoz}DoJzvqmM$qwy2=}+JAv3k-r(z6?=IB30yM- zT>q@7MrRZuN2U+t3ZNvn=qSfeTWlP{#t!>U@HdfH24WrZ{ZcJq8X`;`;SrKb8ixpX z+Pv1@kcT&rR3-=G_Zx#_!wWf7`}4@s3<%{Zxur^pK*B@5w5}*xl({i?2l^n=HiB6| zX;z=C$e7YB34fTH2ejt(aa3g~q$b}X(L$0tYN7-+BEpNAvZD215nwGG>k1NP%n~i( zGsH50SUSWtS5WM8XyV?G8z~AbyC;O8_!-GW3-ptp?1Qp7zJ5oO1(2^oUEPvt7$#i}lMsxXf%1*(jq!R#dC2`j0ow11)$+|UL4ORoqa_kg|3(aJR`?dIzpHal}zwVGE54kp@C3PhXlB z&cvNaD{L_?s8Wjmu$Ojn-^kqOJNHB;1a0-B84>I{#z7zt*pc@j$(mdgEafaa=*tm_ z$MLi=5(kXLT_f>tjND_BE{qkNjTd)~naGRrH^J9A>*PQs2e6NxdyUL#Jp*-fq5ag( zeSdW6Rhj-?P}6s49w{&rr0au|)$_}}-_Z;rrLiNL5vV$bTWMXfIZg_$ZD+?U?dhK7 zOye{;fRHC!3{Q;;cGOM*M%wrdvSXl;d6Ahf4Cqfu&Dw-&?|Lu9YfrBhHj4FQG;E}P z|NP;)<_2?(w^ER%WU=X_8m~XdQi67q5YK05)Y$UYBMr%cv!7KH)pB5P=^I>rW>EFv z&B8Ej=zbq} +

  • + + Exercises weeks 43 and 44 + +
  • +
  • + + Week 43: Deep Learning: Constructing a Neural Network code and solving differential equations + +
  • diff --git a/doc/LectureNotes/_build/html/searchindex.js b/doc/LectureNotes/_build/html/searchindex.js index 5ad526d91..fbe082289 100644 --- a/doc/LectureNotes/_build/html/searchindex.js +++ b/doc/LectureNotes/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["chapter1","chapter10","chapter11","chapter12","chapter13","chapter2","chapter3","chapter4","chapter5","chapter6","chapter7","chapter8","chapter9","chapteroptimization","clustering","exercisesweek34","exercisesweek35","exercisesweek36","exercisesweek37","exercisesweek38","exercisesweek39","exercisesweek41","exercisesweek42","intro","linalg","project1","project2","schedule","statistics","teachers","textbooks","week34","week35","week36","week37","week38","week39","week40","week41","week42"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["chapter1.ipynb","chapter10.ipynb","chapter11.ipynb","chapter12.ipynb","chapter13.ipynb","chapter2.ipynb","chapter3.ipynb","chapter4.ipynb","chapter5.ipynb","chapter6.ipynb","chapter7.ipynb","chapter8.ipynb","chapter9.ipynb","chapteroptimization.ipynb","clustering.ipynb","exercisesweek34.ipynb","exercisesweek35.ipynb","exercisesweek36.ipynb","exercisesweek37.ipynb","exercisesweek38.ipynb","exercisesweek39.ipynb","exercisesweek41.ipynb","exercisesweek42.ipynb","intro.md","linalg.ipynb","project1.ipynb","project2.ipynb","schedule.md","statistics.ipynb","teachers.md","textbooks.md","week34.ipynb","week35.ipynb","week36.ipynb","week37.ipynb","week38.ipynb","week39.ipynb","week40.ipynb","week41.ipynb","week42.ipynb"],objects:{},objnames:{},objtypes:{},terms:{"0":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,24,25,26,28,29,31,32,33,34,35,36,37,38,39],"00":[0,1,5,6,9,11,31,32,35,38,39],"000":[1,3,38,39],"0000":9,"00000":9,"000000":[5,11,31,32],"00000000e":[5,32,35,38],"0000164":21,"000054":31,"0000747":21,"0001":[1,17,38,39],"0001042":[],"0001225":32,"00012934":[],"00015239":[],"0001539814498783133":[],"00016826":[],"00018647":[],"00019432":[],"00019883":[],"00019998":5,"00020665":[],"00021438167895478945":[],"00022035":[],"00022902":[],"0002364":[],"0002382102844775691":35,"00024087":5,"0002442":[],"00025381":[],"00027064":[],"00028129":[],"00029012":5,"00029993":[],"00031174":[],"00031535148309577417":6,"00031535148309580783":6,"00033136014047192484":9,"0003324":[],"00034548":[],"00034944":5,"00036838":[],"00038288":[],"00040825":[],"000417932":2,"00042089":5,"00042432":[],"00045244":[],"000464088":2,"00047025":[],"00048049":[],"00048325":[],"00050142":[],"00050694":5,"00052115":[],"00053008":[],"0005557":[],"00057757":[],"00058016":6,"00060705":6,"00061058":5,"00061585":[],"00062595":6,"00063364":34,"00063862":34,"00064009":[],"0006527":[],"00066668":6,"00067395":[],"00068088":34,"00068251":[],"00068734":6,"00068946":6,"00070937":[],"00072412":[],"00073541":5,"00075597":34,"00075639":[],"00076495":6,"00076617":32,"00076905":6,"0007698473260556325":6,"0007698473260556343":6,"00078616":[],"00079129":6,"00079910":34,"00079968":5,"00081564":[],"00083346":34,"00083826":[],"00084705":6,"00085889":6,"00086063":32,"00087126":[],"00087697":6,"00088573":5,"00089187":34,"00090992":32,"00091628":[],"00092647":6,"000929":[],"00092904":34,"0009485400848532":[],"00096314":5,"00096557":[],"001":[1,2,8,13,17,35,36,38,39],"00100519":6,"00102956":[],"00104613":[],"0010479245926411787":[6,34],"00105081":6,"00105497":[],"00106677":5,"00107008":[],"00107405":6,"00111756":6,"00114101":[],"0011526":6,"00115506":32,"00115669":32,"00115999":5,"00117627":[],"00118508":6,"00118591":[],"00119699":34,"00125459":21,"00126452":[],"00128479":5,"00131428":[],"001323":6,"00134327e":[],"00137818":6,"00139705":5,"00140139":[],"00140849":34,"00143234":21,"00145652":[],"00148047":21,"00148709":[],"00149311":6,"00149956":6,"00152117":6,"00154733":5,"00154860":34,"00155308":[],"00156376":6,"00161414":[],"00163526":21,"00168251":5,"00169021":21,"00170724":[],"00172117":[],"00172452":[],"00174276":6,"00175331":6,"00178871":[],"00182747":32,"00183398":32,"00183869":[],"00186347":5,"00186362":[],"00186694":21,"001880":5,"00190742":[],"00192967":21,"00198187":[],"00199495":[],"00200":8,"00202624":5,"00202679":[],"00202756":6,"00203959":[],"00211371":[],"00213144":21,"00217499":6,"00219194":34,"00219502":[],"00219624":[],"00220306":21,"00224413":5,"00225484":[],"00225909":[],"00228742":6,"00229911":[],"00234197":[],"0023548":6,"002381316302584886":6,"0023813163025848865":6,"00242398":[],"00242847":[],"00242954":34,"00242999":6,"00243186":6,"00243341":21,"0024401":5,"00245177":[],"0024598":[],"00249435":6,"00249831":[],"00251517":21,"00254359":32,"00259385":[],"00266858":2,"00267887":[],"00270244":5,"00272586":[],"00274989":6,"00277816":21,"00283853":32,"00286972":[],"00287151":21,"00289724":6,"0029114":[],"00292838":[],"00293132":[],"00293838":5,"0030207":[],"00305172":[],"003100":31,"00310113":2,"00312361":6,"00313452":21,"00313577":[],"00315593":6,"00316561":[],"00317175":21,"0032153180657605116":[6,34],"00323332":6,"00324512":[],"00324969":[],"0032542":5,"00325450":34,"00327833":21,"003301":6,"00334743":[],"00335448":[],"00335936":[],"0033955154592040923":[6,34],"00341073e":[],"00346394":[],"00348543":31,"00353575":32,"00353823":5,"00354492":[],"00358844":[],"00359612":[],"003620":31,"00362111":21,"0036237":6,"0036367":6,"0036718":32,"00369758":6,"00370554":[],"0037095":[],"00374279":21,"00375475":[],"003755":[],"00379522":[],"0038332550504751595":35,"0038335":6,"00383872":[],"003909404072811221":[6,34],"00391839":5,"00392139":[],"00396398":[],"00398509":[],"0039987":6,"004":[5,33,34],"004091940707753925":[6,34],"00410387":6,"00410478":6,"00410646":[],"00411073":[],"004113634617443131":[6,32],"00411363461744314":[6,32],"004113634617443147":[6,32],"00413413":21,"0041559863458613296":[6,34],"00420072":34,"00424046":[],"00424909":2,"00424967":6,"00426027":5,"00426531":[],"00427304":21,"00431775":24,"00433417":11,"00439287":[],"00440346":6,"00440395":[],"00441613":[],"00443743":6,"00445655":11,"00446979":[],"00447992":11,"004480":11,"00451679":[],"00453622":[],"00455536":[],"004579219539673834":[6,34],"00458878":6,"00460304":[],"00460405":32,"004610275230656182":[6,34],"00462287":6,"00463639":32,"00465099":34,"00469926":[],"00471782":5,"00471983":21,"00472199":6,"00472512":6,"00472549":[],"00474485":[],"00478655":[],"00480366":[],"00480371":[],"0048526":[],"00487843":21,"0048938":[],"0049544":6,"004999999999999994":[],"005000000000000001":0,"00502702":[],"00504808":[],"00512927":5,"00517114":6,"00519105":[],"00526348":6,"0053018":6,"00537764":[],"00538851":21,"00542313":[],"00550379":32,"00552246":32,"00554552":6,"00555311":[],"00556826":6,"00556958":21,"0055941":[],"00562524":32,"0056799":5,"00569405":32,"00575271":[],"00579953":6,"00584432":32,"00588657":6,"00594042":[],"00595615":[],"00598615":[],"00600971":[],"00607783":6,"00610607":32,"00611979e":[],"00613258":[],"00615193":21,"00615394":[],"006162":6,"00617499":5,"00619918":[],"00620347":[],"00626773":32,"00627535":[],"00630331":6,"00631057":[],"00635475":[],"00635865":21,"00642221":6,"00642268":[],"00642935":[],"00644939":32,"00646613":[],"00651112":[],"00658316":[],"00660427":6,"00663699":[],"00665974":[],"00669662":[],"00672607":6,"00673407":6,"00676387":6,"00679797":[],"0068011":6,"00680794":[],"006829400694106674":[],"00683748":5,"00683964":6,"00686806":[],"0068697":[],"00687175":[],"0070235":21,"007024126888938144":[6,34],"00703355":[],"00704231":[],"00712321":[],"0071642501586093735":[],"00719176":6,"0072595":21,"00726135":32,"0072675":[],"00727211":[],"00727646693":[0,31],"007315":[31,32],"00736955":[],"00738008":[],"00739382":32,"0074331":5,"00753349":[],"00754534":[],"00759119":6,"007607459165915922":32,"00761275":[],"00769731":[],"00777931":[],"007785":[],"00778523":[],"00781918":34,"00784393":6,"00788598":[],"007891914573161948":[],"00798188":32,"00798988":[],"00799998":[],"00801855":21,"00803064":6,"00805074":34,"00805892":[],"00813803":6,"00817631":6,"00817834":[],"00823002":5,"00825399":32,"00827728":6,"00828799":21,"00830822":[],"00831018":6,"00832189":[],"00834567":6,"00843617":[],"00844667":[],"00848904":6,"00851512":[],"00857028":32,"00858536":[],"00862101":[],"0086649156":[0,31],"008675369724975977":5,"00868983":[],"00880924":32,"008897354602673473":32,"00890232":[],"00894639":5,"00905423":6,"00906293":[],"00915433":32,"00915458":21,"009163470508352218":5,"009164545680330616":[6,34],"00917248":6,"00920609":[],"00922229":[],"00923278":32,"00929251598272297":[],"00934327e":32,"00934499":6,"00934865":[],"0093869":[],"009442796383765939":32,"00946219":21,"00946636":32,"00952322":[],"00952586":[],"0096208":6,"00976647":[],"009855809602167547":[],"00986552":[],"00989896":[],"00990475":5,"00992331":6,"00996754":6,"01":[0,1,2,5,6,9,11,13,17,21,30,31,32,34,35,36,37,38,39],"010018312644139219":[6,34],"01004321":[],"01006401":[],"0100706":6,"0100949":32,"01018743":[],"01023308":21,"010315":11,"01031541":11,"010331721306655165":[6,34],"01033856":[],"01035984":[],"01038358":[],"01045155":21,"01045774":32,"01050849":[],"010516485576646504":[6,34],"0105301":32,"01054509":32,"0105536":[],"01059601":32,"0106014":[],"01066519":6,"01066976":[],"01068907":32,"01076611":5,"01076733":[],"01080274":21,"01089797":[],"0109":[],"010902":31,"01094846":[],"01097423":[],"0110":28,"01103246":[],"01107621901137467":[6,34],"01112952":[],"011225":2,"01128968":[],"01130932":[],"0113104":6,"01135167":[],"01148039":[],"01161357":32,"01164198":32,"01165807":[],"01176096":32,"01179792":6,"011917343246903285":[],"01191824":5,"01193226":21,"012073649469946107":[6,34],"0120771":[],"01214101":[],"01219292":6,"01222822":32,"01223198":6,"01229732982000352":28,"01231917":6,"01233322":21,"01233332":[],"01247118":[],"01257265":[],"01265755":32,"012658":32,"01267006":[],"01268892":[],"01272215":[],"01288591":[],"01289962":32,"01290811e":[],"01290947":6,"01291943":[],"01295356":5,"01300561":[],"013121574062587286":[6,34],"01318643":6,"013341":[],"01335857":32,"01344196":[],"01347636":[],"01347916":6,"01348565":6,"01362274":21,"013623165903312745":[],"01362461":[],"01365363":32,"01366733":[],"01367553":6,"01372375":[],"01382052":[],"01389847":32,"01397146":6,"01405935":6,"01408051":21,"01409821":[],"01416528":6,"01420034":[],"01424197":[],"01427149":[],"01432847":[],"01433809":5,"014436800088896381":[6,34],"01448147":32,"01449782":6,"01455922":24,"01456159":32,"01458337":6,"014586":32,"01458611":32,"0146081":6,"01463049":6,"01463052":[],"01476097":32,"01477821":[],"01478446":[],"01492":[],"0149713":32,"01502518":[],"0150723888951771":6,"01507238889517717":6,"01508632":[],"01508966":[],"01514564":[],"01521658e":[],"01524072":32,"015244":32,"01526688":[],"01529503":[],"01529708":32,"01531845":6,"01537557":[],"0154222":[],"01542292":34,"01544605":[],"01549377":6,"01549939":34,"01550546":34,"01552289":[],"01555268":21,"01558197":5,"01562311":[],"01566461":[],"01580414":32,"01581562":[],"01591021":32,"01594452":34,"01596986":32,"01600491":[],"01603602":[],"01607534":21,"01616709":32,"01619664":[],"016285782696017142":[6,34],"01633169":[],"01633913":6,"01640891":6,"01655318":6,"016587414993045335":[6,34],"01663866":[],"01667827":[],"01671556":[],"01678384":[],"01691871":[],"01691985":6,"0169643":5,"016972818397989375":24,"01704432":[],"01708691":32,"01708781":6,"01708852":6,"01713366":6,"01722502":[],"01724499":5,"01731293":[],"01735584819559331":[6,34],"017355848195593312":[6,34],"01747077":[],"01762067":[],"01765474":[],"017665":5,"01775594":21,"01783414e":32,"01809873":[],"018232":[31,32],"01831050e":6,"01831207e":6,"01835274":21,"01859922":[],"01865187e":[],"01866537":6,"0186893":[],"01873344":11,"01873869":5,"01881546":[],"01882522":[],"01896127":32,"01897575":[],"01898855":6,"01899119":[],"01905883":6,"01908936":6,"019140656913589":[],"01914066":[],"01916913":[],"0191717":32,"01918548":[],"01919702":[],"01931743":[],"01936105":[],"01963203":32,"01963611":6,"01969145":6,"01975416527168255":[6,34],"01975848":6,"01989299":[],"01989549":[],"01999282":[],"02":[0,4,6,7,12,31,35,37,38],"0200568":[],"02017377":32,"02024701e":[],"02024962":6,"020271":21,"020404272938413143":[],"02044454":[],"02054837e":6,"02061026":[],"02061094":[],"02066371":32,"02068067":6,"02071142":[],"0207306":[],"02073509":5,"02075115":32,"02079171":[],"02081274":32,"02083512":32,"02089297":32,"02095266":21,"02098261":6,"02103178":32,"02109939":32,"02123176":6,"0212604":[],"02126208":[],"02138725":[],"021592704588021174":[6,34],"021592704588021178":[6,34],"02178583":[],"02183021":[],"02186131":[],"02198702e":6,"02198703e":6,"02208512":6,"02215597":[],"022210866177877393":31,"02228115":6,"02229529":6,"02231445":[],"02252765":5,"02276062":31,"02279888":32,"02284019":[],"02287894":[],"02288816":[],"022999498260366198":[6,34],"02308518":[],"02314144":21,"02329285":32,"02348765":6,"02355925":[],"02365049":6,"02385515":32,"02392053":21,"02400359":[],"02416381":[],"02424794":34,"02447466":[],"0245528":6,"024632":32,"02468681":[],"02485679":32,"02492265":5,"02498832":6,"025027":[],"02503753":6,"02507163":31,"02509184":11,"025092":11,"02511518":6,"02522069":6,"02531037":[],"02536494":[],"02542246":[],"02546675":34,"025709":[11,32],"02574735e":[],"02582613386840159":28,"02586427":6,"02588522":32,"02593026":[],"0260906":6,"02610528":[],"02618169":[],"02622906":[],"026250840755899812":[],"02625193":8,"02635835":[],"02641575":21,"026605727637184554":[6,34],"026605727637184558":[6,34],"02702978":[],"02707227":5,"02723445":6,"02730775":21,"02745507":32,"02757522":32,"02760977349102238":[6,34],"027609773491022394":[6,34],"02761736":[],"02763182":32,"02764023":[],"02790465":[],"02804715":[],"02809859":[],"02816083":32,"028389":[],"02838933":[],"02845284":[],"02857":4,"02881357":32,"02892224":[],"029":[],"02912421":32,"02942218":32,"02944425":[],"029483":5,"02950229":32,"0296969":[],"0297291":32,"029733":[31,32],"02976145":6,"02992852":[],"02994311":5,"02f":[6,25],"03":[1,6,32,35,38,39],"0301458":21,"03025391":[],"03032441e":6,"03049638":31,"03060273":[],"03061555":24,"03063575":[],"03065428":[],"03074083":[],"03077640549":4,"03099776":5,"031":[5,33,34],"03107818":[],"03113051":[],"03117156":21,"03119091":[],"03172365":[],"03195835":[],"03196357":6,"03203047":[],"03251863":5,"03256632e":[1,38,39],"03267527":6,"03279636":6,"0330308045183219":6,"0330308045187757":6,"03308408":5,"03321947":31,"03338173":[],"03365768507152769":[6,34],"03370315":[],"03376827":32,"033790755027115954":[],"03389964":[],"034047":31,"034169230664804":[],"03438051":21,"03443175":[],"03447512":6,"034557":32,"034985":32,"03543039":[],"03543455":[],"03543958":[],"03557316":21,"03562355":6,"03568439":6,"035909":31,"0359565":5,"03616508":[],"03630548":6,"03633213":32,"0366352614656884":[],"03707133":11,"03717939":[],"03727597":[],"03728183e":[],"03735403":[],"0374748":[],"03774822e":[],"0377961":31,"03781367141738902":[6,34],"03813208":[],"03814292":6,"03815288":6,"038211969489939":28,"03821197":28,"038300":[11,32],"03856554":[],"03868779":[],"03894328":[],"03894873":32,"039":[],"039039":5,"03903968":32,"03908546":[],"03914571":21,"03935519":[],"03946221":[],"03982972":32,"039967668952797":6,"0399676689527975":6,"04":[1,6,11,35,38,39],"040102":5,"04010697":6,"04014929":[],"0401585":[],"04057027":21,"04058784":[],"04063602":6,"04084872":[],"041":9,"04103307":32,"041050166905828786":[],"04107874":5,"041079":5,"04111096":[],"0411487294305088":6,"041148729430523":6,"04191629":[],"04193203":32,"04198166":32,"042044382097756156":[],"04214702":32,"04218461":[],"04220758":6,"04223754":[],"04225015":[],"04259402":[],"04276619":[],"04292593":[],"04295757":34,"043":9,"04310095":[],"04314342":[],"04315108":5,"0431531":[],"04346721":5,"04355837":6,"04362":9,"04362755":[],"04372783":[],"0437499":2,"04389027":6,"04423486":6,"04426647":[],"04426744e":32,"044334":[31,32],"04438319":21,"04448923":[],"044613":6,"0447389":[],"04478101":32,"04537385":6,"04543942":6,"04547353":[],"04555073":[],"04566964":6,"04574692":[],"0458":9,"04581197":24,"04584982e":[],"04597076":21,"04619338":21,"04648335":5,"046531":[],"04662395":32,"04669463":[],"04683565":5,"04690007":[],"04720848":[],"04746791":32,"04778116":[],"04784395":6,"04816611e":[],"04818727730430286":[6,34],"04822955":32,"04828291":0,"04869126e":[],"048920":31,"04892055":6,"0489354":[],"04899609":32,"04909093":6,"04912436":6,"04926746":34,"049462":31,"049556996627824":6,"0495569966278269":6,"04956816":31,"0496375":[],"04977051":21,"04it":6,"05":[1,4,6,13,25,32,37,38,39],"05009826":6,"05024857":[],"05056463":[],"050663":[],"05066303":[],"05091289":[],"05100875":6,"0510594":24,"05126901":[],"051418":5,"051649":[11,32],"0517473":5,"05183886":[],"05227921801205679":[6,34],"052305":32,"05234611":[],"0523738":21,"05238712":[],"05263":9,"0526992":24,"052992":[],"05302":9,"053417":32,"05357244":[],"05364854":8,"05383795":6,"053849":5,"053944":[],"05412502":[],"05419212":21,"05432856":[],"054375":[],"05446143":[],"05447415":6,"05459089":[],"054617":32,"054655":32,"054954":[],"05505310046363":2,"05515143e":[],"05526765":32,"05533":9,"05544019":[],"055676":[31,32],"055697":11,"055734":32,"055910":32,"055987":32,"05599455":[],"056019":11,"056030":[],"05614483":5,"05623":9,"056418":11,"05648":9,"05651951":6,"05667":9,"056683":32,"056898":11,"057124":[],"05715377":11,"057154":11,"05716368155342902":[6,34],"057179":[],"057219":[],"057231":11,"057300":32,"057361":11,"057393":32,"057406":[],"057418":32,"057457":32,"057462":11,"057502":11,"057613":11,"057657":11,"057722":32,"05781491e":[],"057831":11,"057835":32,"05785343":6,"057864":11,"05789007":6,"05792524":[],"05796251":6,"05807125":6,"058121":11,"058216":11,"0582573":[],"05825965":[],"05834444":32,"058388":11,"058435":[],"05852973":[],"058552":32,"058556":[],"058567":11,"058645":32,"05873105":21,"058738":[],"05880359":28,"05883":9,"05884":9,"058854":32,"058921":11,"058952":32,"058996":32,"059004":11,"05900655":21,"059031":32,"059182":[],"059427":[],"059439":11,"05966593":[],"059736":[],"05977068":32,"059807":32,"05982961":[],"059830":[],"05989727":[],"059949":11,"059951":32,"05999":9,"059993":32,"06":[6,32,36,37],"060001":[],"060037":[],"060083":32,"06020587":6,"060254":32,"06026294":[],"060278":[],"060300":[],"060334":[],"060349":31,"060387":[],"06043581":6,"060567":[],"060716":32,"06072551":[],"06075426":[],"060756":32,"060872":32,"061013":[],"061034":[],"061084":[],"061092":[],"061138":11,"061163":32,"061239":[],"061264":[],"061281":11,"061359":32,"061443":32,"061452":32,"061484":11,"061614":32,"061642":[],"061679":31,"061747":11,"061775":[],"061813":11,"061826":11,"061833":11,"061836":[],"061869":11,"061888":11,"061915":[],"06200174":5,"062016":32,"062071":11,"062082":[],"062082386342319454":[6,34],"062100":[],"062221":[],"062273":11,"062292565":4,"06231773":[],"062337":32,"062351":[],"062390":11,"062470":[],"062523":11,"062599":32,"062624":32,"062631":11,"062675":11,"062749":[],"062797":[],"062852":11,"062874":32,"062894":11,"062963":11,"062967":[],"06299237e":[],"063000":[],"06301519":24,"063019":32,"063055":[],"063061":32,"06307625":[],"063080":32,"063081":[],"063159":11,"0632":[],"063260":32,"06331463":[],"063325":[],"063359":11,"063407":[],"063434":11,"063436":[],"063443":31,"063597":11,"063653":32,"063716":[],"063722":11,"063723":11,"063724":31,"063747":11,"063760":[],"063822":[],"063832":[],"063894":32,"063905":11,"063912":[],"063927":[],"06394871":21,"063953":5,"06397412":[],"063980":5,"063982":[],"06406913":24,"06407201":[],"064074":32,"064101":5,"064134":11,"064145":11,"06424868":21,"064294":[],"064320":5,"064412":[],"064420":[],"06444":9,"064444":11,"064501":32,"064527":11,"064532":[],"06453579006728322":[6,34],"064602":[],"064606":32,"064609":32,"064634":[],"064640":5,"064696":11,"064699":32,"064793":32,"06481015":[],"06484621":37,"064856":[],"064874":[],"06488406":[],"064896":5,"06491736":6,"064938":5,"064948":5,"064987":[],"065006":[],"065026":31,"065069":5,"065077":32,"065089":[],"06511966":[],"065158":[],"065214":[],"065215":11,"065249":[],"065289":5,"065378":32,"065390":32,"065410":32,"06547790180152352":[6,34],"06547790180152355":[6,34],"065517":[],"065582":11,"065588":[],"065593":11,"065614":11,"065645":11,"065735":11,"06578047":[],"065801":[],"065808":11,"065815":[],"065872":[],"065910":[],"065982":[],"066042":[],"066066":32,"066077":[],"066344":[],"06637":9,"06638817":[],"06642248":[],"066438":[],"066453":[],"066467":11,"066474":32,"066500":32,"066612":32,"066647":32,"06664867":[],"06666117":[],"0666807":2,"06668613e":[],"066762":[],"066768":11,"066787":32,"066804":[],"06682268":[],"0668226833598415":[],"066837":[11,32],"066854":32,"066870":11,"066992":11,"066999":32,"067009":[],"067139":11,"06724062":5,"067315":11,"067328":[],"067409":[],"067419":[],"067420":5,"067437":[],"067440":[],"067457":5,"067591":5,"067611":[],"067630":[],"067637":32,"067660":5,"067707":32,"067745":[],"067748":[],"067820":5,"067826":[],"067832":[],"067915":[],"067955":5,"067979":[],"068":[],"068082":11,"068083":[],"068141":5,"068241":[],"068257":11,"068264":32,"068307":32,"068340":5,"068403":[],"068406":11,"068407":5,"06842111e":[],"068441":32,"06844519414009444":[6,34],"06844519414009445":[6,34],"06853772":[],"068551":11,"06855126e":[],"068606":[],"068629":32,"068650":11,"068727":32,"068734":[],"0687531":[],"068757":[],"068815":5,"068816":[],"068906":32,"068945":5,"068974":[],"068987":[],"068997":11,"069028":32,"069033":[],"069055":[],"06915522":[],"069213":[],"069257":[],"069296":[],"069320":11,"069365":[],"069384":[],"069388":[],"069452":32,"069522":11,"069570":5,"069584":[31,32],"069594":[],"069629":[],"06962991":21,"069630":[],"069634":5,"069739":[],"069746":[],"069766":[],"069803":[],"069822":[],"069939":[],"06995653":21,"06it":6,"07":[6,32],"070009":11,"070042":[],"07004211":[],"070043":[31,32],"070067":[],"070107":[],"070146":32,"070157":[],"07016":9,"07017":9,"07020234":[],"070213":32,"070220":[],"070228":[],"070275":[],"07039":9,"070406":5,"0704374681593734":11,"070441":[],"070457":32,"070461":11,"070569":[],"070582":32,"070597":[],"07062318":6,"070645":11,"070694":11,"070737":32,"070769":[],"070795":[],"070811":[],"070889":[11,32],"070964":11,"070986":32,"071062":[],"071138":[],"07115":9,"071191":[],"071252":11,"071258":[],"0713":[0,31],"07130734":[],"071323":5,"07136324":[],"07139233":[],"071423":[],"07145103":11,"071452":[],"071498":[],"071554":[],"071579":5,"07160048164232538":[6,34],"0716004816423254":[6,34],"071601":5,"071611":[],"071662":5,"071685":5,"071726":5,"071773":[],"071788":[],"071792":5,"071801":[],"071805":5,"071872":[],"071879":[],"07188255":[],"071942":11,"071951":5,"072000":[5,32],"072009":[],"072022":5,"072098":[5,11],"072111":32,"072128":[],"072132":32,"072168":[],"07226292":[],"072285":11,"072305":5,"072310":[],"072369":[],"072404":[],"072410":5,"072476":32,"072483":11,"072486":5,"072495":5,"07250301":28,"072621":32,"072624":[],"072637":5,"072707":5,"072790":[],"072805":[],"072830":[],"07285":3,"07286416":[],"072914":[],"072931":[],"072953":[],"072967":5,"072973":5,"073008":[],"073059":5,"073079":5,"073080":5,"073088":[],"073152":[],"073184":5,"073187":5,"07321674":[],"07331468":[],"073354":[],"073362":[],"073376":5,"073387":5,"073406":5,"073421":5,"073422":[],"073444":[],"073445":[],"073465":5,"073471":5,"073476":5,"073494":[],"073498":5,"073541":[5,11],"07358383":[],"073586":5,"073598":[11,32],"073618":5,"073630":[],"073634":[],"073640":11,"073644":32,"073708":[],"073712":5,"073716":[],"073720":11,"073728":[],"073797":5,"073802":11,"073840":5,"073853":[],"073858":[],"073972":[],"073980":[],"073984":[],"07404236":24,"074067":[11,32],"074084":32,"07410236e":[],"074108":5,"074161":5,"07417526":24,"07420079":[],"074201":[],"074210":32,"07421084":5,"074323":32,"074327":[],"074330":[],"074340":11,"074419":[],"074439":[],"074455":5,"074457":[],"074509":[],"0745177":[],"074545":[],"074560":[],"07456491":5,"074577":5,"074686":[],"074708":11,"074772":[],"074780":[],"074879":[],"07490892":6,"074969":[],"074970":[],"075030":11,"075058":[],"075089":5,"075249":[],"075331":11,"075342":[],"075421":11,"075513":[],"075521":[],"075523":[],"075582":[],"075587":[],"075684":11,"075758":[],"075779":[],"07581582":21,"075816":32,"075889":32,"075980":[],"075984":[],"075990":[],"076012":[],"076105":[],"076125":[],"076127":[],"076136":[],"076150":32,"07617146":21,"076249":[],"076266":[],"07627734":[],"076354":[],"07641937":34,"0764924":6,"076504":[],"076527":11,"076587":[],"076592":[],"076662":[],"076721":[],"07678":9,"076820":[],"076825":[],"076833":[],"076857":[],"07692307692307693":9,"076938":[11,32],"076950":[],"076996":[],"077068":5,"07706814":5,"077168":32,"077171":[],"077219":[],"077226":[],"077313":5,"077330":5,"077403":5,"077429":5,"077455":5,"077460":32,"077542":[],"077549":[],"077613":[],"077630":5,"077650":[],"077705":[],"077710":[],"077756":[],"07777777777777778":[1,38,39],"077931":5,"078":[],"078029":[],"078041":5,"07804489":32,"078110":32,"078187":[],"07820":9,"078329":[],"078336":32,"078412":[],"07842458":[],"078467":[],"078540":32,"078545":[],"078548":5,"078593":[],"07864":9,"078656":[],"078707":[],"07871":9,"078845":[],"078868":[],"078974":32,"078986":32,"079121":[],"079124":[],"079165":[],"079226":[],"079255":5,"07929472":[],"079381":11,"079432":[],"079434":[],"07944154":[24,31],"079455":[],"079581":[],"0796891867672603":[6,34],"079731":11,"079878":[],"07988085572440823":[],"079882":[],"079946":32,"079948":11,"08":[6,9,28,32,36,37],"080105":[],"080163":[],"080181":[],"080233":11,"080256":[],"080284":11,"08030109":[],"080406":[],"080411":[],"08043851":5,"080473":[],"080502":5,"080505":[],"080571":5,"080607":11,"080616":32,"08066381":28,"080690":[],"080750":11,"080755":5,"080764":32,"08076969085177746":[],"080773":[],"080903":5,"080906":5,"080933":[],"080935":5,"080953":11,"080980":5,"081057":5,"081120":5,"081126":[],"081136":5,"081164":5,"081246":[],"081276":32,"08131003":6,"081466":5,"08156108":6,"081570":[],"081584":[],"08159374":[],"081617":5,"081621":5,"08165104":32,"081655":32,"081677":11,"081679":5,"081680":[],"08174081":[],"081742":5,"081772":[],"081804":5,"08185019":21,"08185315":[],"081896":5,"081916726599974":[],"081955":[],"081960":5,"081976":[],"0819836":[],"082189":[],"082205":[],"08221578":[],"082225":5,"082246":5,"082255":[],"082347":[],"08238863600759742":[],"08245909":[],"082506":[],"08251519":6,"082517":[],"08255129":21,"08256285":[],"082577":[],"082653":32,"08271388":28,"08272096":32,"082746":11,"082760":[],"082781":[],"082875":31,"08293853":21,"08299273e":6,"083000":[],"083066":[],"083096":[],"08318298e":[1,38,39],"083317":[],"08333333333333333":[1,9,38,39],"08336233266":4,"08339896":24,"083527":[31,32],"08352721390288316":31,"08376632":[6,32],"083766322923899":[6,32],"0837663229239043":[6,32],"083853":[],"08389064":[],"08394792":31,"083988":[],"084075":[],"084076":32,"084207":11,"084247":[],"08426840630693412":[6,34],"08426840630693413":[6,34],"08449894":[],"08455":9,"08474":9,"084764":[],"084809":32,"08481871":[],"084843":[],"085023":[],"08505008":[],"085235":[],"0853136633465326":35,"085391":[],"085454":[],"08551306":6,"08551338":[],"08551625":[],"08576932":6,"08593216":6,"08611111111111111":[1,38,39],"086441":[],"086518":[],"08652153831327969":5,"086636":5,"086843":[],"086864":[],"086868":5,"08690":9,"086900":5,"086932":5,"08703034":[],"087247":[],"087250":[],"087271":5,"08728068":[],"087311":5,"08758":9,"087603":[],"087642":[],"08770809":[],"087887":31,"088155":[],"08815506":[],"0881981":5,"08823":26,"08844723450419088":[],"088697":[],"08871404":5,"08881497884574564":32,"08888888888888889":[1,38,39],"08902":9,"0892144853354966":35,"08928088":[],"0895387":32,"089539":32,"089710":[],"08973767":[],"08988514":21,"08996":9,"09":[1,32,38,39],"09030678":21,"090365":[],"09076319":[],"09149148":[],"09166666666666666":[1,38,39],"0917":9,"09172409":6,"09179697e":[],"092":[],"09251":9,"093":[],"09308274":[],"09327269724691106":[],"09336399":[],"093408":[],"09391542":24,"09408163":31,"094082198961999e":6,"0940821989652176e":6,"09444444444444444":[1,38,39],"09524714":31,"09527217":[],"09599224":[],"09609807":5,"09726322":[],"09744":9,"09760094":[],"09780":9,"09787053":21,"09791":9,"09832963":21,"09858511":[],"09861229":[24,31],"09903804":8,"09919198949274803":[6,34],"09951287404314545":[1,38,39],"0998713":[],"0n":[0,31],"0s":4,"0x10febc640":21,"0x10febcf10":21,"0x1162c32b0":[],"0x1183f2640":13,"0x118c9b1c0":13,"0x118f6d610":[],"0x11ada9670":36,"0x11de12520":[],"0x11df37280":[],"0x11f5f6520":36,"0x11fdbfd60":[],"0x1268ba940":[],"0x127a38670":[],"0x127e425e0":[],"0x13002a640":[],"0x1305bb1c0":[],"0x13eaa7490":[],"0x13ef4e1c0":[],"0x156346610":35,"0x16c9a8880":[],"0x2800bca90":[],"1":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,19,20,21,22,24,26,27,28,29,30,33,34,35,36,37,38,39],"10":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,17,21,24,25,27,28,29,31,32,33,34,35,36,37,38,39],"100":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,21,24,28,29,31,32,33,34,35,36,37,38,39],"1000":[0,1,2,4,5,8,11,13,14,21,23,28,31,32,35,36,37,38,39],"10000":[2,5,6,10,11,13,28,33,34],"100000":8,"10001":10,"1001":[9,28],"1002":28,"1003":28,"10030":9,"10035098":11,"100351":11,"1005":28,"1007":33,"10077114273548984":[6,34],"1009":28,"101058":[],"1011":28,"1013":28,"1013904243":28,"10141413e":6,"1015":28,"10156593":[],"10160394":[],"10188623":[],"102":[3,32],"1023":28,"10230":9,"1024":3,"10247463629935179":[],"10251317e":[],"1026":28,"10268273":[],"1027":28,"103":[1,38,39],"1030":28,"10340":9,"10354083919795562":[],"1036131":24,"1037":28,"10378326e":[1,38,39],"1038":28,"10391807":6,"10398646080125036":[6,34],"10398646080125037":[6,34],"10399758":[],"1040":28,"10405456":11,"10430":9,"10440776":[],"104411":[31,32],"1047":28,"10479359":24,"10490195":24,"10520":9,"10555555555555556":[1,38,39],"10572":34,"10589577":5,"106095":[11,32],"10638925":[],"1063892533225306":[],"106431":31,"10656534":21,"10683216":[],"10706523":21,"10741066e":21,"10776220958055382":11,"1078":34,"10790125813226321":32,"108":[6,9],"10812381":5,"108124":5,"10851799e":21,"1089452":[],"10913":6,"10927588":[],"109276":[],"10931453":6,"10954867e":[],"10959669":31,"10960":9,"10983954":[],"10m":4,"10th":9,"10x":[0,31],"11":[0,2,3,4,5,6,7,8,9,10,11,12,13,15,16,18,21,24,25,27,28,29,30,31,32,33,34,35,36,37,38,39],"1100":28,"11007935789924998":24,"1101":28,"11022302e":[5,38],"11022363":[],"11039573e":[],"11078018494378859":[],"111":[1,7,12,35,37,38,39],"11100":9,"11112589053037751":9,"11197884":[],"11202337":34,"112383":[11,32],"1124":9,"11352187":[],"11388888888888889":[1,38,39],"11390":9,"11400145":31,"11427818":[],"114550":34,"11462415":5,"11482289e":6,"115":34,"11507992e":[1,38,39],"11547777218876518":[6,34],"115822":6,"11587186":31,"11590":9,"1160326":21,"11657689":21,"11660":9,"11666666666666667":[1,38,39],"117":[8,34],"117430":31,"11744554e":6,"11749517":[],"11780":9,"118":2,"1182":34,"118318":[31,32],"11837308":[],"11837671":[],"1184":4,"11840":9,"11890":9,"11896755":[],"119":2,"11911824":28,"119936":2,"11m":[],"12":[0,1,2,3,4,5,6,8,9,11,12,13,21,24,28,30,31,32,34,36,37,39],"120":[2,3],"12011393e":[],"12023635e":[],"1203":9,"1203284":8,"12044974":32,"120450":32,"120508":[],"12050822":[],"1206":8,"121":[8,9,10],"12129289":[],"1213":34,"12155548":[],"1215pm":[29,31],"12182967":6,"122":[2,8,9,10],"12222222222222222":[1,38,39],"12224317":[],"122282":31,"123":2,"12318726e":6,"12330033":32,"12333649":6,"123711":6,"12380":9,"124":[0,31],"12400":9,"12417157":21,"12427537":21,"12552073e":6,"12568438":[],"12591227":32,"12594172":[],"126":9,"1261":9,"12618549":5,"12634093":21,"1265":9,"12693357":21,"12695501":[],"127":4,"1271":6,"12765651865754318":5,"1277":6,"12777777777777777":[1,38,39],"127812":31,"12790":9,"128":[3,4,13,36,37],"12814914":[],"128664":6,"12871842":32,"129":2,"12921833":[],"1297":9,"1298":9,"129963":34,"12998822":[],"12m":[],"12pm":[29,31],"13":[0,2,4,5,6,9,11,12,13,21,22,24,28,31,32,34,35,37,38],"130":9,"13003291":6,"13055555555555556":[1,38,39],"130694":32,"13069442":32,"13076331":[],"131":9,"13155259":21,"132":9,"13220608e":6,"1326":9,"1326197715":31,"13280":9,"133":[7,35],"13310008":24,"13404683":[],"13410999":[],"134110":[],"13422946e":[],"13444436":[],"1345":34,"1346":34,"135":9,"13535942":6,"13542726":[],"13580759":28,"136236":6,"13646574":5,"13661243e":6,"13679863":6,"1371":6,"13740":9,"137400784702911":32,"13749148e":[],"13756504":21,"13759245e":[],"137652":[11,32],"1377":[3,4],"1378":[3,4],"1379":[3,4],"1380":[3,4],"1381":[3,4],"1382":[3,4],"13821034":21,"13827006":[],"13829298":[],"1383":[3,4],"1384":[3,4],"1385":[3,4],"1386":[3,4],"13865173":5,"138775":[11,32],"1388888888888889":[1,38,39],"1388976715362099":[],"13890":9,"1392559585048734e":6,"139255958997547e":6,"13925918083728273":[],"139431112903922":34,"1394311129039245":34,"1395084586525954":34,"1395235273363669":34,"13987729":[],"13m":[],"14":[0,2,4,5,6,8,9,10,11,12,13,21,24,28,30,31,32,37,38,39],"140":[2,9],"14021063":6,"14023656":[],"141":2,"14100":9,"1412":[21,36,37],"1416398":6,"14174745":6,"1418":9,"142":9,"14250":9,"14277718e":32,"143":[2,7,35],"1437":[1,38,39],"1438149":[],"14389839":28,"14400":9,"1440501043841336":[1,38,39],"14421971":24,"14440":9,"1446729567":4,"144993":31,"145":2,"14526269":24,"14549142":31,"146":2,"14629156":34,"146704":[],"14670413":[],"14697721":[],"14710":9,"14722222222222223":[1,38,39],"147400":[11,32],"147420":[11,32],"1479":9,"148":[3,4],"148009":[],"14812206":6,"14845":6,"14857":6,"14859":6,"149":[3,4],"149294":[],"149299":[],"14962649":[],"14978631":21,"14g":[6,34],"14m":[],"15":[0,2,3,4,6,7,8,9,12,13,15,16,17,18,21,28,31,34,35,36,37,38],"150":[3,4,8,9],"15005476":5,"15047127":[],"15048894":21,"15055258":21,"150726":[],"15098090e":6,"151":[3,4],"15119514":13,"15130074e":6,"1513237":[],"151515":[],"151517":34,"15183857":[],"152":[3,4,9],"15200":9,"1520039":[],"152701":[],"1527777777777778":[1,38,39],"153036":[31,32],"15313054":34,"1532465":13,"15383855":[],"15384615384615385":9,"15443469e":35,"15457792":21,"155":9,"15553403":[],"15649598":[],"15673992":[],"15693449e":[],"156956":5,"15697121e":[],"15724663":24,"1575":9,"158":9,"15827078":24,"15863713":[],"1587":9,"1590":9,"15913825":31,"15962297":[],"15975618":[],"15990":9,"15990395":[],"15g":[6,34],"15m":[],"15pm":31,"16":[1,2,3,4,5,6,8,9,10,21,28,31,32,33,34,37,38,39],"1600552":[],"1603":3,"16043757":31,"1608179281668718":28,"16081793":28,"16087734":[],"16111111111111112":[1,38,39],"16168603e":[],"16211139":5,"16220":9,"162246":5,"16231451":4,"1625":9,"1628":9,"162999":31,"163":2,"16304863":32,"163049":32,"1630775253":[1,38,39],"16309331":21,"16342407":5,"16343471":6,"16356503":34,"16384":3,"16385836":21,"16389131":13,"164":2,"16456084":[],"164812":5,"16481217":5,"16492688":24,"165":2,"16500":9,"16521791":[],"16570701":[],"166":[2,9],"16650509":24,"167":2,"16762223e":[],"167787":5,"168":9,"16805821e":6,"16921883":[],"169219":[],"16933554":[],"17":[1,2,4,5,6,8,9,18,21,28,32,34,37,38,39],"17006020e":[],"17022089147584388":[],"17078905":24,"1709":9,"17121077":[],"17136288":[],"17138811":31,"17144765665252978":[],"171525":32,"1715252":32,"17174962e":[1,38,39],"17222222222222222":[1,38,39],"17257288":[],"1726":9,"17275391":[],"173":21,"17300":9,"17305512":[],"1731":9,"17362603":[],"17440757e":[],"17446471":6,"17451":[],"17469167":5,"174692":5,"1752":9,"175300":[31,32],"17540272":[],"17603044":[],"17615838052499":[],"17641709":6,"17647619":6,"17733642":[],"17758251":21,"17777777777777778":[1,38,39],"17801022":5,"17829104":24,"17841553":21,"17861098":6,"17917768":5,"179404":[],"17949575":5,"17953942":11,"1797":[1,3,38,39],"17m":[],"18":[2,4,6,7,8,9,10,13,19,21,28,34,35,36,37],"18029127":5,"1803":26,"18065292":24,"1807":4,"1809":9,"181":9,"1812":9,"18128852":[],"1821":9,"183":2,"18314387":[],"18333333333333332":[1,38,39],"1836":34,"18383522":32,"184":[2,9],"18409473e":[],"18433544":[],"184519":[31,32],"18474816e":[],"18488944":[],"18489312":[],"1849":[3,4],"185":2,"1850":[3,4],"1851":[3,4],"18518557":28,"1852":[3,4],"1853":[3,4],"1854":[3,4],"1855":[3,4],"1856":[3,4],"1857":[3,4],"185713":[],"18571316":[],"1858":[3,4],"1859":[3,4],"186":2,"1860":9,"18611111111111112":[1,38,39],"18613217e":6,"18624242":[],"18660":9,"18670072e":32,"18673098":11,"1871257":24,"18726877":[],"1875353":31,"18761375":13,"18780801":31,"18807824e":[],"18824315":[],"18829946":[],"1887":6,"189367":31,"189496":[31,32],"189621963782685":11,"189622":[31,32],"18993003":24,"19":[2,4,6,9,13,21,24,28,31,34,37],"19003":6,"19123037":21,"19166136":[],"19166666666666668":[1,38,39],"191963":31,"19207979":5,"1921649":[],"19220":9,"19314584":24,"19335893":21,"19343949":[],"1937079":[],"19393543":21,"1940":[0,32],"194042826649355e":6,"1940428268204826e":6,"19426595":21,"1943":[12,37,38],"19431161":[],"194312":[],"19436962e":[],"19463967":[],"194861702085775":[],"1956":9,"19569961":[6,32],"19590868":[],"19652884e":[],"1970":[24,31],"19717411":24,"1973":9,"197370":[11,32],"19740":9,"19743643":[],"19769458e":[],"19772911":31,"1979":[6,34],"19800":9,"19825288e":[],"19888258":[],"19910208":24,"19983530":6,"1999":[26,34],"1_1":[12,37,38],"1_2":[12,37,38],"1_3":[12,37,38],"1cm":[0,8,10,28,31],"1d":[1,2,3,38,39],"1e":[1,2,4,13,14,21,36,37,38,39],"1e10":14,"1e4":6,"1f":[1,39],"1k":24,"1n":[0,31],"1s":[],"1x":[0,31],"2":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,19,21,22,23,24,25,27,28,30,33,34,35,36,37,38,39],"20":[0,1,2,4,6,7,8,9,13,21,28,29,31,32,33,34,35,37,38,39],"200":[0,2,3,4,8,9,10],"2000":[0,32],"20015436":6,"20017452":[],"2004":[13,35],"2006":30,"2008":31,"2010":[1,39],"20101684":13,"2011":[1,38,39],"2014":4,"20142361":[],"2015":[1,39],"2016":[0,31],"2018":[0,6,32,34],"2019":[8,9],"2021":[6,14,32,33,35],"2022":31,"2023":[3,4,15,16,17,18,19,20,21,22,26,31,33,34,35,36,37,38,39],"2027":9,"20272874":[],"20277777777777778":[1,38,39],"20289224":[],"20355156":34,"20371418":[],"20484434":[],"204932":11,"20493234":11,"20494446":31,"20500":9,"205231":31,"20594513":[],"2060":9,"2069":9,"20695722":[],"207545":[11,32],"207888":31,"20820528e":[],"20833333333333334":[1,38,39],"20867052175003364":[6,34],"20916295":32,"20956318":[],"20967833":24,"209789":31,"20980":9,"21":[0,1,2,3,4,5,6,7,9,12,13,15,21,24,31,32,34,37,38,39],"210340":[11,32],"21053692":21,"21055226":[],"21058097":5,"21059098":[],"21110005":34,"21130":9,"21152452":21,"2116753732":4,"21169159e":6,"21275991":31,"213103":[11,32],"213743":[11,32],"21401303e":[],"21460652":[],"214607":[],"21467941":28,"21493779":28,"21546249":[],"21596432":6,"216290":[11,32],"216683":[11,32],"21682143":13,"21710121":[],"2171263":24,"21860973":24,"21879159":[],"2193546":24,"22":[0,1,2,4,5,6,9,12,13,19,21,22,24,31,32,34,35,36,37,38,39],"22001043":[],"22044605e":[5,32,38],"22092934e":[],"221":8,"22103874e":[],"221180":[31,32],"22130126":[],"2216":9,"2218":9,"221805":2,"221921":5,"22209775e":[],"222400":[31,32],"22241171":[],"22297358":24,"22328509":[],"22368396":[],"223884":5,"22388434":5,"22416937":[],"22467274":34,"225":4,"22574374":[],"22616902":31,"226296567359957":[],"22663583":28,"22690428":5,"22729927":[],"2284246870217162":[6,34],"22847924":5,"22885848":24,"228942":4,"229241":21,"22974406":28,"23":[1,2,4,6,7,9,12,13,21,24,31,34,37,38,39],"23002365e":6,"23031634":21,"23047985":[],"23076923076923078":9,"23110543":[],"23167717":5,"23192074e":[],"232435":[31,32],"23257415":[],"23305112":13,"23333333333333334":[1,38,39],"2338675":32,"233868":32,"23392132":[],"234":6,"23516186":31,"23528337":34,"2361161":31,"23636536":21,"2364":9,"23643365":34,"23780865":24,"2379":6,"238":34,"2397":9,"23971032":32,"23979359":[],"24":[0,1,2,4,6,9,13,19,21,24,28,31,34,37,38,39],"24005098e":[],"24085321":34,"24128917":5,"24140":9,"24159785":32,"2416":9,"24175744e":6,"2419":9,"24251681":[],"24252405":21,"24280599":[],"242806":[],"2430":9,"24390":9,"24444444444444444":[1,38,39],"24569547":[],"246":2,"24602503e":[],"2465439":[],"24679418":13,"24785221":28,"24828523":24,"24829908":5,"24906604e":6,"24960675":21,"24968001e":[],"25":[2,3,4,5,6,7,8,9,11,13,15,20,21,25,31,32,34,35,37,38,39],"250":[2,4,7,9,35],"25000":[0,32],"25050227":21,"250636":31,"25077762":21,"25084316":[],"25139357":[],"251879":[31,32],"252436":[31,32],"255":3,"255001":[31,32],"25561567":[],"256":[2,4],"25617654e":6,"25617658e":6,"25650679":[],"25663096":[],"2572":9,"2575":9,"25844504":[],"25872167e":[],"259153":[11,32],"25920793":[38,39],"2597":9,"25it":6,"26":[2,4,6,9,13,21,34,37],"26037366":[],"261498":5,"26149831":5,"2619":32,"262638":[],"26263837":[],"26291451":[],"26292364":34,"26297455":32,"26301436":5,"26318493":31,"26372759":[],"264":4,"26409315307910025":6,"2640931530791004":6,"264377":[],"26437713":[],"264421":31,"2650":9,"265109911":4,"26514544":[],"2654":9,"26666667":13,"26710969":5,"26776828":[],"26780278":5,"268":9,"26803966":[],"26931499":[],"2697447":[],"26995402":32,"27":[0,1,2,4,6,13,21,32,34,37,38,39],"2707158":24,"27092910":6,"27152452":31,"2717818":21,"27305669":21,"273094":5,"27309401":5,"27424746e":[],"27438488":[],"2750":9,"27547557":[],"276263":[11,32],"27650338":[],"27693602e":38,"27700":9,"27717261":[],"2774877574815404":9,"27760":9,"27793476":[],"277935":[],"27859357":[],"27919014":31,"27924636":5,"27971414":[],"27n_":28,"28":[1,2,3,4,6,9,13,16,21,32,34,36,37,38,39],"28008933":[],"280179":31,"280573":5,"280647":[11,32],"28081221e":[],"28096517":[],"281930":31,"28194659":21,"28205578e":32,"28206156":[],"28210895":[],"282259":31,"282727":[11,32],"28294305":24,"2830637392":4,"283078":[],"28336218e":6,"28390":9,"28391978":32,"28443039":34,"28475098":8,"28490569":[],"28566769":[38,39],"28585116":24,"28607817":[],"2861":28,"28621796e":[],"28638913":[],"28641189":[],"28662669":[],"2871":9,"2873":9,"28818554":5,"288186":5,"2882":28,"28837459":[],"2886":28,"2890":[0,31],"28908491":[],"2892":28,"29":[2,4,6,7,9,20,21,34,35],"29022057":13,"29097377":28,"29135778":[],"291358":[],"2915":28,"29153991":[],"29167186":5,"29174301":21,"29199381":[],"29228133":[],"29275129":[],"29282684":24,"2931":31,"29350903":[],"29374695":31,"29384004e":[],"29401213":[],"2941718e":[],"29454955e":[],"29496954e":[],"2953":[3,4],"2954":[3,4],"2955":[3,4],"2956":[3,4],"2957":[3,4],"29588674":24,"29592687":21,"29633889":13,"296414":31,"29679459":21,"2968":31,"29726695":24,"29731502":21,"29732036":31,"2980":31,"29822833":6,"29894362":11,"2990":31,"299748":[31,32],"2_":[12,37,38],"2_1":[12,37,38],"2_2":[12,37,38],"2_3":[12,37,38],"2_i":[12,37,38],"2_m":[6,28,34],"2_t":[13,36,37],"2_x":28,"2b":28,"2c8f433990d1":[36,37],"2cm":8,"2d":[1,3,11,12,23,31,37,38,39],"2e":[6,34],"2f":[0,7,9,10,11,12,31,32,35,37,38],"2g":2,"2g_i":2,"2k":3,"2m":[6,34],"2n":[0,2,3,31,32],"2nd":9,"2p":28,"2pm":[29,31],"2pt":4,"2x":[0,3,8,13,31,36,37],"2x_ix_jy_iy_j":8,"2x_j":8,"2y_i":10,"2y_j":8,"3":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,21,23,24,25,26,27,28,29,33,34,35,36,37,38,39],"30":[0,1,4,6,7,9,10,13,21,29,31,32,34,35,36,37,39],"300":[21,37,38],"30000":[0,31],"30010":9,"30119421":8,"30125775":21,"30129931":24,"30150056":31,"30170017":[38,39],"30177145":[],"302":34,"30258509":[24,31],"303":6,"30335380e":[],"30339081517583943":28,"30361418":37,"30442964":32,"30447937":[],"30466214e":6,"30478013":[],"30494363":[],"305":[0,31],"30567713":[],"306":[0,31],"30630294":[],"30677003":[],"306770031113352":[],"307":[0,31],"3072":3,"3073":34,"307631":[],"30763135":[],"3076923076923077":9,"30774404":21,"30787294":6,"308":[0,31],"309":[0,31],"30914432":24,"30940":9,"30971881":[],"30990916":31,"31":[4,6,12,24,28,37,38],"310":[0,31],"31022577":[],"310277":5,"31027702":5,"310579":32,"3105791":32,"31082439":24,"311":[0,31],"31113868e":[],"312":33,"3123314713548606":[6,34],"31248389":31,"31276579e":6,"31290684":32,"313":33,"31318084":5,"3139661":[],"31415359e":[],"31457796":5,"315":[6,33],"3155":[0,5,6,33,34,35],"31579721":[],"31588043":24,"31588332":[],"316":33,"31650694":6,"31705377":[],"31714002":31,"31718909":11,"317367":11,"3175938":5,"317594":5,"31803769":[],"31814386":28,"3189":34,"31895514":21,"31896852":8,"31927572":[],"31995103":[],"32":[3,4,6,12,13,24,28,34,36,37,38],"3200":[1,38,39],"32141575":31,"32149601703519115":[6,34],"3214960170351912":[6,34],"3215":9,"32185967":24,"32221699":21,"32244056":21,"32265589":[],"3228044":[],"32341247e":[],"32372846":21,"32382849":31,"324":2,"3245":2,"32450054":32,"3250":[1,6,38,39],"32577534":[],"32584888":[],"32615859":[],"326238":[31,32],"32632463":[],"326325":[],"32708194":[],"327291":11,"32729105":11,"3273472571412799":11,"3283771":24,"32941592e":[],"329492":31,"33":[4,9,12,24,28,29,34,37,38],"33020191":[],"3303366":[],"33066907e":[5,32],"33078483":31,"33079132":31,"33104875":[],"33113018":[],"33159476":24,"33166055e":5,"331939":[31,32],"3329671101137754":28,"333":[7,35],"33333333":13,"33408606":[],"33486875":21,"33534416":[],"33537181":31,"335849":[],"33600213":31,"33746734":[],"33746734412664":[],"33800793":24,"33860497":[],"33903511":[],"33995567":[],"339961":[],"3399612":[],"34":[4,9,24,34],"340071371496255":32,"34011629":24,"3403":9,"340583":31,"340782":[11,32],"34100913":[],"34114547":5,"34149655":[],"341497":[],"34154132":[],"34158540e":[],"34193915":32,"342680":[31,32],"3436":[0,31],"3437":[0,31],"3439564710454786":[],"34412923":32,"34447052":[],"34517495":[],"34569596":5,"34685874":[],"348676117830458":5,"34998197":[],"35":[0,4,6,9,17,25,29,31,34],"35058127":21,"35084272":21,"35140":9,"35146218":28,"351636":[11,32],"35182854":5,"35248847":21,"35255737e":21,"35412147":34,"3544313922":6,"35470445e":[5,32],"35533773":6,"35564856":[],"356399":[31,32],"3568919":[],"357508":[31,32],"35771826":6,"3581341341":4,"35825829e":[],"35846425":34,"359":[5,33],"3592571":[],"3597516959642966":[],"3597517":[],"36":[0,4,5,6,25,28,34],"360":[1,38,39],"36051635":[],"3613":9,"361556":[31,32],"3616476":[],"3621311":5,"3632959111950474e":6,"363295916323784e":6,"36403046":28,"36420967":[38,39],"36434588":[],"36550376":31,"3655222":5,"367":2,"3676":4,"36789460e":[],"3679":4,"36795972e":[],"36802977":31,"3689":4,"369139":[11,32],"36it":6,"37":[4,6,9,19,25,31,35],"3701":4,"3703":4,"3703468543933255":[],"3705":4,"3706":4,"370782966":4,"37112277":[],"3713":4,"3716":4,"37239927e":32,"3724":4,"37266855":31,"3729492":[],"3730":4,"3733":4,"37335014":31,"3737":4,"37376184":31,"37388140e":[],"37396662":6,"3743":4,"37477725":28,"374777250972322":28,"3749":4,"3756":4,"375694":31,"3758":4,"3765":[],"376547":31,"3766":4,"37667238":24,"3767":4,"3770":[],"3773":[],"377372":32,"37737221":32,"3777801602":6,"3780":4,"3782":4,"3784":4,"37853034e":[],"3786":[],"3787":4,"3789":[],"37900111":6,"37917253":[],"3795":[],"3798":4,"3799":[],"38":[4,9,25,28],"380":9,"3800":4,"3802":4,"38020451":[],"380205":[],"3804":4,"38046294":31,"38088413":[],"3812":4,"38135654":21,"38135733e":6,"3814":[],"3815":4,"3816":[],"38165546":[],"3817475779":[6,34],"38201155":21,"3821":[],"382187":31,"38259375":[],"38319502e":[],"3834":[],"3836":[],"3837":[],"3838":[],"38380352":21,"3838917029":36,"3840":[],"3842":4,"3842967":[],"38461538461538464":9,"38461539":36,"38465596":[],"38511413":[],"3853":[],"38533185":6,"3855":4,"3856":4,"386":9,"38629436":[24,31],"3865":[],"387":33,"3871":4,"3873":4,"38764522e":[],"3877":[],"3878":[],"38782352":31,"38787447":[],"38831624":[],"3886":34,"3888":4,"38916861e":6,"3893":[],"3894":4,"38962192e":6,"3898":4,"39":[0,4,9,22,26,29,31,37,38],"3901":[],"3907":[],"3907408":[],"39078751e":[],"3911":4,"3918":4,"3919":[],"39197698":32,"391977":32,"3920":4,"39200159":31,"3921":4,"39214397":32,"392144":32,"3923":[],"3928":[],"39287528":[],"3929":4,"39300201":[],"39308683e":[],"3932":[],"3944":[],"39457095":[],"3948":[],"39483726":[],"39541528":[],"3957":4,"39572825":[],"39579407":5,"39612983":[],"3962":4,"39644178":[],"3967":4,"3970":[],"39706038":5,"39730396":25,"3975":[],"397700":[11,32],"39789527":[24,31],"3979":4,"3980313467":6,"39890447":[],"39895173e":[],"39931051e":32,"3996":[],"39965905e":[],"399836":[31,32],"3999":[],"3d":[2,3,4,6,13,25,34,36],"3f":[1,3,9,39],"3n":24,"3s":4,"3x":[2,8],"3x_i":2,"3y":8,"3yk470mj5p931p9dtkk0y6jw0000gn":[1,6,13,25,31,34,36,38,39],"4":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,21,24,25,26,28,31,33,34,35,36,37,38,39],"40":[0,1,4,6,9,22,25,26,29,31,34,38,39],"400":4,"4000":[9,31],"40009482":31,"4010":4,"40111899":11,"401119":11,"4014":[],"40182469":24,"401842":[11,32],"40216748":[],"4033":[],"40362053":[],"40389562":[],"404":32,"404130":[],"40413036":[],"4043":4,"4050":[30,31],"40500157":[],"40512793":24,"405890":[11,32],"40620066":32,"406201":32,"40629059":[],"40644745":[],"4066":[],"40666305":31,"4082":6,"4087":9,"4087793":5,"40892146":[],"40927184e":6,"40contain":26,"41":[2,4,9,22,24,26],"41021561":[],"4107":9,"41097603":[],"411730":5,"41173033":5,"41219619":[],"41246325":[],"41291861":[],"41371745":[],"41433969":5,"415066":[],"41506637":[],"41511965e":[1,38,39],"415201":31,"4155":[2,15],"41594943":21,"4162706317":6,"4166666666666667":9,"41716708":21,"41771755":[],"41790059":21,"418506":[11,32],"4187996":[],"41882037e":6,"41894238":24,"42":[1,4,8,9,10,24,38],"421120085426022":[],"42138688e":[],"42172457":[],"42198678":[],"421987":[],"42239354":[],"422658":11,"42265837":11,"4230769230769231":9,"4234":4,"42441033":5,"42450":9,"42457498":5,"424575":5,"42484459":37,"42535003":24,"425564":[],"42556446":[],"42578415":[],"4258049":[],"42584543":[],"426":[6,7,35],"42800148":[],"428741":[],"42874148":[],"429":34,"429345":[],"42934502":[],"42967903e":[],"43":[0,1,4,7,9,24,35,38,39],"43043913":[],"43054282":5,"4310":31,"433":34,"43330971e":6,"43425860e":[],"43466245":31,"43490863":[],"43496417":[],"435163":[31,32],"4353":[],"43579948e":6,"43639284e":32,"436462435":4,"43647835":31,"43766686":11,"438060758":6,"43809274e":[],"438136":[31,32],"43902948":31,"439230":6,"43941514":31,"43951204":28,"43it":6,"44":[0,1,4,24,38,39],"44089210e":[5,32],"44116407":31,"441182":[],"44118245":[],"441264":31,"442600":[11,32],"443217":[31,32],"44347438":[],"444":9,"44402322":24,"44407741e":[],"44418822":[],"44520102":[],"44595818":31,"446033":34,"44624525e":32,"446453":31,"44729805":[],"44732200e":[],"44781662":11,"447817":11,"44842116":[],"44921888":[],"44970586e":[1,38,39],"45":[4,9,29,31],"450":9,"45014":24,"450257":[11,32],"4504":9,"45062284":31,"45065211":[],"45073476e":[],"450m":[],"45134965":[],"45207509":[],"45253585":31,"452553":31,"45255977":[],"45281756":[],"45290234":21,"452m":4,"45308692":[],"453m":4,"45405253e":[],"454m":4,"45502684":21,"455173":34,"4555094":[],"455592":[],"4557763":11,"455947":[31,32],"455m":4,"456":9,"45610021":[],"45642521":[],"456m":4,"457":[2,4],"457m":4,"458027":[31,32],"458078":[11,32],"458m":4,"45915671e":32,"45922756e":[],"45960079":5,"459m":4,"46":[2,4,9,29,31],"4600624385659884":[],"4601":9,"46022436e":[],"460m":4,"46153846153846156":9,"461m":4,"462":[7,35],"4627795":28,"462m":[],"46313714":[],"46383925e":6,"46383926e":6,"463861":31,"464m":4,"46754435":31,"4676059":32,"467606":32,"467818":[],"46781836":[],"467m":4,"46873567":24,"468m":[],"46984697e":6,"47":[2,4,9,29,31],"47042744":5,"470714":[31,32],"47075725":6,"470m":4,"47116868e":6,"4712168":28,"47125748":5,"47132891":5,"47176716":34,"47176783":34,"47179152":34,"471874":[],"47187428":[],"47202442":34,"472445":5,"47244548":5,"47297104":24,"47313680":34,"47364408":24,"473m":[],"47430124e":[],"47447472":[],"475405":[],"47540513":[],"47610036":6,"47700752":31,"47701204":[],"477m":[],"47815203":11,"479465113":4,"479m":[],"47it":6,"48":[2,3,4,9,34],"480":31,"48134747":[],"481401":[],"48140137":[],"48145226":[],"481979":6,"48240312e":[],"48243352e":[],"48257387":[29,31],"483257001":13,"48336413":[],"48356153e":[],"483m":[],"48418018":[],"48423285":[],"48461009":[],"48464841":[],"48476997":11,"484m":[],"48598711":[],"485m":[],"48629506":[],"486852":11,"48685204":11,"4871984":28,"487m":[],"48815255e":[],"488m":[],"489502":[],"48950243":[],"48994188":5,"49":[4,5,6,9,11,25,32,36,37],"49057373":31,"49078463":[],"49152":3,"49216685":21,"492m":[],"49313815":21,"493m":4,"4940954":[0,31],"49545139":21,"49555885e":[],"4959161509357395e":6,"495916150936645e":6,"495m":[],"49616116":[],"497":[3,4],"4974810657432664":[],"497m":[],"498":[3,4],"49865980e":[],"499":[3,4],"4990":28,"4992":28,"4993133":24,"4997":28,"499m":[],"4c4c7f":[9,10],"4d":3,"4f":6,"4pm":[29,31],"4s":[],"4y":8,"4y_i":10,"5":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,21,24,25,28,31,32,33,34,35,36,37,38,39],"50":[1,2,3,4,6,7,8,9,10,13,21,31,32,34,35,36,37,38,39],"500":[1,3,4,6,9,10,13,34,35,36,37,38,39],"50000000e":38,"50000455":5,"50000553":5,"50000718":5,"50000855":5,"50000969":5,"50001063":5,"50001142":5,"50001207":5,"50001261":5,"50001306":5,"50001343":5,"50001374":5,"500014":5,"50001414":5,"50001422":5,"50001439":5,"50001454":5,"50001466":5,"50001476":5,"50001485":5,"50001492":5,"50001498":5,"50001502":5,"50001506":5,"5000151":5,"50001512":5,"50001515":5,"50001517":5,"50001518":5,"50001519":5,"50001521":5,"50001522":5,"50001523":5,"50001524":5,"50001525":5,"50046106":21,"50079895":[],"500m":[],"501":[3,4],"5018":28,"50184628e":[],"501m":[],"502":[3,4],"50227564e":6,"50274255":[],"503":[3,4],"50321091":5,"504":[3,4],"50427787":34,"50462474":[],"5046808":28,"505":[3,4],"50519365":[],"50562981":[],"506":[0,3,4,32],"50653545":31,"506553":32,"50655336":32,"50691065":[],"50697511":[],"507":[3,4],"50721349":[],"507d50":[9,10],"508":[3,4],"50837888e":[],"50846111e":6,"50846112e":6,"5092982":24,"50it":6,"50j":[13,36],"50x10":[1,38,39],"51":[4,10],"510":[1,38,39],"511":[3,4],"511888":5,"51191552":6,"512":[3,4],"51374050":34,"514219":[31,32],"515m":[],"51741855":24,"5177783846":4,"51845286":[],"518895":31,"52":[3,4,36,37],"52015514":[],"52067151":31,"52078202":28,"52180619":31,"52204004":[],"52209178":[],"5222222222222223":[1,38,39],"522836":31,"522m":[],"52362157e":32,"52400486e":[],"52482437":[],"525054":[],"52512898":28,"52518625":[],"525739":[],"52573941":[],"526744":[11,32],"52687741":24,"5276":4,"52775466":34,"52795454":[],"52856208":[],"52874252":5,"52942586":11,"52944573":[],"529446":[],"52950417":[],"5297947920715131":[],"53":[3,4,9],"5303329":11,"53049637":37,"5305555555555556":[1,38,39],"531280":[31,32],"5320148":[],"53250091":[],"53278871":[],"532789":[],"5340022":[],"534362":31,"53515878":24,"53542722":[],"53558374":24,"5364857":24,"5369485":21,"53700083":24,"53703498":6,"53738247":34,"53755010e":[],"5378811":11,"53811172e":[],"5384615384615384":9,"539261":[11,32],"53946725":21,"54":[3,4,6,9,28],"540":9,"54039921":5,"54041041e":5,"541605":[31,32],"54285633":[],"543939":32,"54393936":32,"544439":[31,32],"54637219":34,"54644868":24,"55":[1,3,4,9,38,39],"55086461":[],"552042":[],"55315304":[],"55328795e":[],"5555555555555556":[1,38,39],"555m":[],"55649207":31,"556m":[],"557795":[11,32],"55854694":11,"55865092":31,"55867377":31,"55868255":[],"5594":6,"55955126":[],"55972302e":[],"55it":6,"56":[1,3,4,9,38,39],"56033697":5,"5608253":31,"5615739502773949":31,"56171141":[],"56198284":5,"561m":[],"56240703e":[],"56249706":24,"56288861":[],"562888614232874":[],"563167":31,"56364308":[],"56366546":[],"56399029e":[],"564":9,"564374":[11,32],"56465688":[],"56475572":31,"56477354":[],"565":9,"56536":[0,31],"56570797e":[],"56589683":34,"566":9,"56636537":[],"56636616e":6,"567":9,"56740132":[],"568":[9,34],"568587":[],"56858701":[],"569":[1,9,39],"56912044e":6,"56939714":5,"56965674":34,"57":[0,3,4,8,9,29,31],"570":9,"571":[5,33],"571105947979344e":6,"571105947979394e":6,"57201944e":6,"572069":31,"57285536":[],"573029":[],"57302926":[],"574465":[11,32],"57572321":[],"576":34,"57670824":[],"5769230769230769":9,"5786304":[],"57935482":31,"57952471e":[],"58":[3,4,9,10,29,31],"58076367":11,"5808118":[],"5810785":31,"58182803":31,"58193124":[],"581m":[],"58268575":[],"5828247":[],"5829913":[],"5833333333333334":9,"583595":[31,32],"58427764":28,"58465096":21,"58492636e":32,"58739348":21,"58742004e":[],"58793527":24,"58818643":[],"58841019e":[],"5888888888888889":[1,38,39],"58948138":[],"58948347":[],"59":[4,9],"59004971":[],"591317992":4,"5914397":24,"59222238":[],"59327016":24,"59412285":31,"5944444444444444":[1,38,39],"59446603":[],"59511582":[],"59545081":28,"59589728e":[],"59642735":28,"596m":[],"5974862":[],"59895188":[],"59916814e":[],"5cm":28,"5f":[8,36],"5x":8,"5y":8,"6":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,21,24,28,29,31,32,33,34,35,36,37,38,39],"60":[1,3,4,6,9,39],"60000":4,"6019067271":4,"60293962":5,"603636":31,"6037092":[],"60383004":[],"60420593":5,"60543038":32,"60673226":11,"6067329321734374":[],"60675691":24,"606760":5,"6071713":[],"60815105":6,"60883945":31,"60943791":[24,31],"60it":6,"61":[7,35],"61043964e":[],"6111111111111112":[1,38,39],"61197218":[],"612939":[31,32],"613579":[31,32],"61394448":[],"614808":[11,32],"61480907":24,"61504341":[],"61532006":[],"6153846153846154":9,"61585143":[],"61653285e":[],"61702282":6,"61775176":34,"618982":[31,32],"61971639e":[],"61992828e":[],"61it":6,"62":[3,4],"621102":31,"62373464":11,"625":[7,35],"62554614":[],"626635268":[6,34],"62841921":[],"62862896":[],"6289054":[],"62894215":5,"629100":5,"62910047":5,"62919818":[],"62it":6,"63":[0,1,3,4,6,7,32,34,35,38,39],"6300745149331701":32,"63025821e":6,"63162342":32,"63180447":34,"63227278":31,"63249532e":6,"63277911e":[],"633949":31,"634715":[],"63471545":[],"63498144":5,"6353716266230895":28,"63537163":28,"63567272":[],"63659131":21,"63677721":[],"637129335071195":32,"63837812":31,"63849228e":[],"63875295":[],"63957747":21,"64":[1,3,4,7,13,24,31,35,36,37,38,39],"64012627":5,"64056395":28,"64111239":[],"64147722":[],"64158883e":35,"64291044e":[],"64292493":[],"64299732":[],"64316192":34,"64316482":34,"64391062":[],"643m":[],"64502836":[],"64527549":32,"64550753":[],"64594566":5,"645946":5,"646283":[11,32],"64695862":24,"647":6,"64733822":28,"64742912e":6,"647473":[11,32],"64846973e":[],"649382":[11,32],"64969451":[],"649695":[],"64x50":[1,38,39],"65":[1,3,4,7,8,9,24,35,38,39],"65036493":[],"65196615":[],"652187":[],"65218729":[],"65322635":28,"6536392":32,"65408703e":[],"65409368":28,"65442354":32,"654424":32,"654m":[],"65565751":[],"65571174e":32,"65599456":32,"65626992":37,"65628888":[],"6568551":[],"65704027":[],"657041":31,"65715086":28,"65720414":[],"65743689":32,"65825344":24,"65833132":32,"65885453":5,"65891389":32,"658914":32,"65913552":28,"66":[3,4],"660470":11,"66047048":11,"66051179":[],"66064822":32,"66080313":32,"66204648":6,"66219404":6,"6628996975186953":32,"66294408":32,"66323494":[],"6638":9,"66490332e":21,"66510547":13,"6652177":32,"66545355":[],"66560":9,"66562658e":[],"665m":[],"666597":31,"666897":[],"66689729":[],"667":9,"667239":31,"66798429":[],"668172":[31,32],"66878535":21,"66m":4,"67":9,"67035174":[],"67047975e":6,"67109613":24,"67189384":[],"671m":[],"67264685":[],"672721":[31,32],"67314874e":5,"67347822":[],"67432237e":[],"67541155":13,"67554897":[],"67640036":[],"67671601":[],"6780674":[],"67890723":[],"68":[],"68037392":5,"680374":5,"68192193":5,"68286725":32,"68419351":[],"684194":[],"68534263e":6,"68542204":5,"685643":[],"68564345":[],"68581655":37,"68592431":34,"6860597312101988":[],"6869":9,"68711054":24,"68759903e":[],"687m":[],"6887363571":4,"68929213e":6,"689345":31,"689519":[11,32],"68971917":28,"68992377":31,"69":[7,9,28,35],"690":9,"69009002":[],"690617":[31,32],"69069n_":28,"690710":[],"69071035":[],"69111133e":[],"692":[1,34,38,39],"692268":[],"69226802":[],"69230769":36,"6923076923076923":9,"69233822":28,"692m":[],"69314603":21,"69481287":28,"69484813e":5,"69504801":6,"69519297":24,"69582036":[],"69634577e":6,"69695259":5,"69714468":[],"6980":[21,36,37],"69818111":[],"69873514":[],"699":[],"69908626":6,"6999536":11,"69997503":32,"6n_":28,"6pm":31,"7":[0,1,2,3,4,5,6,7,8,9,11,12,13,15,21,24,25,27,28,30,31,32,34,35,36,37,38,39],"70":[1,6,7,9,35,38,39],"700":[],"70037324e":32,"701":[],"701370":5,"702":[],"70224083":13,"70249832":24,"70344416":5,"704":[],"70408916":31,"70506522":31,"70573539":[],"70653767":4,"706833":[],"70710678":[5,32],"7082333":31,"70832814":5,"7086067479626619":32,"70899024":31,"7094664":[],"70967214":24,"709698":31,"71":[1,38,39],"7100524":[],"71038664":24,"71137935":28,"71142161":32,"711422":32,"7119":9,"712018":[11,32],"71269506e":[],"71285447":[],"713163":31,"7135487":[],"71375273e":[],"71424969":[],"71437567912473":[],"71437568":[],"71467081":[],"71504681":[],"71640333":[],"71647328":31,"71727268":5,"717273":5,"71737253":32,"71761101":32,"718165":5,"71977472":24,"72":24,"7207467":31,"7215423":31,"72174172":11,"72228205":31,"72271878e":6,"72328506":[],"7236674":5,"724":3,"72546953":31,"72651548":24,"72742343e":[],"72859758":5,"72981762":8,"73":[6,31,34],"731000":[31,32],"73231305":[],"73293298":[],"7330932":28,"733096":[31,32],"73379189":31,"734107":[],"73410729":[],"73441814":28,"73448544":[],"73456649":[],"74":[6,34,36,37],"740":9,"74081822":8,"740m":[],"741391":[],"7413913":[],"741m":[],"74280244":[],"743189104728408":11,"74384949":32,"74391438":24,"74401372":[],"74430995":28,"74462857":[],"74577867":[],"74607851":32,"74724767":[],"74731872":24,"74818082":[],"74829661":32,"74840212":5,"7484672e":[],"7490462":[],"749765":[31,32],"75":[5,6,8,9,11,25,31,32,34,38,39],"750445":[31,32],"75050135":32,"75054469":28,"7506274061293645":[],"751699":[11,32],"75170092":5,"75174305":11,"75268791":[],"75269037":32,"75282841":[],"75315452":[],"75354069":[],"75457798":[],"75472506":21,"75576555":32,"75627883":[],"756279":[],"75631027":[],"756352":[31,32],"75719828":[],"75770568":32,"75823753e":[],"7588118737641243":31,"75963425":[],"76":[9,29,31],"76004012":[],"76010633":[],"76077707e":[],"76084455":[],"76135601":24,"76174289e":[],"7640203256838339":11,"7644":[],"764997683364458":[],"765":[7,35],"7651068":[],"7664107":[],"76771975":[],"7692307692307693":9,"76936315":5,"7694444444444445":[1,38,39],"7697":34,"7698352":31,"76985203":28,"77":[9,29,31,36,37],"770204":[],"77025447e":[],"77067609":31,"77133246":28,"77152076":5,"7718":9,"77184871":21,"77203046":24,"77265448":[],"77265782":31,"77343022e":[],"77448317e":[],"7748567":[],"77589027":[],"77632628":[],"77636e":[13,37],"77646856":[],"77714169":8,"7779287093124035":[],"77794957":[],"7782028952":4,"77856932":[],"78":[],"78009660e":32,"7803213":31,"78156479e":5,"78177713":[],"78184120e":6,"78220032":24,"78299706":[],"78316665":28,"785061":31,"78521833":24,"78524451e":[],"78556129":[],"7865355":31,"788388":11,"78838813":11,"78882958":[],"78886274":[],"7893215781870513":5,"78941903":5,"78951443":[],"79":31,"79035184":24,"79072516":[],"79106945e":[],"79111643":5,"79125269":[],"791809":[],"793167":[31,32],"79328516":[],"794282":[11,32],"794906":[],"79490641":[],"795225339396409":[],"79550688e":[],"79578306":[],"79675445":[],"79787771":[],"797e":6,"79896478e":[],"79909592":34,"79914677":[],"7993408651198877":34,"79934087":34,"7995707762668065":34,"7d7d58":[9,10],"8":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,21,22,24,25,26,28,31,32,33,34,35,36,37,38,39],"80":[0,1,5,6,8,9,32,33,34,38,39],"800":[4,7,35],"80074264":24,"80152684":[],"80189569":[],"80207897":24,"80228781e":[],"802550782087107":[],"80354994":6,"80389541":31,"80447153":31,"80460179":34,"80469739":5,"80540415e":[],"80548430e":[],"8055555555555556":[1,38,39],"80609615e":6,"80609616e":6,"80625657":[38,39],"80802836":[],"80847477e":6,"80861057":[],"808611":[],"81":[1,38,39],"81048318e":6,"81071342":[],"81114345":[],"81122914":21,"81160425":5,"81333804":6,"813929":11,"81392948":11,"814":[7,11,35],"81597834":34,"815am":[29,31],"81633628":11,"816454":[31,32],"81651921":[],"81664404":[],"816847":[31,32],"81753152":[],"81759234":21,"81784973":[],"8182":[],"81840893":31,"81853487e":21,"8186717":[],"81948868":24,"81953844":31,"8197":[],"82":[],"82001111":28,"820122":11,"82012236":11,"82102668":[],"82139086e":[],"82198978":5,"82292185":31,"82296251":[],"82379443":11,"82410428":[],"8249367":21,"82651934e":[],"8265786":5,"827462":28,"82781715":21,"82909728":[],"82988221":24,"83":31,"83009076":28,"8305555555555556":[1,38,39],"8306":6,"8311393813043355":28,"83140314":28,"83140314044099":28,"83146596":34,"83190841":[],"83298727":[],"832987270767667":[],"832m":[],"83384573":[],"8342":6,"83443463":24,"83443698":[],"83488328":[],"83505053":[],"8351":6,"83512277":5,"8353591":31,"836186":11,"83618601":11,"83657122":[],"83752888e":[],"83770406":[],"83774539":[],"83793362":[],"83870794e":[],"839818":31,"84":[],"84082439":[],"84094234":[],"84132082":31,"84159521":[],"842101":11,"84210141":11,"842436":[31,32],"84290819e":[],"84355903e":[1,38,39],"84359332e":[],"84380376":[],"84443254e":[1,38,39],"84444399":[],"845716766413386":[],"84571677":[],"84575663":[],"8461538461538461":9,"84638256":[],"846383":[],"84666445":[],"84671508":28,"84698999":28,"84780262":6,"84783351e":[],"84835621":11,"84846601":[],"84858":33,"84859258":[],"84923989e":6,"84927263":[],"84929103":[],"84942247e":[],"84991754":31,"84994524":5,"84m":[],"85":[1,9,38,39],"850164":5,"85035714":[],"85263220":6,"85276246":24,"85278920e":5,"85288931":[],"85297050e":[],"85355539":21,"85365229":21,"853835":31,"85514104":[],"85548858":[],"85601654":0,"85601992":5,"85615662":[],"85654993":31,"85714286":35,"8574":[],"858":9,"85813693":13,"858185":31,"8583333333333333":[1,38,39],"85888897e":[],"86":[],"86012593":[],"86015267":[],"86117291":5,"86134827":5,"86145244":11,"861676":31,"86221134":[],"86252988":6,"86282204":31,"86341536":[],"8635085":[],"8638888888888889":[1,38,39],"86420934":31,"86452742":[],"86619181":[],"86630":9,"8666666666666667":[1,38,39],"86666667":35,"86810":9,"86811569":24,"86850963":24,"86852099":31,"869":[0,31],"87":[9,32],"870":[0,31],"8702784034":4,"87072815e":32,"871":[0,31],"8722222222222222":[1,38,39],"87242312":[],"8727831":28,"873":[0,31],"87381451":5,"874":[0,31],"87403627e":[],"87431418":24,"87458904":[],"875":[1,38,39],"87533278":[],"87533326":24,"875794":[],"8759":[13,37],"876":6,"87627342":34,"87795661":[],"878123":31,"8784267":[],"8791492":28,"87931006":24,"87953769":24,"88":[13,36,37],"88046261":5,"8805555555555555":[1,38,39],"88168312e":6,"88182591":32,"88291866":21,"88305878":[],"88323026":32,"88336879":5,"884399":[],"88442538":5,"884669":32,"88529063e":6,"88613493":32,"88744469e":[],"888214":11,"88821402":11,"888577549915147":[],"8888888888888888":[1,38,39],"88901776":31,"88908909e":[],"8897518e":[],"89":0,"89098129":24,"89126914e":32,"8915573":[],"89288636":11,"89321335":28,"89410423":5,"8942133":[],"8944444444444445":[1,38,39],"89481038":21,"89604286":31,"89609007":[],"896911":[],"8969113":[],"89793609":[],"89805982e":21,"89823921":[38,39],"89897156":31,"89996783":[],"8f":[6,34],"8g":[6,34],"8n":24,"8x8":[1,38,39],"9":[0,1,2,3,4,5,6,7,8,9,11,12,13,21,22,24,26,27,28,29,31,32,33,34,35,36,37,38,39],"90":[1,6,9,39],"90075537":5,"9011":6,"90220243":5,"90223115":[],"90266948":5,"9027777777777778":[1,38,39],"90297441":[38,39],"90325763":[],"9036573":[],"9040":9,"904648525660773":[],"90475506e":6,"9050595316983907":24,"9054":34,"9055555555555556":[1,38,39],"90556496":24,"906747":5,"90793019":13,"90803422":[],"90854751":11,"908548":11,"90871918":21,"908736":[],"90873644":[],"909327":3,"90960269":31,"91":[29,31],"910":9,"91022359":24,"91050344e":[],"91080327":21,"91086026":24,"9111111111111111":[1,38,39],"91128596":5,"912":[3,4],"9129629":[],"91358019":24,"91373404":28,"914":[3,4],"9142491":[],"91492986e":6,"915":[3,4],"91538877":[],"91619855":13,"91650774":[],"916508":[],"9165822":[],"9166666666666666":9,"917":[3,4],"917482":11,"91748202":11,"91760278":5,"91784246":[],"918":[3,4],"91812702":5,"918992":[31,32],"91966064":[],"92":[6,9,29,31],"920619":11,"92067658":[],"9208878":[],"92103867":[],"921368":5,"92136836":5,"922002":11,"92200223":11,"92236466e":[],"9230769230769231":9,"92351924":[],"923602":31,"92405283":[],"924e":6,"925":[1,38,39],"92507116e":[1,38,39],"92578916":5,"92579609e":[],"92630576":31,"92648983":[],"92651068":34,"92717417":[],"92729959":[],"92772833":[],"9277777777777778":[1,38,39],"92857143":[7,35],"92930426e":[],"9295763474254684":[],"93003138502386":28,"93022647":31,"9305555555555556":[1,38,39],"930829":5,"93082933":5,"931":[0,31],"93155188":5,"93158979":5,"932656":[],"93267138892912":[],"93267139":[],"933":[5,33],"93420126":[38,39],"93492130e":6,"93500562":[],"93528653e":[],"93571082":[],"93601008e":32,"937":28,"937082":[31,32],"93799826":5,"938":28,"93820524":[],"9387":9,"93884803":[],"939":[0,28,31],"93944615e":[],"93988393":[],"94":[7,28,35],"94226022e":6,"94230225":[],"942422095469182":[],"94256677":[],"94260358":[],"942604":[],"94273542":32,"94284104":5,"94320205":5,"94338159":[],"943439":[],"94399217":28,"944":[3,4],"94400087":24,"94433302e":[],"9444444444444444":[1,38,39],"94484047e":38,"945":[3,4],"94591015":[24,31],"946":[3,4],"94639099":11,"94642209":31,"946957":5,"94697839":[],"947":[3,4],"9472222222222222":[1,38,39],"948":[3,4],"94814932":[],"94815131":[],"9481513127527335":[],"94822514":6,"94823368":31,"9482527":5,"94854992":[],"94866246":[],"949":[3,4],"949162":11,"94916237":11,"94938706":[],"95":[1,7,9,11,34,35,38,39],"950":[3,4],"95008046":6,"9503219":28,"95055425":[],"951":[3,4],"951109":[],"95117099":[],"95166414":31,"95190644":[],"95231424":5,"95235306":21,"952387":32,"9527777777777777":[1,38,39],"95284275":5,"953065564":[1,38,39],"95327702":[],"95329348":[],"95351665":5,"95355327":[],"954":28,"95429024":[],"95508909":[],"95511792":32,"955118":32,"9555555555555556":[1,38,39],"95558642":[],"955820c21e8b":4,"956563":[11,32],"95661705":31,"95679388":31,"95684892":5,"95686268":[],"95697233e":[],"95703":[13,37],"95746721":24,"95763525":[],"9578":[],"958228616652075":5,"95982273":13,"96":[6,7,11,34,35],"960":28,"9601304850035702e":6,"960130485007504e":6,"96024953":5,"96033509e":[],"96046928":[],"96084663":5,"961":28,"96183456":[],"962":28,"962653":5,"962990":31,"963198":[],"9637117593816477":6,"9640435":5,"96459246":31,"96461989e":[],"9649652536":4,"96543101":31,"965548":[31,32],"96599594":24,"96611032":[],"96618584":24,"96631321":32,"96688672":5,"966899":31,"9674916":5,"96750421":[],"967809":[11,32],"96783837":13,"96804366":[],"96841776":[],"96850702":24,"96890557e":[],"969":6,"96911909":28,"97":[7,35],"97005689":5,"97062694":[],"97069774":[],"970698":[],"97108e":[13,37],"9716":[],"9722222222222222":[1,38,39],"9723":[],"97243128":5,"97262227":[],"97300836":5,"97449977":31,"97488151":[],"97497404e":6,"975":[1,38,39],"97507735":5,"97514104e":[],"97594511":[],"97606135":28,"97606135399951":28,"9764":[],"97644118":[],"9765":[],"97690235":34,"97705827":5,"97758848":5,"9777777777777777":[1,38,39],"978":33,"9780387310732":30,"9780387848570":30,"97804446":[],"9781492032632":30,"9783319210079595":[],"978553":5,"97866042":24,"97879245":[],"97898392":[6,32],"979":6,"97906022e":32,"97926491":5,"97948913":[],"9797317":28,"98":[0,1,7,9,35,38,39],"980":9,"98004227":[],"9805555555555555":[1,38,39],"98073929":5,"98091621":5,"98127617":[],"981321":[31,32],"98139097":5,"98215566e":[],"98275501":5,"98316168":31,"983310":[31,32],"98404993":[],"98413059":5,"984182":[],"98418221":[],"98430782":[],"984308":[],"98454786":5,"984601":[],"98460101":[],"9849967686928113":35,"985":28,"98566191":5,"986":28,"98601306":28,"9861111111111112":[1,38,39],"98620879e":[],"986699":5,"98680716":5,"98686102":[],"98694705":[],"98706221":[],"98716878":5,"9871776311306221":[],"98765625":24,"987722":11,"98772232":11,"98808176":5,"98822371":6,"988835":[],"9888544725633199":[],"9888888888888889":[1,38,39],"989":28,"9890348":5,"98914003":[],"9893447":5,"98947894":32,"9898ff":[9,10],"99":[6,7,9,11,13,21,34,35,36,37],"990":9,"99006712":31,"99009525":5,"99051150":6,"99083639":[],"99084226e":[],"99088801":5,"991":28,"99106686":[],"99115119":5,"9915165982451293":32,"99176998":5,"992":28,"99215828":[],"99242921":5,"99265097":5,"99268332":[],"993":28,"99316252":5,"99371056":5,"99389612":5,"9940253773173835":[],"9943201":5,"9947756":5,"99484719":31,"99492986":5,"9950597269547777":[],"9952222065466447":32,"99528218":5,"99539415":5,"9955500279779226":[],"99566069":5,"99578809":5,"995840825550726":32,"99589367":[],"996":[5,33,34],"99608161":5,"99630114":21,"9963311287748658":[],"9963961":5,"99650061":5,"9967458":5,"9969332511584248":[],"99700706":5,"99709215":5,"99729756":5,"99751458":5,"99758326":5,"99767262":[],"99775587":5,"9978254":[],"99793613":5,"99799099":5,"99813653":5,"99828624":5,"9983295":5,"99845267":5,"99854557":32,"998577":5,"99861053":5,"99862019":32,"99866581":[],"99869482":32,"99871521":5,"99876945":32,"99881845":5,"99883628":32,"99884384":5,"99884409":32,"99888222":[],"99891093":32,"99891873":32,"99893323":5,"99898558":32,"999":[9,21,28,36,37],"99901896":5,"99903755":5,"99906023":32,"99911427":5,"99912709":32,"99913489":32,"99918546":5,"99919837":5,"99920175":32,"99926459":5,"99927642":32,"9993237":5,"99932732":[],"99933188":5,"9993511":32,"9993736":[],"99938942":5,"99941797":32,"9994385":5,"99944037":[],"99944272":5,"99949077":[],"99949266":32,"99949306":5,"99953381":5,"99953475":5,"99956735":32,"99957911":5,"99961294":5,"9996357":[],"99965056":5,"99967865":5,"99970894":32,"99970988":5,"9997332":5,"99975913":5,"99977849":5,"99978365":32,"99980002":5,"9998161":5,"99984215":[],"99984732":5,"9998542":[],"99987324":5,"99988325":[],"99989476":5,"99991263":5,"99992263":21,"99992746":5,"99993978":5,"99995":5,"999955585168597":6,"99998193":21,"99998703":21,"99999773":21,"99999985":[],"9m":4,"9x":[6,25],"9y":[6,25],"\u00f8yvind":[6,32,33],"abstract":[1,20,36,39],"boolean":4,"break":[0,4,6,11,14,31],"byte":[24,31],"case":[0,1,2,3,4,5,6,7,11,12,13,14,16,21,23,24,25,26,31,34,37,38,39],"catch":[0,31],"class":[0,1,3,4,6,7,8,9,11,12,13,28,31,34,36,37,38,39],"default":[0,1,2,4,6,7,13,16,24,25,26,31,32,33,35,36,39],"do":[0,2,3,4,5,6,8,9,10,11,12,13,14,15,16,21,22,24,25,26,32,35],"ekstr\u00f8m":4,"export":9,"f\u00f8470":[29,31],"final":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16,18,19,20,22,25,27,28,29,31,34,35,39],"float":[0,3,4,5,9,11,13,14,24,31,32,36,37],"function":[2,3,4,5,9,14,15,16,17,18,19,22,23,24],"import":[0,1,2,3,4,6,7,8,9,10,11,12,13,14,16,17,25,28,34,35,36,37,38,39],"int":[0,1,2,3,4,5,6,11,13,14,21,24,28,32,34,36,37,38,39],"long":[0,1,3,4,12,13,31,35,36,37,38,39],"m\u00f8svatn":[6,25],"new":[0,1,2,3,5,6,7,8,9,10,11,13,14,17,21,24,25,31,32,35,36,37,38,39],"null":31,"public":[0,23,31],"return":[0,1,2,3,4,5,6,7,8,9,11,13,14,21,24,25,28,31,32,33,34,35,36,37,38,39],"sch\u00f8yen":[6,32,33],"short":[4,5,25,26,33,34],"super":[3,5,32,33],"switch":0,"throw":[3,6,28,34],"true":[0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,19,24,25,26,28,31,32,33,34,35,36,37,38,39],"try":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,23,24,25,26,28,31,32,33,34,35,36,37,38,39],"var":[1,5,6,10,11,13,18,19,25,28,31,32,33,34,36,38,39],"while":[0,1,3,4,5,6,7,8,9,11,12,13,28,31,32,33,34,35,36,37,38,39],A:[2,3,5,6,7,10,11,12,13,16,18,20,22,23,24,25,26,27,28,29,30,32,36,37,38],AND:2,And:[0,3,4,5,6,9,13,20,23,25,26,28,38,39],As:[0,1,2,3,4,5,6,8,10,12,13,16,24,25,26,28,31,32,33,34,35,36,37,38,39],At:[0,4,6,13,25,31,36],BE:[0,31],Be:[2,23,31],Being:[13,36],But:[0,1,2,3,5,6,9,10,26,28,32,33,34,39],By:[0,3,5,6,12,13,17,24,31,32,33,34,35,36,37,38],For:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,23,24,25,26,27,28,30,31,32,33,34,35,36,37,38,39],IF:[6,33,34],IN:30,If:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,21,23,24,25,26,28,31,32,33,34,35,36,37,38,39],In:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,21,22,23,24,25,26,28,30,31,32,33,34,35,36,37,38,39],Is:11,Ising:[5,12,32,37,38],It:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,23,24,25,26,28,31,32,33,34,35,36,37,38,39],Its:[1,2,4,11,38,39],NO:[7,11,35],No:[3,4,6,9,31,33,35,37],Not:[0,1,5,6,31,32,33,34,37,38,39],OR:28,Of:28,On:[0,3,15,27,28,29,30,31],One:[0,1,3,4,5,6,7,8,11,12,13,17,20,21,25,28,32,34,35,36,37,38,39],Or:[0,1,6,25,31,35,39],Such:[0,6,12,16,28,34,35,36,37,38],That:[0,5,7,10,11,12,14,19,25,28,31,33,34,35,38],The:[4,10,13,14,15,16,18,19,20,21,22,24,25,26,27,28,29,30],Their:[38,39],Then:[0,1,6,8,9,10,11,12,13,14,24,25,31,32,34,35,36,37,38,39],There:[0,3,4,5,6,8,9,11,12,14,24,25,27,28,29,31,32,33,35,36,37,38],These:[0,3,4,5,8,9,10,11,12,13,14,15,16,24,25,26,28,29,31,32,33,36,37,38,39],To:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,21,24,25,26,28,33,34,35,36,37,38,39],With:[0,5,6,8,9,10,11,12,14,18,24,25,26,28,31,32,34,37,38],_0:[5,8,10,11,13,32,35,36],_1:[2,5,6,8,10,11,12,13,14,24,32,33,34,35,36,37,38,39],_2:[2,5,8,11,12,13,24,32,36,37,38],_3:24,_4:24,_9:[13,36,37],_:[0,1,2,4,5,6,7,8,9,10,11,12,13,17,18,19,21,24,25,31,32,33,34,35,36,37,38,39],_________________________________________________________________:4,__call__:[3,4],__class__:10,__doc__:[6,34],__future__:[8,9],__getattr__:33,__getitem__:[],__init__:[1,3,33,38,39],__main__:2,__name__:[2,10,33],__traceback__:[3,4],_auto10:[6,12,37,38],_auto11:[6,37],_auto12:[6,37],_auto1:[2,3,4,5,6,7,12,13,21,24,28,32,35,36,37,38],_auto2:[2,3,4,5,6,12,13,24,28,36,37,38],_auto3:[3,4,5,6,12,13,24,36,37,38],_auto4:[4,6,12,13,24,36,37,38],_auto5:[4,6,12,13,24,36,37,38],_auto6:[4,6,12,24,37,38],_auto7:[4,6,12,24,37,38],_auto8:[6,12,37,38],_auto9:[6,12,37,38],_base:8,_build:[0,17,19,23,25,30,31],_build_call_output:[3,4],_c:[1,38,39],_call:[3,4],_call_flat:[3,4],_check_optimize_result:[7,11,35],_compon:11,_coordinate_desc:6,_decor:[0,31],_depth:9,_distn_infrastructur:35,_eagerdefinedfunct:[3,4],_fraction:9,_handl:[3,4],_i:[0,1,2,5,6,7,8,11,12,13,15,16,17,19,25,31,32,33,34,35,36,37,38,39],_inference_funct:[3,4],_interpolatefunctionerror:[3,4],_j:[0,1,2,3,5,6,8,13,17,19,25,32,33,34,36,38,39],_jit_compil:[3,4],_k:[13,35,36,37],_l:[12,37,38,39],_lambda:[6,31],_leaf:9,_lock:[3,4],_logist:[7,11,35],_m:10,_make_vjp:[13,37],_maybe_define_funct:[3,4],_multilayer_perceptron:[1,38,39],_n:[2,5,8,11,13,32,35,36],_node:[9,13,37],_notokstatusexcept:[3,4],_num_output:[3,4],_p:[5,8,32],_process_traceback_fram:[3,4],_r:[3,4],_ratio:11,_sampl:9,_select_forward_and_backward_funct:[3,4],_split:[6,9,25],_src:21,_stateful_fn:[3,4],_stateless_fn:[3,4],_t:[13,21,36,37],_test:[6,25],_trace:[13,37],_unpad:[],_valu:[13,37],_varianc:11,_weight:9,a0:3,a0faa0:[9,10],a1:[0,31],a2:[0,31],a3:[0,31],a4:[0,31],a_0:[0,21,22,26,31],a_1a:[0,31],a_1x:[21,22,26],a_2a:[0,31],a_2x:[21,22,26],a_3:[0,31],a_3a:[0,31],a_4:[0,31],a_4a:[0,31],a_:[0,1,16,24,31,32,38,39],a_h:[1,38,39],a_i:[0,1,2,12,31,38,39],a_j:[1,12,38,39],a_k:[0,1,12,38,39],aaron:30,ab:[0,2,5,13,14,21,31,32,33,36,37],ab_channel:23,abandon:[1,39],abbrevi:27,abid:28,abil:[0,10,31],abl:[0,1,4,5,6,7,10,12,13,16,25,32,35,36,37,38,39],about:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,23,24,25,26,29,33,34,35,36,37,38,39],abov:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,24,25,26,28,30,31,32,34,35,36,37,38,39],abovement:[6,34],abscissa:[13,35,36],absolut:[0,2,5,6,13,31,32,33,34,36,37],absorb:[32,33],acceler:[13,21,36,37],accept:[0,3,6,9,25,31,32],access:[0,3,11,28,32],accid:[4,6,34,35],accompani:[0,31,32],accomplish:[8,9,13,36,37],accord:[0,1,2,5,6,9,12,13,14,15,16,28,31,33,34,35,36,37,38,39],accordingli:11,account:[0,3,5,13,15,28,31,33,34,36,37],accumul:[12,13,21,28,36,37,38],accur:[0,3,4,6,10,13,34,36,37],accuraci:[0,1,3,4,5,6,7,9,10,11,12,26,31,32,35,37,38,39],accuracy_scor:[0,1,10,31,38,39],accuracy_score_numpi:[1,38,39],achiev:[0,1,5,6,8,12,24,31,33,34,37,38,39],aco:28,acquaint:[23,31],acquir:[1,23,31,39],acr:[0,32],across:[1,3,6,9,23,31,34,38,39],act:[1,3,24,38,39],action:28,activ:[0,2,3,4,9,27,29,31,34,35,36],actual:[0,1,4,5,6,8,11,16,24,28,31,32,33,34,39],ad:[1,3,4,5,8,13,15,16,24,33,34,35,36,39],ada_clf:10,adaboostclassifi:10,adadelta:[13,36,37],adagrad:[22,26],adam:[1,3,4,22,26,29,31,39],adapt:[4,6,13,30,32,34,35],add:[0,1,2,3,4,5,6,8,10,11,12,15,16,17,21,22,25,26,28,31,32,33,34,36,38,39],add_outgrad:2,add_subplot:[1,7,12,14,35,37,38,39],addendum:5,addit:[0,2,3,5,6,7,8,9,10,12,13,15,17,21,22,23,24,25,28,29,30,31,32,33,34,35,36,37,38],addition:[12,13,35,36,37,38],address:[1,9,11,13,31,36,37,39],adjac:[3,12,37,38],adjoint:[5,32,33],adjust:[0,5,12,13,35,36,37],admir:[0,31],advanc:[4,6,12,30,31,34,37,38],advantag:[1,3,5,6,10,13,24,33,34,35,36,37,38,39],adversari:31,afecionado:31,affect:3,affin:[0,3,8,11,32],afford:3,aficionado:31,aforement:14,african:[0,32],after:[0,1,2,4,5,6,9,11,12,13,15,20,21,23,24,25,26,28,31,32,33,34,36,37,38,39],afterward:[0,31],ag:[0,7,27,31,32,35],ag_0:2,again:[0,1,4,5,6,7,8,10,11,12,13,15,16,21,22,25,26,28,31,32,33,34,36,37,38,39],against:[1,4,7,10,21,22,26,35,38,39],agegroup:[7,35],agegroupmean:[7,35],aggreg:[9,10],agorithm:10,agre:[5,6,28,33,34],agreement:[13,21,36,37],ahead:9,ai:[0,26,30],aid:[11,20],aim:[0,1,4,6,7,11,14,15,16,23,24,25,26,32,34,35,39],ainv:5,airplan:3,aka:[5,33,34],al:[0,2,4,15,16,17,26,30,31,32,33,34,35,36,37,38,39],alarm:[5,7,33,34],algebra:[0,3,5,13,21,23,32,33,34,36,37],algorithm:[0,1,2,4,5,6,7,8,13,14,22,23,24,25,28,30,31,33,34,35],align:[0,2,5,6,7,8,13,25,28,31,32,33,34,35,36],all:[0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],allevi:[1,13,35,36,39],alloc:[3,24],allow:[0,1,2,3,5,6,8,10,13,15,16,23,24,25,31,32,33,34,35,36,37,38,39],almost:[0,1,6,8,11,13,21,28,31,34,35,36,37,39],alon:[2,9],along:[2,3,4,5,6,9,10,11,23,24,31,32,33,34,35],alpha:[0,1,2,3,4,6,7,8,9,10,13,14,28,31,32,34,35,36,38,39],alpha_0:3,alpha_1:3,alpha_2:3,alpha_:10,alpha_i:[3,13,36],alpha_k:[13,36],alpha_m:10,alpha_n:3,alpha_opt:[13,36],alreadi:[2,3,4,5,6,10,12,23,24,28,31,32,33,34,37,38],also:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,23,24,25,26,27,28,31,32,33,34,35,36,37,38,39],alter:[1,38,39],altern:[0,1,4,5,6,7,8,9,11,13,24,25,31,32,33,34,35,36,37,38,39],although:[0,1,5,6,8,10,13,16,21,31,33,34,36,37,39],alwai:[0,3,5,6,12,13,16,21,28,31,32,33,34,35,36,37,38],am:[4,32],ame2016:[0,31],american:[0,32],among:[0,3,5,9,10,12,24,31,32,33,37,38],amongst:[5,33,34],amount:[0,1,3,4,6,8,10,14,23,34,39],an:[1,2,3,5,6,7,8,9,11,12,13,14,15,16,17,19,20,21,23,24,25,26,28,29,30,32,33,34,35,36,37,38,39],an_:28,anaconda:[0,1,15,23,25,31,39],analog:[13,36,37],analys:[6,33,34],analysi:[1,3,4,7,14,15,16,17,19,21,22,24,30,35,38,39],analyt:[2,3,5,6,7,12,13,15,22,23,25,26,31,32,33,34,35,36,37,38],analytical_gradi:21,analyz:[0,1,3,4,5,6,16,17,25,26,28,31,32,33,38,39],andrew:[1,38,39],angl:[0,3,9,32],anharmon:3,ani:[0,1,2,3,4,5,6,7,8,9,10,12,14,18,28,31,32,33,34,37,38,39],anim:[4,12,37,38],ann:[12,37,38],annot:[0,1,3,7,8,31,32,35,38,39],announc:31,anoth:[0,1,3,4,5,6,7,8,10,11,12,13,24,25,26,28,31,32,35,36,37,38,39],ans_vspac:[],ansatz:[0,31],answer:[0,1,3,5,6,24,25,26,29,31,33,34,38,39],antialias:[2,6,25],anticip:4,anymor:[1,8,39],anyon:[4,8],anyth:[1,28,39],anytim:[29,31],apach:[1,39],apart:[11,13,35,36],api:[1,23,31,39],appar:2,appear:[0,1,3,13,16,24,28,31,36,37,38,39],append:[1,3,4,8,9,13,21,31,36,39],appendix:25,appl:[3,4],appli:[0,1,2,3,4,6,7,8,9,10,11,12,13,15,16,25,26,28,30,31,32,33,34,35,36,37,38,39],applic:[0,1,3,4,5,6,7,9,12,13,21,24,25,28,30,31,32,34,35,36,37,38,39],apply_gradi:4,approach:[1,2,4,5,6,9,10,11,12,13,17,21,23,28,30,32,35,38,39],appropri:[2,6,9,12,13,23,28,34,36,37,38],approv:31,approx:[0,2,3,6,10,11,13,28,31,34,35,36,37],approxim:[0,1,2,3,4,5,6,7,10,11,13,18,19,25,28,31,32,33,34,35,36,37,39],apt:[0,15,23,25,31],aq:28,ar:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],aragorn:31,arang:[1,3,4,6,7,9,10,12,13,25,31,35,36,37,38,39],arbitrari:[1,4,6,8,12,13,28,34,35,36,37,38,39],arbitrarili:[0,1,11,31,38,39],arc:[6,25],architectur:[3,4,12],archiv:26,area:[0,3,6,9,25,30,31],arg:[0,2,3,4,13,31,37],argmax:[1,11,38,39],argmin:[4,10,14],argnum:[2,13,37],argnum_0:[],argnum_1:[],args_with_tang:[3,4],argsort:11,argu:[1,13,36,37,39],argument:[0,2,3,5,6,11,12,13,21,25,31,32,33,34,38],argval:[],aris:[0,6,12,13,28,31,34,35,36,38],arithmet:[0,13,24,31,36,37],arm:[6,33],armadillo:24,around:[0,1,4,5,6,11,28,31,33,34,38,39],arr:[],arrai:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,21,23,25,28,32,33,34,35,36,37,38,39],arrang:[3,31],arraybox:[13,36,37],arriv:[0,6,9,11,24,28,31,34],arrow:[12,37,38],arrowprop:8,art3d:[13,36],art:[0,1,15,23,31,39],articl:[0,3,4,6,10,18,26,31,32,33,34],artifici:[0,2,7,12,30,31,35],artificialneuron:[12,37,38],arug:[13,36,37],arxiv:[3,4,21,26,36,37],as_fram:32,asap:31,asarrai:[0,2,6,9,21,32,33,36],ashort:20,asid:32,ask:[5,6,11,12,33,34,38],aspect:[0,6,23,25,31,32,33],assembl:[0,3,31],assert:4,assess:[0,6,25,31,32,33,34],assici:4,assign:[0,7,8,9,12,13,14,27,29,30,31,32,35,36,37,38,39],associ:[0,6,9,12,14,28,31,34,37,38],assum:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,19,24,25,28,31,32,33,34,35,36,37,38,39],assumpt:[0,3,5,6,9,11,18,25,28,31,32],ast:[0,5,6,18,25,31,33,34,35],astronomi:[31,32,33,34,35,36,37,38,39],astyp:[4,9,10],asymmetri:[0,31],asymptot:[4,6,34],async_wait:[3,4],atla:31,atom:[0,31],attempt:[0,4,6,7,8,10,31,33,35],attend:27,attent:[0,24,31],attr:[3,4,33],attract:[0,10,31],attribut:[0,9,13,26,31,33,34],attributeerror:[13,33],audi:[0,31],audio:[3,4],august:[15,16,31],aurelien:[0,15,27,30,31,37,39],austfjel:[6,25],author:[0,1,10,28,31,39],authour:31,auto:[6,9,10,28],autocor:28,autocorrelation_tim:28,autocorrelform:28,autocovari:28,autoencod:[4,23,31],autoencond:23,autograd:[22,23,26,31],autom:[0,23,30,31],automac:24,automag:31,automat:[0,1,2,3,4,11,16,22,23,24,31,38,39],automobil:3,autonom:4,avail:[0,1,4,6,10,11,15,20,21,23,24,25,26,27,29,30,31,34,38,39],averag:[0,1,3,6,9,10,13,14,21,28,29,31,32,33,34,35,36,37,38,39],avoid:[0,4,5,6,9,11,13,21,24,31,32,34,35],awai:[2,3,6,32,33,34],awar:[2,10],award:[29,31],ax:[0,1,2,3,4,6,7,8,9,10,11,12,13,14,24,25,26,31,32,34,35,36,37,38,39],axes3d:[2,6,13,25,35,36],axes_grid1:6,axessubplot:32,axhlin:8,axi:[0,1,2,3,4,6,7,8,9,10,11,12,13,14,21,24,25,28,31,32,33,34,35,36,37,38,39],axiom:[5,33,34],axlabel:[0,31],axvlin:[4,8],axvspan:4,b1:8,b2:8,b3:8,b:[0,1,3,4,5,6,8,9,10,12,13,14,15,16,21,28,29,31,32,33,34,35,38,39],b_0:0,b_1:[0,2,12,13,36,37,38],b_2:[0,13,36,37],b_5:[13,36,37],b_:[0,1,24,38,39],b_group:9,b_i:[0,1,2,12,31,37,38,39],b_ia_:[0,31],b_ia_i:0,b_index:9,b_j:[1,12,37,38,39],b_k:[0,1,12,13,36,37,38,39],b_m:[12,37,38],b_score:9,b_valu:9,bachelor:[27,29],back:[0,3,4,5,6,8,9,10,15,24,26,28,31,32,33,35,36,37],backbon:24,backend:[1,4,21,39],background:[30,31,32],backpropag:[1,38,39],backtrack:9,backup:24,backward:[1,2,4,12,24,38,39],backward_pass:2,bad:[6,32,33],badli:28,bag:[9,23,31],bag_clf:10,baggin:31,baggingboot:10,baggingclassifi:10,baggingtre:10,balanc:[6,34,35],band:24,bandwidth:24,bar:[0,6,11,15,16,25,31],barber:30,bare:[4,10],base:[0,1,3,4,5,7,8,9,10,14,23,28,29,30,31,32,33,35,38,39],basi:[5,7,8,10,11,12,13,24,32,33,35,36,37,38],basic:[6,8,12,13,14,23,25,28,31,36,37,38,39],batch:[3,4,11,12,13,21,22,26,35,38],batch_shap:4,batch_siz:[1,3,4,38,39],batchnorm:4,bay:[7,35],bayesian:[5,23,30,31,33,34],beam:[31,34,35,36,37,38,39],becattini:29,becaus:[0,1,2,3,4,5,6,8,9,12,13,14,31,33,34,35,36,37,38,39],beccatini:31,becom:[0,1,2,5,6,7,9,12,13,21,28,31,32,33,34,35,36,37,38,39],been:[0,1,2,3,4,5,6,11,12,13,23,24,25,26,31,32,33,34,36,37,38,39],befor:[0,1,2,3,4,5,6,7,8,12,13,14,24,25,26,28,31,32,33,34,35,36,37,38,39],beforehand:[0,28,31],begin:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,21,24,25,28,29,31,32,33,34,35,36,37,38,39],behav:[1,6,13,34,35,36,39],behavior:[0,1,13,31,35,36,37,39],behaviour:[12,37,38],behind:[0,1,6,8,13,31,35,36,38,39],being:[0,1,2,3,4,5,7,8,10,11,12,13,17,28,31,32,33,34,35,36,37,38,39],believ:[9,24],belong:[7,8,9,13,14,35,36,37],below:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,24,25,26,28,31,32,33,34,35,36,37,38,39],benchmark:10,benefici:[1,13,36,37,38,39],benefit:[0,1,4,11,13,15,23,31,35,36,37,38,39],bengio:[1,21,22,26,27,30,31,32,36,37,39],benign:[1,7,9,35,39],besid:[4,5,33],bessel:[5,32,33,34],best:[0,1,2,3,4,5,6,7,8,9,10,12,13,25,26,29,31,32,34,35,36,38,39],best_estimator_:35,beta1:[21,36,37],beta2:[21,36,37],beta:[0,1,3,5,6,7,10,11,13,16,17,18,19,21,25,31,32,35,36,37,38,39],beta_0:[0,1,3,5,6,7,13,31,32,33,34,35,36,38,39],beta_0x_:[0,31,32],beta_1:[0,1,3,5,6,7,10,13,31,32,33,34,35,36,37,38,39],beta_1x_0:[0,31],beta_1x_1:[0,7,31,35],beta_1x_2:[0,31],beta_1x_:[0,31,32],beta_1x_i:[7,13,32,35,36],beta_2:[0,3,13,31,32,36,37],beta_2x_0:[0,31],beta_2x_1:[0,31],beta_2x_2:[0,7,31,35],beta_2x_:[0,31,32],beta_2x_i:32,beta_3:3,beta_3x_i:32,beta_4x_i:32,beta_:[0,3,6,7,13,31,32,33,34,35,36,37],beta_i:[0,3,5,17,31,32,33],beta_j:[0,5,6,13,18,25,31,32,33,34,36,37],beta_k:[13,35,36],beta_linreg:[13,21,35,36,37],beta_m:10,beta_mg_m:10,beta_n:3,beta_ol:34,beta_p:[7,35],beta_px_p:[7,35],beta_ridg:34,betaol:34,betaridg:34,betavalu:5,better:[0,1,2,3,4,6,9,10,11,12,13,21,31,32,33,34,36,39],between:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,17,21,25,26,28,31,32,33,34,35,36,37,38,39],beyond:[0,1,5,6,8,13,21,25,31,32,35,36,37,39],bf:[13,14,24,28,35,36],bgd:[13,36,37],bia:[0,1,2,3,5,8,9,10,12,13,19,26,31,32,33,35,36,37,38,39],bias:[1,2,3,5,6,9,12,26,33,37],big:[0,1,2,5,6,14,18,31,33,34,38,39],bigger:[1,6,32,33,39],bigr:[12,37,38],bike:9,bilbo:31,billion:[3,12,23,37,38],bin:[0,7,28,32,35],binari:[0,3,5,7,9,10,12,26,31,33,34,35],binarycrossentropi:4,bind:[0,32],binomi:[23,28,31],binsboot:[6,34],bioinformat:[0,31],biolog:[1,12,37,38,39],bios1100:[23,31],bird:[0,3,31],birth:31,bishop:[27,30,31],bit:[1,4,24,28,31,38,39],bitwis:28,bivari:2,bk:[0,13,32,36,37],bla:[24,31],black:[8,9,14,21],bledso:31,blob:[19,20,25,31,35,36,37],block:[6,10,23,24,28,31,34],blogpost:4,blue:[0,3],bluntli:31,bm:32,bmatrix:[0,1,3,5,7,8,11,13,24,31,32,33,35,36,38,39],bmi:[1,38,39],bodi:[0,1,4,12,31,37,38,39],bold:[1,39],boldfac:[0,5,16,32,33],boldsymbol:[0,1,2,3,5,6,7,8,10,11,13,14,15,16,17,18,19,21,25,31,35,36,37,38,39],boltzmann:[12,23,31,37,38],book1:30,book:[19,25,26,30,31,33],boost:[1,9,23,31,39],boostrap:10,bootstrap:[1,13,19,23,25,26,31,35,36,37,39],borrow:31,boston_dataset:[0,32],bot:8,both:[0,1,4,5,6,8,9,10,13,14,15,16,23,24,25,26,28,29,31,32,33,34,35,36,37,39],bottl:[7,35],bound:[0,8,12,32,36,37,38],boundari:[2,4,8,11,12,38],box:[4,9],boxed_arg:[],boyd:[8,13,35,36],bracket:[4,28],brain:[1,7,12,35,37,38,39],branch:9,breast:[5,7,11,26,33,34,35],breat:26,breviti:[13,21,36,37],brew:[0,15,23,25,31],brg:8,brief:[25,26,32],briefli:[0,31],bring:[0,5,6,10,26,31,32,33,39],broad:[0,3,4,31],brought:[13,21,23,31,36,37],brownle:4,browser:31,brute:[3,5,11,32,33,35],bs:[8,9,10],buffer_s:4,bui:4,build:[0,4,5,6,10,24,28,31,33,34,35,36,37,38],built:[0,1,3,4,6,32,34,39],bunch:11,busi:[0,32],c1:[8,11],c2:[8,11],c:[0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,19,23,24,28,29,30,32,33,34,35,36,37,38,39],c_0:28,c_1:[12,37,38],c_2:[12,37,38],c_3:[12,37,38],c_4:[12,37,38],c_:[0,8,9,10,13,21,28,32,35,36,37],c_i:[12,13,36,37,38],c_k:28,ca:[1,31,39],cach:10,cal:[0,8,10,12,13,15,16,31,35,36,38,39],calcul:[0,1,2,4,5,6,8,9,10,11,12,13,14,15,16,18,21,24,26,28,31,33,34,35,36,37,38,39],california:[26,32],call:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,21,23,24,25,26,28,29,31,32,33,34,35,36,37,38,39],callabl:[3,4],callback:[3,4],calor:[0,32],cambridg:[13,30,35,36],can:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,23,24,25,26,28,29,30,32,33,35,38,39],cancel:[0,13,31,32,36,37],cancellation_manag:[3,4],cancer:[5,10,26,33,34],cancerpd:[7,35],candid:[8,9,10,36],cannot:[0,1,4,5,6,7,8,9,27,28,31,32,33,35,38,39],canopi:[0,15,23,25,31],canva:[25,26,31],cap:[5,33,34],capabl:[0,1,8,13,23,31,36,37,39],capac:[2,29],capita:[0,32],caption:[25,26],captur:[4,11,12,37,38],captured_input:[3,4],car:[3,4],card:[0,7,31,35],cardin:[1,39],care:[11,35],carefulli:[13,36],carlo:[0,6,23,28,30,31,34],carri:[2,6,7,25,34,35],cart:10,casella:30,cast:[1,39],cat:[3,4],categor:[0,1,3,9,11,31,38,39],categori:[0,1,3,7,10,12,14,31,32,35,37,38,39],categorical_crossentropi:[1,3,39],caus:[0,5,6,28,31,32,33,34],causal:0,causat:[0,31],cax:[1,39],cb:[6,31],cbar:[1,39],cc:[0,1,3,4,5,13,26,31,32,33,34,35,36,39],ccc:[5,12,33,37,38],cd_fast:6,cdf:28,cdot:[0,2,6,12,13,14,24,28,31,34,35,36,37,38],celebr:[13,35,36],cell:[0,2,3,4,6,9,10,13,15,25,31,33,34,35,36,37],center:[0,1,6,7,8,9,11,14,25,28,31,33,34,35,39],central:[0,3,5,6,8,16,24,26,31,32,33],centroid:[14,28],centroid_differ:14,centuri:3,certain:[0,3,6,7,9,28,31,32,34,35],certainti:34,cg:[13,36],cha:[0,32],chain:[0,1,13,23,28,31,36,37,39],challeng:[36,37],chanc:[1,5,13,28,33,34,36,37,38,39],chang:[0,1,2,3,4,5,6,8,9,11,12,13,14,21,24,25,26,28,31,32,33,34,35,36,37,38,39],channel:3,chap4:[38,39],chapter3:[0,19,25],chapter:[0,6,10,11,18,21,22,24,25,26,30,31,32,33,34,35,36,37,38,39],charact:[0,3,5,8,31,32],character:[8,9,10,12,28,37,38],characterist:[0,1,3,10,13,21,31,36,37,39],charg:[0,31],charl:[0,32],chase:4,chat:31,chd:[7,35],chddata:[7,35],cheap:[5,32],cheaper:[1,13,36,37,39],check:[0,1,3,4,5,6,11,13,24,31,32,36,37,39],checkmark:3,checkpoint:4,checkpoint_dir:4,checkpoint_prefix:4,chen:10,chiaramont:2,choic:[0,1,2,3,4,6,9,12,13,14,19,24,26,31,32,34,35,36,37,38],choleski:[5,24,32],choos:[2,3,6,9,10,11,13,14,25,26,34,35,36,37],chosen:[0,1,2,6,8,9,10,13,16,21,26,28,31,34,35,36,37,39],chosen_datapoint:[1,38,39],christian:30,christoph:[27,30,31],cifar10:3,cifar:3,circ:[1,12,38,39],circl:[0,8,12,32,37,38],circuit:3,circumfer:9,circumv:[1,5,13,32,36,37,39],ckpt:4,clariti:28,class_nam:[3,9],class_val:9,class_valu:9,class_weight:[3,4],classic:[7,9,13,35,36,37,38],classif:[0,3,5,6,7,8,11,12,23,25,30,31,32,33,34,36],classifi:[0,1,4,7,9,10,11,26,31,38,39],classificaton:[1,38,39],classifii:10,clean:[1,38,39],clear:[1,5,10,12,13,21,36,37,38,39],clearli:[0,3,5,6,7,8,18,28,32,33,34,35],clever:[1,10,38,39],clf3:0,clf:[0,6,8,9,10,31,32],clf_lasso:6,clf_ridg:[6,31],clip:[3,28],clone:29,close:[0,1,2,4,6,8,9,11,12,13,14,25,28,30,31,34,35,36,37,38,39],closer:[3,5,13,32,36,37],closest:[8,11,13,14,36],closur:[23,31],cloud:[23,31],cluster:[0,1,4,6,11,23,31,34,38,39],cluster_label:14,cm:[1,2,3,6,8,9,13,25,35,36,38,39],cmap:[0,1,2,3,4,6,8,9,10,25,31,38,39],cmap_arg:6,cmb:27,cmd:9,cmu:32,cn_:28,cnn:[12,37,38],cnn_kera:3,cntk:[23,31],co:[0,2,3,6,9,13,21,31,34,36,37],code:[3,4,6,7,8,15,16,17,19,22,23,24,25,28,30],coef0:8,coef:[0,31],coef_:[0,5,6,8,9,13,31,32,33,34,35,36],coeff:5,coeffici:[0,3,5,6,7,8,9,13,15,16,24,31,32,33,34,35,36,37],coerc:[0,6,31,34],coin:[10,28],coin_toss:10,col:[0,11,31,32],colab:[23,31],cold:9,colinear:[0,32],collabor:[25,26],collaps:8,collect:[0,2,6,10,11,21,23,28,30,31,34],collinear:[5,32,33],color:[0,3,4,6,8,9,10,21,25,28,36],color_channel:3,color_cod:6,colorbar:[1,6,25,39],colsample_bytre:10,colsaobject:10,colspec:[0,31],column:[0,1,2,5,6,7,8,9,11,12,17,24,31,32,33,34,35,37,38,39],columntransform:9,com:[4,6,19,20,21,23,25,26,30,31,33,35,36,37,38,39],combin:[1,2,5,6,7,10,28,33,34,35,36,37,39],come:[0,1,3,4,5,12,13,14,15,26,31,32,33,34,36,37,38,39],command:[0,1,31,39],comment:[0,4,5,6,15,16,25,26,31,32],commerci:[0,15,23,25,31],commod:[0,31],common:[0,1,3,5,6,7,9,11,13,14,25,26,28,31,32,34,35,36,37,38,39],commonli:[0,1,4,6,7,9,13,14,32,34,35,36,37,38,39],commun:[0,12,25,37,38],commut:3,commutatitav:3,compact:[0,1,3,5,6,7,9,11,12,13,14,31,32,33,34,36,37,38,39],compair:0,compar:[0,3,4,5,6,11,13,15,16,21,22,24,25,26,31,32,33,34,35,36,37],comparison:[2,4,13,26,36,37],compat:[7,35],compet:[0,31],competit:10,compil:[0,1,3,4,13,15,21,23,24,31,36,37,39],complet:[0,2,3,4,9,12,31,37,38],completenn:[12,37,38],complex:[1,5,8,9,11,12,13,15,16,19,26,31,34,36,37,38,39],complic:[0,1,9,13,31,34,35,38,39],compoment:32,compon:[0,1,3,4,5,6,7,9,14,16,23,31,32,33,34,35,38,39],components_:11,compos:[9,12,13,14,21,23,31,36,37,38],compphys:[0,6,17,19,20,23,25,27,29,30,31,32,35,36,37],compress:[0,31,32],compris:[6,35],compromis:[5,32],compulsori:[23,31],comput:[0,1,2,3,4,5,6,7,8,10,11,12,13,15,16,17,21,23,24,25,26,27,28,30,31,32,33,34,35,38,39],computation:[0,3,6,9,13,28,31,35,36,37],computationalscienceuio:31,computerlab:[25,26],con:26,concat:31,concaten:[2,4,6,14],concav:[1,9,13,32,35,36,39],concentr:[0,10,32],concept:[0,2,23,31,32],conceptu:[12,13,35,36,37,38],concern:[0,1,4,7,31,35,38,39],concic:31,conclud:[0,5,13,21,33,34,36,37],conclus:[1,38,39],concretefunct:[3,4],cond:2,conda:[0,1,15,23,25,31,39],condis:32,condit:[0,2,4,5,6,8,9,11,13,28,31,32,37],conduct:[23,31],condwav:2,confid:[0,5,6,7,8,18,25,31,32,33,35],configur:[3,21],confirm:[5,12,33,34,37,38],confus:[5,6,7,10,24,32,33,34],confusion_matrix:9,congruenti:28,conjug:[4,8],conjugaci:[13,36],conjunct:3,connect:[0,1,3,4,9,11,12,13,24,31,32,35,36,37,38,39],consequ:[5,6,8,10,12,13,32,33,34,35,36,37,38],conserv:[5,14,32],consid:[0,1,2,3,5,6,7,8,9,10,12,13,16,19,21,24,25,26,28,31,32,33,34,35,36,37,38,39],consider:[0,1,5,13,31,32,33,34,35,36,38,39],consist:[0,1,2,3,4,6,12,13,19,21,25,26,28,32,34,35,36,37,38,39],constant:[0,2,4,5,6,8,12,13,28,31,32,33,34,35,36,37,38],constitu:[0,31],constitut:[2,6,34,35],constrain:[1,3,5,7,11,33,35,38,39],constraint:[5,6,8,13,17,32,33,34,36,37],construct:[0,1,2,3,5,6,7,8,9,10,11,24,28,31,32,33,34,35],consult:26,contact:[0,31],contain:[0,2,3,4,5,6,7,8,9,11,12,13,17,19,21,22,24,25,26,28,30,31,32,33,34,35,36,37,38],contemporari:31,content:[1,23,24,31,39],context:[3,4,6,10,13,25,34,35,36,37],contigu:24,continu:[0,1,2,3,4,5,6,7,8,9,10,12,13,17,18,21,22,24,25,26,28,31,32,33,34,35,36,38,39],contour:[9,10,13,36],contourf:[8,9,10],contrast:[1,4,9,10,12,37,38,39],contribut:[0,3,5,13,21,28,31,32,33,36,37],contributor:[0,25,31],control:[0,1,3,9,13,15,23,31,36,37,38,39],conv2d:[3,4],conv2dtranspos:4,conv:[3,4],convei:31,conveni:[0,5,6,12,13,24,25,26,31,33,34,35,36,37,38,39],convent:[12,32,38],converg:[1,2,4,5,6,7,8,11,13,14,21,22,26,32,33,35,36,37,38,39],convergencewarn:[1,6,7,8,11,35,38,39],convert:[0,1,4,5,9,11,13,24,31,32,36,37,39],converttomatrix:4,convex:[4,5,7,32],convinc:[13,35,36],convolut:[1,4,23,31,39],cool:[4,9],coolwarm:[6,25],coordin:[5,12,14,32,33,37,38],coorel:[0,32],copi:[0,1,14,32,38,39],copyright:[26,34],core:[2,3,4,10,13,31,37],corel:31,coronari:[7,35],corr:[0,5,7,11,32,35],correalt:[11,23],correct:[0,1,2,3,4,5,7,13,24,28,31,32,33,34,36,37,38,39],correctli:[1,2,6,7,10,26,38,39],correl:[0,1,3,5,6,7,10,12,13,21,23,28,31,33,34,36,37,38,39],correlation_matrix:[0,5,7,11,32,35],correspond:[0,3,5,6,8,9,11,12,15,16,17,23,24,25,28,31,32,33,34,37,38],cortex:[12,37,38],cosin:[3,6,34],cost:[0,2,3,5,6,7,8,9,12,13,16,17,19,21,25,26,31,37],cost_deep_grad:2,cost_funct:2,cost_function_deep:2,cost_function_deep_grad:2,cost_function_grad:2,cost_grad:2,cost_sum:2,costol:[13,21,36,37],could:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,17,24,25,26,28,31,32,33,34,35,36,37,38,39],coulomb:[0,31],count:[0,9,27,28,29,31],countor:[13,36],coupl:[4,5,6,33,34],cours:[0,1,3,5,11,25,26,27,29,32,34,39],courvil:[21,22,26,27,30,31,32,36,37],cov:[5,6,11,24,28,31,32,33,34],cov_xi:[5,11,32],cov_xx:[5,11,32],cov_yi:[5,11,32],covari:[0,7,23,24,31,33,35],covariance_matrix:[5,11,14,32],cover:[0,5,17,23,29,30,32,33],covert:[0,31],covxi:28,covxx:28,covxz:28,covyi:28,covyz:28,covzz:28,cpu:[1,3,4,39],cpu_util:[3,4],craft:3,crawford:31,creat:[1,2,3,4,5,6,9,10,11,12,13,23,25,31,33,35,36,37,38,39],create_biases_and_weight:[1,38,39],create_convolutional_neural_network_kera:3,create_neural_network_kera:[1,39],create_x:[5,11,32],credit:[0,7,29,31,35],crim:[0,32],crime:[0,32],criteria:[0,4,9,10,14,28,31],criterion:[9,10,13,35,36],critic:[6,25,31,32,33],critiqu:[25,26],cross:[0,1,3,7,9,10,13,23,26,28,31,32,33,36,37,38,39],cross_entropi:4,cross_val_scor:[6,34,35],cross_valid:[7,10,35],crossvalid:[6,34],crucial:[1,28,39],cs231:3,cs:[27,29],csr_matrix:[24,31],csv:[0,4,6,7,9,31,34,35],ctnk:[1,39],ctx:[3,4],cubic:0,cumbersom:[5,33,34],cumsum:[10,11,31],cumul:[7,10,28],cumulative_heads_ratio:10,cup:[5,33,34],current:[1,2,3,4,6,13,14,21,25,30,35,36,37,39],curs:[0,32],curv:[6,7,10,12,25,35,37,38],curvatur:[13,35,36,37],custom:[6,14,25],custom_cmap2:[9,10],custom_cmap:[9,10],cutpoint:9,cv:[6,7,10,34,35],cvxbook:[13,35],cvxopt:[5,8,32],cycl:[1,12,37,38,39],cyclotron:[32,33],d2_g_t:2,d:[1,2,3,4,5,6,7,8,9,10,11,13,14,24,28,29,31,32,33,34,35,36,37,38,39],d_f:[13,35,36],d_g_t:2,d_net_out:2,da:3,dagger:[5,24,32],dai:[1,9,23,38,39],damp:3,daniel:[29,31],darget:9,darkr:28,dat:[0,31],dat_id:[0,6,7,9,31,32,34,35],data1:14,data2:14,data3:14,data4:14,data:[2,4,5,8,10,12,13,14,17,18,19,21,22,24,26,30,34,36,37],data_handl:[3,4],data_id:[0,6,7,9,31,32,34,35],data_indic:[1,38,39],data_modul:32,data_panda:31,data_path:[0,6,7,9,31,32,34,35],data_url:32,databas:[1,38,39],datafil:[0,6,7,9,25,31,32,34,35],datafram:[0,4,5,7,9,11,31,32,35],datapoint:[1,5,6,7,11,13,32,34,35,36,37,38,39],dataset:[0,4,6,7,8,9,10,11,13,14,15,16,19,25,26,31,32,34,35,36,37],datatyp:4,date:[15,16,17,18,19,20,21,22,25,26,31,32,33,34,35,36,37,38,39],daughter:10,david:30,davison:34,dbh:[1,38,39],dbo:[1,38,39],dc5e85cd93c3:26,dcomposit:24,ddot:2,dead:[1,39],deadlin:[16,17,18,19,20,21,22,27],deal:[0,1,3,5,6,8,11,13,14,17,18,24,25,28,31,32,33,34,35,36,37,38,39],dealt:0,debt:[7,35],debug:[0,5,6,33,34,35],decad:[0,3,31],decai:[0,13,28,31],decemb:[27,29,31],decent:10,decid:[0,2,3,5,6,9,25,33,34,35],decim:[0,31],decis:[0,1,8,11,23,30,31,38,39],decision_funct:8,decision_tre:9,decisiontreeclassifi:[9,10],decisiontreeregressor:[0,9,10],declar:[0,4,24,31],decompos:[5,6,24,32],decomposit:[0,6,12,25,31,33,37,38],decompost:[5,32],deconvolut:3,decor:[0,31],decorrel:[10,13,21,36,37],decreas:[1,2,4,5,6,10,11,13,33,34,35,36,37,38,39],deduc:[0,31],deep:[3,7,12,13,21,23,26,27,30,31,32,36,37,38],deep_neural_network:2,deep_param:2,deep_tree_clf1:9,deep_tree_clf2:9,deep_tree_clf:[9,10],deepen:[5,23,31],deeper:[0,3,4,31],deeplearningbook:30,deer:3,def:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,21,25,28,31,32,33,34,35,36,37,38,39],def_covari:28,def_funct:[3,4],default_tim:4,defect:[5,32],defici:[5,32],defin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,24,25,26,28,32,33,34,35,36,37],definit:[1,2,5,6,7,8,10,11,12,13,17,24,28,32,33,34,35,36,39],defint:28,defun:[3,4],defvjp:[],degre:[3,5,6,8,9,10,11,15,16,17,19,25,28,31,33,34,35],del:[1,39],delet:6,delimit:4,deliv:[27,31],delta:[0,2,3,6,8,12,13,14,21,31,36,37,38,39],delta_0:3,delta_1:3,delta_2:3,delta_3:3,delta_4:3,delta_5:3,delta_:[1,24,38,39],delta_h:[0,1,31,38,39],delta_j:[3,12,38,39],delta_k:[12,38,39],delta_l:[1,3,38,39],delta_momentum:[13,21,36,37],delta_n:[0,3,31],delug:23,delv:[0,31],demand:[13,35,36],demonstr:[0,3,5,6,7,11,12,23,31,32,33,34,35,38],demystifi:[37,38,39],den:4,denomin:[1,5,33,34,38,39],denot:[1,2,6,7,13,28,35,36,37,38,39],dens:[1,3,4,39],dense_1:4,densiti:[0,2,6,28,31,34],depart:[26,29,31,32,33,34,35,36,37,38,39],depend:[0,1,2,4,5,6,7,8,11,12,13,15,21,23,24,25,28,31,32,33,34,35,36,37,38,39],depict:28,deploy:[0,15,23,25,31],deprec:[2,3,6,13,25,31,32,36],deprecate_nonkeyword_argu:[0,31],depth:[0,3,9,10,24,34,39],deriv:[0,1,2,6,7,8,10,11,13,16,17,19,21,23,25,31,37],derivati:[13,36,37],derivative_fn:[13,36,37],descend:[5,9,11,32,33],descent:[0,1,3,7,8,12,22,31,32,38,39],descent_i:21,descent_x:21,descr:32,describ:[0,2,4,5,6,8,10,11,12,13,18,21,24,25,26,31,33,34,36,37,38],descript:[0,8,9,26,31],design:[0,1,3,4,5,6,7,10,11,12,13,15,16,17,18,19,25,26,31,33,34,35,36,37,38,39],designmatrix:[0,31],desir:[0,2,4,5,13,14,31,32,35,36],despit:[1,12,37,38,39],destroi:24,det:[5,24,32],detail:[0,6,11,13,14,24,25,26,32,35,36,39],detect:[3,8,12,37,38],determin:[0,2,3,4,5,6,8,9,10,11,12,13,16,24,28,31,32,33,34,35,36,37,38],determinist:[7,13,28,35,36,37],dev:[1,39],develop:[0,3,5,8,10,11,12,21,22,23,24,25,26,31,32,33,34,37],deviat:[0,1,2,4,5,6,19,25,28,31,32,33,34,39],devic:[3,4],device_nam:[3,4],devis:[12,37,38],df1:31,df:[4,8,11,13,31,36],di:[0,32],diag:[5,8,32,33],diagnost:[1,10,39],diagon:[0,5,7,13,18,21,24,25,28,31,32,33,35,36,37],diagonaliz:[5,32],diagram:10,diagsvd:6,dice:[6,28,34],dict:[6,8,35],dict_kei:32,dictionari:[0,32],did:[0,1,5,6,7,10,11,14,25,26,31,33,34,35,36,39],die:[1,39],diff1:2,diff2:2,diff:2,diff_ag:2,diffeent:8,differ:[0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,17,21,23,24,25,28,30,31,32,33,34,35,38,39],different:22,differenti:[0,3,16,21,22,23,24,31,32,35,38,39],differential_oper:[2,13,37],difficult:[0,1,6,10,13,21,25,28,31,34,36,37,39],difficulti:[0,1,13,31,35,36,37,39],diffonedim:2,digit:[0,1,3,4,6,25,26,27,29,31,38,39],dilemma:[13,36,37],dilut:[1,39],dim:[4,11,14,24],dimens:[0,1,2,3,4,5,8,9,11,14,16,17,24,31,32,33,38,39],dimension:[0,4,5,6,9,11,13,14,19,21,22,23,24,26,31,33,34,35,36,37],dimensionless:[0,3,31],diment:24,dimnsion:4,diod:3,direct:[0,1,2,4,11,12,13,14,21,31,32,35,36,37,38,39],directli:[1,4,5,6,28,32,38,39],directori:9,disabl:[3,4],disadvantag:[0,31],disappear:[3,6,34],disc_loss:4,disc_tap:4,discard:[6,11,34,35],disciplin:[0,3,12,31,37,38],disclaim:28,discord:31,discourag:[13,32,35,36],discov:[0,31],discover:[5,33],discret:[1,3,5,7,13,33,34,35,36,37,39],discrimin:[4,7,10,11,35],discriminator_loss:4,discriminator_loss_list:4,discriminator_model:4,discriminator_optim:4,discuss:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,30,31,32,33,34,36,37,38,39],diseas:[7,35],disguis:[6,32,33,34],disord:[1,7,35,39],dispai:[37,38],displai:[0,1,3,4,5,6,7,8,9,10,11,12,14,25,28,31,32,34,35,37,38,39],displaystyl:[0,5,17,31,32,33],displot:32,disregard:[0,31],dissimilar:[11,14],dist:14,distanc:[0,8,9,11,14,28,32],distance_list:9,distinct:[3,7,8,9,10,14,35],distinctli:8,distinguish:[0,4,7,8,28,31,35],distplot:[0,32],distribut:[0,1,4,6,7,10,11,13,14,15,16,18,19,23,24,25,26,31,32,35,36,38,39],distrubut:[0,15,23,25,31],dive:[0,8,24,31],diverg:[1,13,35,36,37,39],divid:[0,1,3,5,6,7,8,9,11,12,26,28,31,32,33,34,35,37,38,39],divis:[6,8,9,13,21,24,28,34,35,36,37],dna:[7,35],dnn1:4,dnn2_gru2:4,dnn:[0,1,2,4,12,31,37,38,39],dnn_kera:[1,39],dnn_model:[1,39],dnn_numpi:[1,38,39],dnn_scikit:[0,1,31,38,39],doamin:[33,34],doc:[0,6,17,19,20,23,25,26,27,29,30,31,32,35,36,37],document:[4,7,11,13,32,35,36,37],doe:[0,1,2,3,4,5,6,8,10,11,12,13,16,21,24,25,28,31,34,35,36,39],doesn:[3,9,12,38],dog:[1,3,4,38,39],domain:[5,8,13,25,26,33,34,35,36],domin:[0,31],don:[0,1,3,5,6,8,11,13,15,21,23,25,26,31,32,36,37,38,39],done:[0,2,3,4,5,6,9,10,11,13,17,24,25,31,32,33,34,35,36,37],dot:[0,2,3,5,6,7,8,9,10,11,12,13,21,24,25,28,31,32,33,34,35,38,39],doubl:[3,4,24,31],doubli:[1,39],down:[0,3,6,9,11,12,13,21,31,35,36,37,38],download:[0,1,3,5,6,24,25,30,31,38,39],downsampl:3,dozen:[1,39],dq:[6,34],drag:[13,36,37],dramat:11,drastic:4,draw:[4,6,10,13,34,35,36],drawback:[0,1,3,13,32,35,36,37,39],drawn:[1,4,6,7,11,28,31,34,35,38,39],drive:[3,4],driven:3,drop:[0,1,5,6,11,13,21,28,31,32,33,34,36,37,39],dropna:[0,6,31,34],dropout:4,dt:[2,3,13,28,36,37],dtype:[0,1,2,3,4,14,21,24,31,32,37,38,39],dualiti:6,dub:[0,31],due:[1,2,5,6,8,10,12,13,29,31,32,34,35,36,37,38,39],dummi:[0,32],dure:[0,1,3,4,8,9,11,17,20,23,25,31,34,36,37,39],dwell:[0,32],dwh:[1,38,39],dwo:[1,38,39],dx:[2,3,8,28],dx_1:28,dx_1p:[6,34],dx_2p:[6,34],dx_mp:[6,34],dx_n:28,dxp:[6,34],dy:[1,8,28,39],dynam:4,dz:8,e:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,18,19,21,28,29,31,32,33,34,35,36,37,38,39],e_:[0,2,31],each:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,21,23,24,26,27,28,29,31,32,33,34,36,37,38,39],eager:[3,4,34],eapprox:[0,31],earli:[1,3,4,13,21,36,37,38,39],earlier:[0,5,7,8,9,11,12,13,20,21,31,32,35,36,37,38],earthexplor:[6,25],eas:[6,9,14,34],easi:[0,5,6,7,8,9,10,11,12,13,18,21,23,24,26,31,32,33,34,35,36,37,38],easier:[5,6,8,9,13,26,28,31,32,34,36,37],easiest:[13,35,36],easili:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,24,25,31,32,33,34,35,36,38,39],eastern:[29,31],ebind:[0,31],eblock:9,econometr:31,economi:5,ecosystem:[23,31],ect:27,edg:3,edgecolor:[6,34],edu:[13,26,32,35],educ:[0,25,26,31,32,35],eff:28,effect:[1,4,10,13,28,36,37,38,39],effic:[1,38,39],effici:[0,3,10,13,23,24,28,31,35,36,37],efron:[6,34],egrad:[13,36,37],eig:[5,11,13,21,24,28,31,32,35,36,37],eigen:28,eigenpair:[5,11,32],eigenvalu:[0,5,8,11,13,21,24,31,32,33,35,36,37],eigenvector:[5,11,13,17,32,33,36],eight:[24,31],eigval:[24,28,31],eigvalu:[11,13,21,35,36,37],eigvec:[24,28,31],eigvector:[11,13,21,35,36,37],eispack:[24,31],either:[1,5,6,7,8,9,10,11,13,15,16,25,26,28,31,32,33,34,35,36,38,39],elabor:28,elarn:3,electr:[0,3,12,31,37,38],electron:31,eleg:11,element:[1,2,3,4,5,6,7,8,11,12,13,17,18,20,21,22,23,24,25,26,27,30,32,33,34,35,38,39],elementari:[10,13,24,36,37],elementwis:[3,13,36,37],elementwise_grad:[2,13,36,37],elessar:31,elif:[3,4,14,21],elim:24,elimin:[3,8],els:[1,2,3,4,7,9,12,13,24,35,36,37,38,39],elu:[1,39],elus:[0,31],email:[27,29,31],embed:[0,11,32],embodi:[6,19,25,34],emit:28,emner:30,emphas:[0,10,23,31],emphasi:[0,23,30,31],empir:[1,11,28,39],emploi:[0,1,5,6,11,13,25,26,28,31,32,33,34,35,36,38,39],employ:[0,31,32],empti:[6,10,34],emul:[12,37,38],en:[23,30],enabl:[11,21],enbodi:[6,34],encod:[0,3,5,9,11,14,17,31,32,33],encompass:[0,25,28,31],encount:[0,1,5,6,7,13,21,28,31,32,34,35,36,37,38,39],encourag:[25,26],end:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,21,24,25,28,29,31,32,33,34,35,36,37,38,39],end_box:[13,37],end_nod:[2,13,37],end_valu:[13,37],endpoint:[3,6],energi:[0,4,6,32,34],enet_coordinate_desc:6,enforc:[12,37,38],eng:30,engin:[0,1,3,4,23,31,39],english:[25,26],enorm:3,enough:[0,6,13,31,34,35,36],ensembl:[1,9,39],ensur:[0,1,2,3,5,6,11,13,21,28,32,33,34,35,36,37,38,39],ensure_initi:[3,4],entail:31,enter:[5,6,17,32,33],enthought:[0,15,23,25,31],entir:[1,3,7,9,23,28,31,35,36,37,38,39],entiti:[9,12,24,31,38],entri:[0,5,8,11,12,24,31,32,33,34,38],entropi:[1,3,7,10,13,31,36,37,38,39],enumer:[0,1,2,3,4,6,8,31,32,33,38,39],env:[0,1,2,3,4,6,7,8,11,13,21,28,31,32,33,35,37,38,39],environ:[2,21,23,25],eo:[0,6,31,34],eol:[0,31],eosfit:[0,31],epoch:[0,1,3,4,12,13,21,22,26,31,36,37,38,39],epoch_num:[3,4],epsilon:[0,5,6,7,13,19,25,31,32,33,34,35,36,37],epsilon_0:[0,31],epsilon_1:[0,31],epsilon_2:[0,31],epsilon_:[0,31],epsilon_i:[0,31,32],eq:[3,13,14,24,28,35,36],eqnarrai:[3,5,6,33,34],equal:[0,1,2,3,4,5,6,8,9,11,12,13,14,15,24,25,26,28,31,32,33,34,35,36,37,38,39],equat:[1,3,4,5,6,7,8,9,10,11,13,14,16,17,18,19,21,24,25,28,34,37,39],equilibrium:[2,12,37,38],equiv:[3,13,24,28,35,36],equival:[0,1,5,7,8,11,13,21,23,24,31,32,33,34,36,37,38,39],erf:28,eriador:31,eridg:31,err:[0,10],err_:[6,34],err_sqr:2,errat:[13,35,36],errno:9,erron:2,error:[1,2,4,5,6,7,9,11,12,13,15,16,17,18,19,21,23,24,25,26,28,33,35,36,37,38,39],error_estimate_corr_tim:28,error_handl:[3,4],error_hidden:[1,38,39],error_output:[1,38,39],escap:[13,35,36,37],especi:[1,3,9,12,13,25,26,36,37,38,39],essenti:[0,5,6,9,10,12,14,25,26,28,32,37,38],establish:[0,6,10,11,15,25,26,31],estim:[0,1,5,6,7,10,11,13,23,28,31,32,35,36,37,38,39],estimated_mse_fold:[6,34,35],estimated_mse_kfold:[6,34,35],estimated_mse_sklearn:[6,34,35],et:[0,2,4,15,16,17,26,30,31,32,33,34,35,36,37,38,39],eta0:[8,13,35,36],eta:[0,1,3,8,12,13,21,26,31,35,36,37,38,39],eta_:[13,21,36,37],eta_t:[13,36,37],eta_v:[0,1,3,31,38,39],etc:[0,1,3,5,7,8,9,11,12,13,14,15,21,22,23,24,25,26,28,32,35,36,37,38,39],ethic:[23,31,32],etsim:34,euclidean:[0,14,32],evalu:[0,2,3,4,5,6,9,13,25,28,31,32,33,34,35,36,37],evaluationform:[20,25,36,37],evaluationgrad:[20,25,36,37],evalut:[13,36,37],even:[0,1,3,4,5,6,8,9,10,11,12,13,14,23,24,28,31,32,33,34,35,36,37,38,39],evenli:4,event:[5,7,10,28,33,34,35],eventu:[0,5,6,11,12,13,25,26,29,32,33,34,35,36,37,38],everi:[0,1,2,3,4,5,6,9,10,11,12,13,14,23,28,29,31,32,33,34,35,36,37,38,39],everyth:[4,12,21,22,38],everywher:[4,13,35,36],evolv:[0,31],exact:[0,5,11,12,13,24,28,31,32,36,38],exactli:[0,3,4,6,12,23,25,32,34,37,38],exam:31,examin:[6,34],exampl:[5,11,12,13,15,16,19,20,22,23,24,25,26,28,30],exce:[1,12,13,21,36,37,38,39],excel:[0,1,4,5,10,26,31,32,39],except:[3,4,6,8,9,24],excess:[0,31],excit:[0,31],exclud:[1,6,12,25,32,33,34,35,37,38,39],exclus:[0,1,3,6,28,31,34,35,39],execut:[2,3,4,5,13,32,36,37],execute_with_cancel:[3,4],executing_eagerli:[3,4],exemplifi:[13,36,37],exercic:[29,31],exercis:[5,23,25,26,27,29,33,35,36,37,38,39],exercisesweek35:17,exhaust:[6,34,35],exhibit:[0,5,6,8,31,32,34],exist:[0,1,2,3,5,6,7,8,9,13,18,24,25,26,31,32,33,34,35,36,39],exit:[5,24,32],exp:[0,1,2,5,6,7,8,10,11,12,13,15,16,21,25,28,31,32,33,34,35,36,37,38,39],exp_term:[1,38,39],expand:[5,7,11,13,32,35,36],expans:[0,3,5,8,10,12,13,31,32,35,36,38],expect:[0,1,5,6,7,11,12,13,15,16,19,21,23,25,26,31,32,35,36,37,38,39],expectation_value_of_h_wrt_p:28,expens:[6,10,13,35,36,37],experi:[0,1,6,8,13,23,25,31,32,34,35,36,37,39],experiment:[0,3,4,6,9,28,31,34],experimental_get_tracing_count:[3,4],expert:[1,9,39],explain:[0,6,9,10,11,13,19,25,31,35,36],explained_variance_ratio_:11,explan:26,explanatori:[0,31],explicit:[0,3,6,13,21,24,25,31,32,33,36,37],explicitli:[0,4,21,31],explod:[1,39],exploit:[0,3,12,13,31,36,37,38],explor:[1,4,6,8,13,23,25,26,35,36,37,39],expon:[1,38,39],exponenti:[0,1,5,6,10,13,25,28,31,33,34,35,36,37,39],export_graphviz:9,export_text:9,exporttext:9,expos:[23,31],express:[0,2,3,5,6,7,10,12,13,16,21,22,24,25,26,28,33,34,37,38],exptmean:28,exptvari:28,extend:[0,2,7,11,13,17,23,31],extens:[0,12,15,23,31,37,38],extent:[0,1,6,30,31,34,39],extern:[3,6,9],extra:[1,3,5,29,31,32,38,39],extract:[0,3,5,6,7,8,11,13,24,31,32,35,36],extrapol:[0,31],extrem:[0,1,4,5,6,7,8,9,13,16,24,32,33,34,35,36,37,39],extremum:[13,35,36],extrins:11,ey:[0,5,6,13,14,24,31,33,34,35,36],f11:[0,31],f12:[0,31],f13:[0,31],f1:[13,36,37],f1_grad:[13,36,37],f1d:[13,36],f2:[13,36,37],f2_grad_x1:[13,36,37],f2_grad_x1_analyt:[13,36,37],f2_grad_x2:[13,36,37],f2_grad_x2_analyt:[13,36,37],f3:[13,36,37],f3_grad:[13,36,37],f3_grad_analyt:[13,36,37],f4:[13,36,37],f4_grad:[13,36,37],f4_grad_analyt:[13,36,37],f5:[13,36,37],f5_grad:[13,36,37],f6:[13,36,37],f6_for:[13,36,37],f6_for_grad:[13,36,37],f6_grad_analyt:[13,36,37],f6_while:[13,36,37],f6_while_grad:[13,36,37],f7:[13,36,37],f7_grad:[13,36,37],f7_grad_analyt:[13,36,37],f8:[13,36,37],f8_grad:[13,36,37],f9:[0,13,31,36,37],f9_altern:[13,36,37],f9_alternative_grad:[13,36,37],f9_grad:[13,36,37],f:[0,1,2,3,4,5,6,7,8,10,12,13,14,16,18,19,21,22,24,28,29,31,32,33,34,35,36,37,38,39],f_0:[3,10],f_1:[10,13,35,36],f_2:[12,13,35,36,37,38],f_3:[12,37,38],f_:10,f_d:28,f_grad:[13,36,37],f_grad_analyt:[13,36,37],f_i:[0,6,12,16,34,37,38],f_m:[3,10],f_n:3,f_raw:2,f_vec:2,f_wrap:2,face:[13,35,36,37],facecolor:[6,8,28,34],facil:[0,15,23,31,34,35,36,37,38,39],facilit:[12,37,38],fact:[0,1,3,5,9,11,12,13,31,32,33,34,35,36,37,38,39],factor:[0,1,3,5,6,9,10,11,13,24,28,31,32,33,34,36,37,38,39],factori:[13,36,37],fade:6,fafab0:[9,10],fahimeh:[29,31],fail:[0,3,4,6,7,8,11,13,29,31,34,35,36],failur:[7,35],fairli:[1,2,28,39],fake:4,fake_loss:4,fake_output:4,fale:26,fall:[8,9,27],fals:[0,1,2,3,4,5,6,7,9,10,14,24,25,31,32,33,34,35,36,37,38,39],famili:[0,7,8,28,35],familiar:[0,3,5,6,8,15,23,24,25,28,31,33,34],famou:[6,12,38],far:[0,3,4,5,6,8,11,12,13,14,31,32,35,36,37,38],fashion:[0,9,10,31],fast:[1,3,6,10,12,13,23,28,31,34,35,36,38,39],faster:[1,11,13,36,37,39],fastest:[13,24,35,36],favor:[7,35],favorit:28,fc:3,featur:[0,1,3,5,6,7,8,10,11,12,13,18,23,25,26,28,31,33,34,35,36,37,38,39],feature_nam:[0,1,7,9,32,35,39],feautur:9,fed:[1,38,39],feed:[0,2,3,11,23,26,31],feed_forward:[1,38,39],feed_forward_out:[1,38,39],feed_forward_train:[1,38,39],feedback:[4,20,31],feeddorward:4,feedforward:[1,4,12,38,39],feel:[0,5,6,11,13,15,16,21,22,23,25,26,29,31,33,36,37],feet:[0,32],fei:31,felt:[25,26],fetch:[6,25,32],fetch_california_h:32,fetch_openml:32,few:[1,3,4,5,9,28,31,36,38,39],fewer:[0,9,11,31],ffnn:[1,12,26,37,38,39],field:[0,3,6,12,23,31,37,38],fifth:[0,6,15,16,25,31],fig:[0,1,2,3,4,6,7,12,13,14,25,31,35,36,37,38,39],fig_id:[0,6,7,9,31,32,34,35],figaxi:28,figsiz:[0,1,2,3,4,6,7,8,9,10,31,32,34,35,38,39],figur:[0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,21,23,25,26,31,32,33,34,35,36,37,38,39],figure_id:[0,6,7,9,31,32,34,35],figurefil:[0,6,7,9,31,32,34,35],file:[0,2,3,4,5,6,7,9,13,25,26,31,32,33,34,35,37],file_prefix:4,filenam:[31,32],filenotfounderror:9,filepath_or_buff:[0,31],fill:[5,9,32],filter:[3,4],filter_traceback:[3,4],filtered_flat_arg:[3,4],filtered_tb:[3,4],financ:[0,31],find:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,21,23,25,26,28,31,32,33,35,38,39],fine:[0,14,15,31],finish:2,finit:[3,5,6,12,13,17,28,32,33,34,36,37,38],first:[0,1,2,3,5,6,7,8,9,10,11,13,14,15,16,17,21,24,25,28,29,30,34,37,39],first_moment:[21,36,37],first_term:[21,36,37],firsteigvector:11,fit:[1,3,4,5,6,7,8,9,11,12,13,15,16,17,21,25,26,28,32,34,35,36,37,38,39],fit_beta:[6,32,33],fit_intercept:[0,5,6,32,33,34],fit_mod:9,fit_transform:[0,6,8,9,11,34,35],fiti:[0,31],five:[0,9,17,25,31,32,35],fix:[0,3,4,6,10,11,12,13,21,22,25,26,31,34,35,36,37,38],fixedformatt:6,fixedloc:6,flag:4,flat:[12,13,21,35,36,37,38],flatten:[1,3,4,5,24,38,39],flexibl:[1,6,8,10,12,26,31,32,34,37,38,39],flip:[29,31],float32:[4,9,21],float64:[4,21,24,31,32,37,38,39],flop:[5,24,32],flow:[1,4,12,37,38],fluctuat:[5,33],fly:11,fm:[0,31],fmax:3,fmesh:[13,36],fn:[3,4,7],focu:[0,3,4,5,6,15,23,26,30,31,32,33,34],focus:[1,6,7,24,32,33,35,38,39],fold:[6,9,25],folder:[0,1,4,6,13,25,26,31,34,36,38,39],follow:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],font:[0,7,28,31,35],fontdict:28,fontsiz:[1,6,8,9,10,28,39],fontweight:[1,39],footprint:3,foral:[8,32],forc:[0,5,6,10,11,31,32,33,35],forcast:4,forecast:[4,12,37,38],forest:[0,1,9,23,31,39],forget:11,form:[0,3,4,5,6,7,8,9,11,12,13,17,21,22,23,24,25,26,28,31,32,33,34,35,36,37,38,39],formal:[3,4,14,28],format:[0,1,3,4,6,7,8,9,10,11,23,28,30,32,33,34,35,37,38,39],format_data:4,formatstrformatt:[6,13,25,35,36],formul:[4,6,11,14],formula:[3,13,28,35,36,37],forth:[4,12,37,38],fortran2003:[23,31],fortran2008:[25,26],fortran90:28,fortran:[0,15,23,24,31],fortun:[0,11,32],forward:[0,3,4,6,23,24,26,31,34],forward_backward:[3,4],forward_funct:[3,4],found:[1,2,4,5,6,12,13,19,20,25,26,31,32,33,34,36,37,38,39],foundat:[23,31],four:[4,5,6,8,12,24,25,27,29,31,33,37,38,39],fourier:[0,31],fourierdef1:3,fourierdef2:3,fourierseriessign:3,fourth:[12,31,32,38],fp:7,frac:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,19,24,25,26,28,31,32,33,34,35,36,37,38,39],fractal:9,fraction:9,frame:[7,31,35],framework:[1,8,10,28,39],frank:[5,11,21,22,26],frankefunct:[5,6,11,25,32],fredli:[29,31],free:[0,6,11,13,15,16,21,22,23,24,25,26,28,29,30,31,36,37],freecodecamp:23,freedom:[5,33],freeli:[0,25,31],frequenc:[3,4,6,7,28,34,35],frequent:[0,8,9,13,31,35,36],frequentist:23,fresh:10,fridai:[16,29,31],friedman:[6,18,25,27,30,31,32],friendli:4,frodo:31,frog:3,from:[0,1,2,3,4,6,7,8,9,11,13,14,16,17,18,19,22,23,24,25,28,29,30,31,39],from_cod:9,from_logit:[3,4],from_tensor_slic:4,fromnumer:2,front:[0,4,5,15,16,31,32,33],fulfil:[2,5,12,32,37,38],full:[0,1,3,5,7,9,10,13,28,31,32,35,36,37],full_matric:[5,32],fulli:[3,6,12,27,28,34,35,37,38],fun:[2,13,23,31,37],fun_nam:[],func:[0,2,31,32],functionali:11,fundament:[0,6,23,31,34],funtion:2,further:[2,7,9,31],furthermor:[0,3,5,6,7,11,12,13,17,23,25,31,32,33,34,35,36,37,38],futur:[0,4,8,9,31,32],futurewarn:[0,31,32],fy:[15,25,26,27,29,30,31],fys4155:[25,26],fys5419:[30,31],fys5429:[30,31],g0:2,g:[0,1,2,3,4,6,8,9,10,11,13,28,31,33,34,35,36,37,38,39],g_0:2,g_1:[2,10],g_2:[2,10],g_:[2,9,10],g_analyt:2,g_dnn_ag:2,g_euler:2,g_i:2,g_m:[3,10],g_n:3,g_re:2,g_t:2,g_t_d2t:2,g_t_d2x:2,g_t_dt:2,g_t_hessian:2,g_t_hessian_func:2,g_t_jacobian:2,g_t_jacobian_func:2,g_trial:2,g_trial_deep:2,g_vec:2,gain:[1,5,7,9,10,13,32,33,34,36,37,39],galleri:[0,31],game:4,gamge:31,gamma1:8,gamma2:8,gamma:[0,2,8,9,10,11,13,21,31,35,36,37],gamma_0:10,gamma_1:10,gamma_1x:10,gamma_:[0,31],gamma_i:[0,8,28,31],gamma_j:[13,36,37],gamma_k:[13,35,36],gamma_m:10,gamma_x:[0,31],gap:[6,8],gate:[4,12],gather:[0,1,12,32,37,38,39],gaug:[12,37,38],gaussbacksub:24,gaussian:[4,5,6,8,14,28,33,34],gaussian_point:14,gaussian_rbf:8,gave:[13,36,37],gbc:[27,31],gca:[2,6,8,13,25,36],gd:[1,22,26,35,39],gd_clf:10,gdclassiffiercgain:10,gdclassiffierconfus:10,gdclassiffierroc:10,gdm:[13,21,36,37],gdregress:10,ge:[1,5,7,28,32,35,39],gen_loss:4,gen_tap:4,gender:[0,31],genener:4,gener:[0,1,2,3,5,6,8,10,11,12,13,14,15,16,17,19,20,21,24,25,28,30,32,33,34,35,36,37,38,39],generallay:[12,37,38],generate_and_save_imag:4,generate_imag:4,generate_latent_point:4,generate_simple_clustering_dataset:14,generated_imag:4,generator_loss:4,generator_loss_list:4,generator_model:4,generator_optim:4,genom:23,geodes:11,geometr:[0,13,31],geometri:[5,33,34],georg:30,geotif:[6,25],geq:[2,5,8,9,13,32,33,35,36],geron:[0,15,21,27,30,31,36,37,39],get:[0,1,2,3,4,5,6,7,9,10,11,13,15,20,22,23,24,25,26,28,29,31,32,33,34,35,36,37,38,39],get_dummi:9,get_paramet:2,get_split:9,get_yaxi:8,get_yticklabel:6,getattr:[],gibb:[23,31],gif:4,gini:10,gini_index:9,ginvers:13,git:[0,15,23,31],giter:[13,21,36,37],github:[0,6,15,17,19,20,21,23,25,26,27,29,30,31,32,35,36,37],gitlab:[0,15,23,25,26,31],give:[0,1,2,3,5,6,7,8,9,10,12,13,14,17,23,25,26,28,31,32,33,34,35,36,37,38,39],given:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,22,24,25,26,28,31,32,33,34,35,36,37,38,39],global:[6,7,13,25,35,36,37],gloriou:26,glorot:[1,39],gnew:13,go:[0,1,3,5,6,8,9,11,12,13,25,31,32,33,34,35,36,38,39],goal:[0,7,9,31,35],goe:[0,1,2,5,6,13,14,18,24,31,32,33,34,35,36,37,38,39],golden:[13,36],gone:[5,32,33],gong:[1,38,39],good:[1,3,4,5,6,9,10,11,13,17,21,23,28,30,32,33,34,35,36,37,39],goodfellow:[4,22,26,27,30,31,32,33,35,36,37,38,39],googl:[1,4,21,23,31,39],got:[1,6,25,38,39],gotcha:21,gov:[6,25],gp:30,gpu:[1,13,21,23,31,36,37,39],grad:[2,13,21,36,37],grad_analyt:[13,36,37],grade:27,gradient:[0,3,4,7,8,9,12,22,23,31,32,38],gradient_desc:[3,21,36],gradientboostingclassifi:10,gradientboostingregressor:10,gradients_of_discrimin:4,gradients_of_gener:4,gradients_util:[3,4],gradienttap:4,gradual:[1,14,39],grai:[4,6,25],graph:[1,9,11,12,13,35,36,37,38,39],graph_from_dot_data:9,graph_funct:[3,4],graphic:[0,1,9,31,39],grasp:[0,31],gray_r:[1,3,38,39],grayscal:3,great:[5,13,35,36],greater:[1,7,28,35,38,39],greatli:[13,36,37],greedi:[9,35],green:[0,3,9,28],grei:4,grid:[1,3,6,7,8,12,28,32,33,34,37,38,39],gridsearch:35,gridsearchcv:35,grossli:[13,35,36],ground:[0,31],group:[0,6,7,9,14,23,25,26,27,29,31,34],groupbi:[0,31],grow:[1,3,9,10,38,39],growth:[0,31],gru:4,guarante:[0,3,4,13,28,31,32,35,36],guess:[1,4,10,13,14,21,26,35,36,37,38,39],guestrin:10,guid:[1,39],guidelin:[20,36,37],h1:2,h:[0,1,5,6,8,13,16,18,21,25,28,29,30,31,32,35,36,37,38,39],h_1:[2,13,35,36],h_2:[2,13,35,36],h_:[0,13,31,35,36],h_m:10,ha:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,21,24,25,26,28,31,32,33,34,35,36,37,38,39],haa:[29,31],habit:[0,32],had:[0,1,6,7,13,31,34,35,36,38,39],hadamard:[1,12,13,21,36,37,38,39],half:[1,8,9,39],halv:10,hand:[0,1,2,3,5,11,12,13,15,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],handi:[3,25,26],handl:[0,1,2,5,9,11,23,33,39],handle_unknown:9,handsid:[12,38],handwrit:[12,37,38],handwritten:[1,5,31,38,39],handwrittennot:[19,31,35,36],happen:[1,2,3,4,5,6,10,13,28,32,36,37,38,39],hard:[1,7,8,10,13,35,36,38,39],hardcopi:[23,31],harder:[0,1,32,39],harmon:3,hasn:[1,38,39],hassl:[0,15,23,31],hast:[23,31],hasti:[0,6,15,16,17,18,25,27,30,31,32,33,34,35],hat:[0,1,5,6,7,9,10,11,12,13,17,18,24,25,32,33,34,36,37,38],have:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,23,24,25,26,28,29,32,33,34,35,36,37,38,39],haven:[1,38,39],he:[7,35],head:[0,4,10,28,32],header:[0,31,32],heads_proba:10,health:[0,32],hear:[0,13,31,36,37],heart:[0,7,31,35],heatmap:[0,1,3,7,31,32,35,38,39],heavili:[0,31],heavisid:[1,38,39],height:[1,3,6,32,33,38,39],held:[13,21,36,37],help:[0,1,4,12,13,16,21,25,26,31,36,37,38,39],helper:[4,14],henc:[0,5,6,8,9,10,12,13,18,25,31,32,33,34,35,36,37,38],henrik:[29,31],her:[7,35],here:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,28,31,32,33,34,35,36,37,38,39],hereaft:[0,8,12,31,38],hermitian:24,hessenberg:24,hessian:[0,2,5,13,16,21,33,37],heterogen:[9,10],hi:[7,35],hidden:[1,3,4,12,26,37,38],hidden_bia:[1,38,39],hidden_bias_gradi:[1,38,39],hidden_layer_s:[0,1,31,38,39],hidden_neuron:4,hidden_weight:[1,38,39],hidden_weights_gradi:[1,38,39],hierarch:[5,32,33],high:[0,1,2,3,4,5,6,9,10,11,13,14,21,23,24,25,26,31,32,34,35,36,37,39],higher:[0,1,3,5,6,8,13,21,22,25,26,31,32,33,34,35,36,37,39],highest:[1,2,38,39],highli:[0,3,4,10,18,23,24,26,30,31,32,33,34],highwai:[0,32],hing:8,hint:[13,16,26,32,35,36],hip:23,hire:[0,31],hist:[4,6,7,28,34,35],histogram:[0,6,7,28,32,35],histor:[7,11,35],histori:[3,4,12,37,38],histplot:32,hitherto:[5,33],hjorth:[29,31,32,33,34,35,36,37,38,39],hobbi:28,hoc:[5,32],hoff:30,hold:[1,3,6,13,14,21,34,35,36,37,38,39],holder:[0,31],holomorphic_grad:[2,13,37],home:[0,32],homepag:[25,26,31],homework:[6,13],homogen:[1,3,9,10,13,21,36,37,39],honchar:2,hopefulli:[0,11,28,31],horizont:11,hors:[3,7,35],hot:[1,9,38,39],hour:[1,23,27,28,29,31,34,38,39],house_pric:32,how:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,21,23,24,25,26,28,31,32,33,34,36,37,38,39],howev:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,22,23,24,25,26,28,31,32,33,34,35,36,37,38,39],hspace:[0,4,8,10,28,31],hstack:[1,32,39],htf:[27,31],html:[0,7,11,17,19,23,25,27,29,30,31,32,35,38,39],http:[0,3,4,6,7,11,13,17,19,20,21,23,24,25,26,27,29,30,31,32,33,35,36,37,38,39],huang:[0,31],huber:[0,31],huge:[1,3,4,23,38,39],human:[0,1,3,6,9,12,31,32,33,37,38,39],humid:9,hundr:[1,39],hungri:[1,39],hybrid:27,hydrogen:[0,31],hyper:[21,26],hyperbol:[1,4,12,39],hyperparam:8,hyperparamet:[3,4,5,6,9,13,17,31,32,33,34,35,36,37],hyperplan:11,hz:[3,4],i0:[0,31],i1:[0,6,8,12,31,32,33,34,37,38],i2:[0,8,12,31,37,38],i3:[0,12,31,37,38],i5:[0,31],i:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,24,25,26,28,29,31,32,33,34,35,36,37,38],i_1:[5,6,33,34],i_2:[5,6,33,34],i_:[13,35,36],ian:30,ic:[1,26,38,39],id:[7,13,35,36],ida:[29,31],idea:[0,1,2,3,4,6,9,10,12,13,24,25,26,31,32,33,34,35,36,37,38,39],ideal:[0,2,6,8,13,28,31,32,34,37],idem:[6,34],ident:[5,6,12,13,17,24,25,32,36,37,38],identical:[33,34],identifi:[0,1,7,9,11,12,13,14,31,32,35,36,37,38,39],idx:[],ieor:28,ifi:30,ifs:[23,31],ignor:[0,1,3,9,32,39],ii:[24,28],iii:[24,31],ij:[0,1,3,6,8,12,14,16,18,24,25,28,31,32,33,34,37,38,39],ik:[0,24,31,32],illustr:[5,7,10,12,13,14,23,31,34,35,36],ilsvrc:[36,37],im:6,imag:[1,3,4,6,9,11,12,14,26,30,31,37,38,39],image_at_epoch_:4,image_batch:4,image_height:3,image_path:[0,6,7,9,31,32,34,35],image_width:3,imageio:[6,25],imagenet:31,images_from_seed_imag:4,imagin:[1,39],immedi:[0,3,4,6,15,23,31],implement:[0,2,3,4,5,6,8,9,10,11,12,13,14,17,21,22,25,26,28,31,32,33,34,35,36,37],impli:[3,5,6,7,13,24,32,33,34,35,36],implicit:3,implicitli:[11,28],importantli:3,impos:[0,6,11,12,31,37,38],imposs:[0,5,31,32],impress:[0,12,31,37,38,39],improv:[0,4,5,9,10,11,13,21,25,26,32,37],impur:9,imread:[6,25],imshow:[1,3,4,6,25,38,39],in1:[],in2:[],in3050:[30,31],in3310:31,in4080:[30,31],in4300:[30,31],in4310:30,in5400:3,in5550:30,in_out_neuron:4,inaccur:[13,35,36],inact:[12,37,38],inadequ:[0,31],inch:[6,32,33],includ:[0,1,2,3,4,5,6,7,11,12,15,16,17,20,22,23,25,26,28,29,30,31,32,33,34,38,39],include_bia:[6,9,34],inclus:[17,39],incom:[12,37,38],incorrect:[1,38,39],incoveni:8,increas:[0,1,3,4,5,6,7,8,9,11,12,13,21,25,28,31,32,33,34,35,36,37,38,39],increasingli:28,increment:36,ind:6,inde:[0,2,4,5,6,13,31,32],indefinit:4,independ:[0,5,6,7,8,12,13,28,31,32,35,36,37,38],index:[0,1,3,4,10,14,23,24,26,28,30,31,32,38,39],index_col:[0,31],indic:[0,1,3,4,5,6,9,10,11,13,16,21,25,26,31,32,36,37,38,39],indispens:[6,34],individu:[1,6,7,10,12,28,31,32,34,35,37,38,39],indu:[0,32],indx1:2,indx2:2,indx3:2,indx:24,ineffici:[3,13,36,37],inequ:[8,13],inequaltii:[35,36],inertia:[13,21,36,37],inf1000:[23,31],inf1100:[23,31],inf1100l:[23,31],inf1110:[23,31],inf3000:31,infeas:9,infer:[0,1,4,6,30,31,34,38,39],infer_nrow:[0,31],inferenc:[1,39],infil:[0,6,7,9,31,34,35],infin:[5,6,7,11,18,32,33,34,35],infinit:3,infinitesim:28,influenc:[6,10,34,35],influenti:[1,38,39],info:31,inform:[0,1,3,4,6,9,11,12,13,14,21,22,24,25,26,30,31,34,35,36,37,38,39],infti:[3,6,13,28,34,35,36],ingeni:[13,35,36,37],ingrad:2,ingredi:[0,9,31],inher:[6,34],inherit:[24,31],initi:[0,1,2,6,10,13,14,24,26,28,31,34,35,36,37,38,39],initial_epoch:[3,4],inject:14,inlin:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,24,25,28,31,32,33,34,35,36,37,38,39],inner:[0,13,32,36],inp:4,inplac:[13,36,37],input:[0,1,3,4,5,6,7,8,9,10,12,13,14,15,21,25,26,28,31,32,33,34,35,36,37,38,39],input_dim:[1,39],input_shap:[3,4],inputs:[1,39],inputs_shuffl:[0,1,32,38,39],insert:[3,5,6,8,10,28,32,33,34],insid:[0,4,7,32,35],insight:[0,1,5,21,22,23,26,31,32,33,34,39],insist:[6,13,32,33,36],inspect:35,inspir:[0,1,12,26,31,37,38,39],instabl:2,instal:[0,1,5,6,9,15,39],instanc:[0,1,2,4,6,9,11,13,31,32,34,35,36,38,39],instanti:10,instead:[0,1,2,3,4,5,6,8,9,11,13,14,21,24,25,28,31,32,34,35,36,37,38,39],institut:[1,38,39],instruct:[0,1,15,16,31,39],int32:10,int64:32,int64index:31,int_0:28,int_:[3,6,28,34],int_a:28,intak:[0,32],integ:[1,2,13,14,24,28,31,36,37,38,39],integer_vector:[1,38,39],integr:[3,6,28,31,34],intellectu:31,intellig:[0,14,30,31],intend:[10,31],intens:[1,26,39],intention:14,interact:[0,6,9,12,23,25,26,31,37,38],intercept:[0,6,8,11,13,16,25,31,33,34,35,36],intercept_:[0,6,8,9,13,31,32,33,34,35,36],interceptol:34,interceptridg:34,interchang:[5,12,24,33,34,37,38],interconnect:[1,39],interest:[0,1,2,3,4,5,6,7,8,9,12,21,23,25,26,28,31,32,33,34,35,36,37,38,39],interfac:[0,1,24,32,38,39],interior:[0,9,31],intermedi:[24,32],intern:[1,10,12,37,38,39],interpol:[1,3,4,6,12,25,37,38,39],interpr:[5,32,33],interpret:[0,1,6,9,10,12,13,17,19,24,25,26,28,38,39],interv:[0,3,5,6,7,13,18,25,28,31,32,33,35,36],intial:[13,35,36],intract:[0,4,32],intrins:[3,11,24,28,31],intro:[23,30,31],introduc:[0,1,5,6,8,10,12,17,24,25,28,31,34,35,38,39],introduct:[1,2,4,13,17,20,30,32,35,36],introductori:[0,4,24,30,31,32],intuit:[0,5,6,8,12,13,21,25,31,33,34,36,37,38,39],inv:[0,5,13,21,31,32,33,35,36,37],invalid:[1,8,38,39],invalu:[0,13,15,23,31,35,36],invari:[1,38,39],invd:[5,33],inver:[8,37,38],invers:[0,3,6,13,15,16,17,21,22,25,26,31,32,35,36,37],inverse_transform:8,invert:[0,5,7,10,13,21,31,33,35,36,37],invh:[13,21,36,37],invok:[0,8,32],involv:[0,2,6,7,11,12,32,34,35,36,37,38],io:[0,17,19,23,25,27,29,30,31,32],ion:37,ip:[0,8,28,31],ipca:11,ipykernel_18986:[],ipykernel_19041:[],ipykernel_19107:[],ipykernel_19139:[],ipykernel_19152:[],ipykernel_19176:[],ipykernel_19181:[],ipykernel_19201:[],ipykernel_19294:[],ipykernel_19329:[],ipykernel_19344:[],ipykernel_19367:[],ipykernel_19394:[],ipykernel_31563:1,ipykernel_31624:6,ipykernel_31672:13,ipykernel_31707:25,ipykernel_31718:31,ipykernel_31736:34,ipykernel_31749:36,ipykernel_31761:38,ipykernel_31766:[],ipykernel_31871:39,ipykernel_74401:[],ipynb:[23,31],ipython:[0,5,7,9,11,14,15,23,25,26,31,32,35],iq:[6,34],iri:[8,9],irreduc:[6,34],irrelev:[5,32],irrespect:[0,31],irvin:26,isbox:[13,37],iseffici:[36,37],isn:[5,33,34],isnul:[0,32],isomap:11,isotop:[31,34,35,36,38,39],issu:[1,9,24,32,33,39],it_arrai:[13,36],item:[0,13,31,36,37],items:[24,31],iter:[1,2,3,4,6,7,8,11,13,14,21,28,34,35,37,38,39],its:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18,23,24,25,26,28,31,33,34,35,36,37,38,39],itself:[5,6,12,19,25,26,28,32,33,34,38],j1:24,j:[0,1,2,3,4,5,6,8,9,11,12,13,14,16,17,18,19,24,25,28,30,31,32,33,34,35,36,37,38,39],j_:6,j_lasso_sk:6,j_ridge_sk:6,j_sk:6,jackknif:[6,23,31,34],jacobian:[2,13,35,36,37],jacobian_shap:[],jakobsen:[29,31],jason:4,jax:[22,23,26,31],jax_descend_i:21,jax_descend_x:21,jax_enable_x64:21,jax_grad:21,jensen:[29,31,32,33,34,35,36,37,38,39],jerom:[18,25,30],ji:[12,24,38],jit:[13,36,37],jj:[0,5,6,31,33,34],jk:[0,1,6,12,24,31,37,38,39],jl:[0,31],jm:24,jnp:[13,21,36,37],job:[2,8,10],join:[0,4,6,7,9,31,32,34,35],joint:[4,5,33,34],judg:[13,35,36],judgement:[6,25],julia:[23,24,25],jump:[25,28],junk:4,jupit:31,jupyt:[0,15,19,23,25,30,31,34],just:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,23,25,26,28,31,32,33,34,35,36,37,38,39],justif:[0,31],justifi:[3,10],k0:[7,35],k1:[7,35],k:[0,1,3,5,6,7,8,9,10,11,12,13,14,23,24,25,28,29,31,32,33,36,37,38,39],kaggl:[6,25,26],kappa_d:28,karl:[29,31],karush:8,kate:31,katrin:[29,31],keep:[0,1,4,5,6,11,13,14,24,25,26,31,32,33,34,35,36,37,39],keepdim:[1,6,10,24,34,38,39],kei:[0,1,3,6,12,32,37,38,39],kept:[4,6,14,34],kera:[0,4,23,25,26,31],kernel:[0,1,3,23,31,32,39],kernel_regular:[1,3,39],kernel_s:4,kernelpca:11,kev:[0,31],kevin:[30,31],keyboardinterrupt:[2,3,4],keyword:[6,13,24,25,31,36],kfold:[6,34,35],kg:[1,38,39],ki:24,kick:[1,13,36,37,39],kiener:2,kilomet:[6,32,33],kind:[0,2,3,4,8,12,13,14,31,32,36,37,38],kj:[6,12,24,32,33,34,38,39],kjm:[23,31],kkt:8,kl:28,km:[12,31,37,38],kmean:14,kmeanspoint:14,kn_k:14,know:[0,1,2,5,6,8,13,23,31,32,33,35,36,37,39],knowledg:[0,23,31],known:[1,3,4,5,6,7,8,9,12,24,25,26,28,30,32,33,34,35,37,38,39],kondev:[0,31],kp:28,kpca:11,kroneck:14,kuhn:8,kvalsund:[29,31],kwarg:[0,2,3,4,13,31,37],kwd:[0,3,4,31],kwown:[0,31],l0:[7,35],l1:[0,1,3,7,31,35,39],l1_l2:[1,3,39],l1regl:5,l2:[1,3,38,39],l:[0,1,2,3,5,6,7,8,10,11,12,13,19,24,25,28,31,32,34,35,36,37,39],l_1:[7,35],l_2:[7,13,26,35,36],l_:24,l_j:[12,38],la:[13,36],la_i:[12,38],la_k:[12,38,39],lab:[20,23,25,31,36,37],label:[0,1,2,3,4,5,6,7,8,9,10,12,13,14,21,23,24,25,26,28,31,32,33,34,35,36,37,38,39],label_prob:[36,37],labelencod:[7,10,35],labels:[6,8,9],labels_shuffl:[0,1,32,38,39],laboratori:[27,32,33],lack:[0,31],lagari:2,lagrang:[8,11],lambda:[0,1,2,3,5,6,7,8,10,12,13,17,18,21,25,26,28,31,32,33,34,36,37,38,39],lambda_0:11,lambda_1:[5,8,11,32],lambda_2:[8,11],lambda_:11,lambda_i:[8,11],lambda_iy_i:8,lambda_jy_iy_j:8,lambda_k:8,lambda_n:[5,8,32],lamda:[1,39],land:[0,8,32],landmark:8,landscap:[13,21,35,36,37],langl:[0,6,11,28,31,32],languag:[0,1,4,8,15,23,24,25,26,30,31,39],lapack:[24,31],laplac:[5,33,34],laptop:23,larg:[0,1,2,4,5,6,8,9,10,11,13,15,23,24,25,28,30,31,32,34,35,36,37,38,39],larger:[0,3,5,6,8,10,11,13,17,28,31,32,33,34,35,36,37],largest:[4,8,11],lasso:[0,7,23,31],lasso_sk:6,last:[0,1,2,3,4,5,6,7,8,9,10,12,13,15,17,18,22,24,25,28,29,31,33,36,38,39],latent:4,latent_dim:4,latent_point:4,latent_space_value_rang:4,later:[0,1,4,6,7,8,12,13,14,15,23,25,26,31,35,36,37,38,39],latest:[4,23],latest_checkpoint:4,latex:31,latter:[0,3,6,7,8,11,13,16,17,24,25,28,31,32,33,34,35,36,37],lattic:[12,37,38],law:[0,31],lax_numpi:21,layer:[0,4,13,21,26,31,36,37],lbfg:[7,9,10,11,35],lcc:[5,6,33,34],lda:11,ldot:[0,6,11,19,25,31,34,35],le:[5,7,10,13,17,21,28,32,33,35,36,37],lead:[0,1,3,5,6,7,8,9,10,11,12,13,16,17,24,28,31,32,33,34,35,36,37,38,39],leaf:9,leaki:[1,26,39],leakyrelu:4,lear:[13,35,36],learn:[3,4,5,6,7,8,9,10,12,18,22,24,27,29,30],learnabl:3,learner:10,learnig:31,learning_r:[3,8,10,21],learning_rate_init:[0,1,31,38,39],learning_schedul:[13,21,36,37],learnt:[25,26],least:[0,7,8,10,11,15,16,17,19,21,22,23,24,26,28,34,35],leat:[13,21,36,37],leav:[0,1,3,5,6,9,11,31,33,34,35,39],lectur:[0,1,5,10,11,12,13,15,17,21,22,23,24,25,26,27,29,30,36,37],lecturenot:[0,17,19,23,25,30,31],left:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,16,17,19,24,25,28,31,32,33,34,35,36,37,38,39],leftarrow:[8,12,38,39],legend:[0,2,3,4,5,6,7,8,9,10,13,31,32,33,34,35,36,37],len:[0,1,2,3,4,5,6,8,9,10,11,12,24,31,32,33,34,36,37,38,39],len_index:[0,31],length:[0,1,2,3,4,8,9,13,16,23,31,32,35,36,37,38,39],length_of_sequ:4,leq:[0,5,7,8,13,14,17,28,31,32,33,35,36],less:[0,1,3,4,5,6,8,9,13,23,28,31,32,33,34,35,36,37,39],lessen:[1,39],let:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,24,28,31,32,33,34,35,36,37,38,39],letter:[0,16,24,28,31,32],level:[0,1,5,6,9,23,24,25,26,27,29,31,32,34,39],li:[8,11,31],lib:[0,1,2,3,4,6,7,8,11,13,21,31,32,33,35,37,38,39],liblinear:[8,10],librari:[0,1,2,3,4,5,6,9,10,11,15,21,22,24,25,26,28,30,32,33,34,35,38,39],licens:[0,1,15,23,25,26,31,34,39],lie:[0,6,11,28,32,34],life:[0,1,8,12,31,37,38,39],lifetim:[13,36,37],like:[0,1,2,3,4,5,6,7,9,10,11,12,13,15,16,21,22,23,24,25,26,28,31,32,33,34,35,36,37,38,39],likelihood:[0,1,5,9,31,32,36,37,38,39],lim_:28,lima:[29,31],limit:[0,5,6,7,8,11,12,21,24,25,26,31,32,38],lin_clf:8,lin_model:[0,32],lin_reg:9,linalg:[0,2,5,6,8,11,13,21,24,28,31,32,33,34,35,36,37,38],line1:8,line2:8,line2d:[13,21,36],line3:8,line:[0,2,3,4,6,8,9,10,11,13,15,21,25,31,32,33,34,35,36,37],linear:[1,3,5,6,7,9,10,11,12,17,18,21,23,25,28,34,36,37,38,39],linear_model:[0,5,6,7,8,9,10,11,13,31,32,33,34,35,36,37,38],linear_regress:[6,34],linearli:[5,32],linearloc:[6,13,25,35,36],linearregress:[0,6,7,9,31,32,33,34,35],linearsvc:8,lineat:33,liner:[1,3,38,39],linerar:10,linewidth:[0,2,4,6,8,9,10,25,34],link:[0,4,9,12,23,25,26,29,31,38,39],linlag:[5,33],linpack:[24,31],linreg:[0,31],linspac:[0,2,3,4,6,8,9,10,13,15,16,21,24,28,31,32,33,34,36,37],linu:4,linux:[0,1,15,23,25,31,39],liquid:[0,31],list:[0,1,2,3,4,9,23,25,26,31,32,36,39],listcomp:[],listedcolormap:[9,10],literatur:[1,7,14,30,34,35,39],littl:[1,3,9,12,38,39],live:8,ll:[0,28,31,32],lle:[0,32],lloyd:[4,14],lmb:[0,2,5,6,33,34,35],lmbd:[0,1,3,31,38,39],lmbd_val:[0,1,3,31,38,39],lmbda:[13,35,36],ln:[1,13,35,36,38,39],load:[0,1,4,6,7,9,10,25,32,35,39],load_boston:[0,32],load_breast_canc:[1,7,9,10,11,35,39],load_data:[3,4],load_digit:[1,3,38,39],load_iri:[8,9],loc:[0,3,6,7,8,9,10,31,34,35],local:[0,1,2,3,4,7,12,13,31,32,35,36,37,38,39],locat:[2,3,8],lock:[3,4],log10:[0,5,6,33,34,35],log:[0,1,2,4,5,6,7,9,10,11,13,24,25,26,31,32,33,34,35,36,37,38,39],log_:[0,31],log_clf:10,logarithm:[0,5,7,24,31,33,34,35],logbook:[25,26],logic:[0,1,9,31,39],logist:[0,1,2,8,9,10,11,12,13,21,23,32],logistic_predict:[36,37],logisticregress:[7,9,10,11,35,37,38],logit:[7,35],logreg:[7,9,10,11,35,37,38],logspac:[0,1,3,5,6,31,33,34,35,38,39],longer:[2,3,8,10,14,24,26,28,31],loocv:[6,34,35],look:[0,1,2,3,4,5,6,7,8,9,10,11,13,18,21,24,25,26,28,31,32,33,34,35,36,37,39],loop:[1,4,6,10,12,14,23,24,31,34,38,39],lose:[1,38,39],loss:[0,1,3,4,5,6,7,8,10,11,13,24,25,26,31,33,34,37,38,39],loss_fil:4,lossfil:4,lost:4,lot:[0,1,4,6,32,34,36,37,39],low:[0,6,9,10,11,25,26,31,32,34],lower:[0,1,3,6,9,10,16,24,32,39],lowercas:[24,31],lowest:[9,13,28,36,37],lr:[1,3,4,10,39],lstat:[0,32],lstm:4,lstm_2layer:4,lstsq:[0,31,32],lt:[6,34],lu:[0,5,31,32],lubksb:24,luckili:2,ludcmp:24,lux:24,lvert:[1,38,39],lw:[0,31],m1:[3,4],m:[0,1,2,3,5,6,8,9,10,11,12,13,21,24,27,28,29,30,31,32,33,34,35,36,37,38,39],m_1:14,m_:[9,12,38],m_h:[0,31],m_k:14,m_l:[12,38],m_n:[0,31],m_p:[0,31],m_t:[13,36,37],ma:11,machin:[1,3,4,5,6,7,9,10,11,12,15,21,22,24,27,30,32,33,34,37,38,39],machinelearn:[0,6,17,19,20,23,25,27,29,30,31,32,35,36,37],mackai:30,made:[0,1,3,4,5,6,7,9,11,12,18,25,26,31,32,35,37,38,39],mae:[0,31],magic:4,magnitud:[1,6,7,13,32,33,35,36,37,38,39],mai:[0,1,2,3,5,6,7,8,9,11,12,13,18,21,22,23,24,25,26,28,32,33,34,35,36,37,38,39],mail:[27,29],main:[0,1,3,4,5,6,7,9,24,25,26,30,31,32,35,39],mainli:[0,5,6,7,9,31,32,33,34,35],maintain:[6,32,34],major:[1,6,9,10,13,24,31,34,35,36,37,38,39],make:[1,2,3,4,5,6,7,8,11,12,13,21,23,24,25,26,28,30,33,34,35,36,37,38,39],make_axes_locat:6,make_classif:[37,38],make_moon:[8,9,10],make_pipelin:[0,6,10,32,34],make_vjp:[2,13,37],makedir:[0,6,7,9,31,32,34,35],makeplot:[0,31],malcondit:24,malign:[1,7,9,35,39],mammographi:[5,33,34],manag:[0,2,3,15,23,25,31],mandatori:[29,31],mani:[0,1,3,4,5,6,7,8,9,11,13,14,21,22,23,24,25,26,28,30,31,32,33,34,35,36,37,39],manifold:11,manner:3,manual:[6,32,33,35],map:[0,1,2,6,7,8,11,12,14,25,28,31,35,37,38,39],margin:[0,5,8,31],marit:[0,31],mark:31,marker:[0,7,21,24,31,32,35],markov:[23,31],marsaglia:28,mass:[0,1,5,13,32,36,37,38,39],massag:[0,31],masses2016:[0,31],masses2016ol:[0,31],masses2016tre:0,masseval2016:[0,31],master:[6,19,20,25,27,29,31,35,36,37],mat1100:[23,31],mat1110:[23,31],mat1120:[23,31],mat:[23,31],match:[0,1,4,5,13,14,31,32,35,36,37,39],materi:[4,5,7,13,17,24,29,36,37,38,39],math:[3,7,12,13,21,24,28,30,31,34,35,36,37,38],mathbb:[0,4,5,6,7,8,11,12,13,14,17,18,19,24,25,28,31,32,33,34,35,36,37,38],mathbf:[0,5,6,7,8,13,18,19,21,24,25,31,32,33,34,35,36,37],mathcal:[1,5,6,7,13,19,25,33,34,35,36,38,39],matheemat:3,mathemat:[0,6,11,12,13,17,23,24,28,30,31,33,34,35,39],mathemati:31,mathrm:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,25,28,31,32,33,34,35,36,37,38,39],matmul:[1,2,5,33,38,39],matnat:30,matplotlib:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,21,23,24,25,28,31,32,33,34,35,36,37,38,39],matplotlibdeprecationwarn:[6,13,25,36],matric:[0,1,3,4,6,7,8,11,13,16,17,23,32,35,36,39],matrix:[0,2,3,4,6,7,8,10,13,15,16,17,18,19,21,22,25,26,28,34],matshow:[1,39],matter:[2,3,13,32,35,36,37],max:[0,1,2,3,4,9,10,12,13,21,29,31,35,36,37,38,39],max_depth:[0,9,10],max_diff1:2,max_diff2:2,max_diff:2,max_it:[0,1,7,8,11,13,31,35,36,37,38,39],max_iter:14,max_leaf_nod:10,max_queue_s:[3,4],max_sampl:10,maxdegre:[0,6,10,32,34],maxdepth:10,maxim:[1,4,5,7,8,11,33,34,35,38,39],maximum:[0,1,2,3,5,7,8,9,10,13,14,31,32,36,37,38,39],maxpolydegre:[5,6,33,34,35],maxpooling2d:3,mbox:[5,6,18,25,32,33,34],mccorduck:31,mcculloch:[12,37,38],md:[11,20,25,36,37],mdoel:4,mean:[1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,21,23,24,25,26,28,34,36,37,38,39],mean_absolute_error:[0,31],mean_divisor:14,mean_i:28,mean_matrix:14,mean_squared_error:[0,4,6,7,10,31,32,34,35],mean_squared_log_error:[0,31],mean_vector:14,mean_x:28,meaning:[0,4,7,31,35],meansquarederror:[0,31],meant:[2,3,7,10,13,35,36,37],measur:[0,1,2,5,6,9,11,12,14,19,25,26,28,31,32,33,34,38,39],mechan:[0,4,28,31],median:[0,31,32],medicin:[12,37,38],medium:[4,8,13,26,36,37],medv:[0,32],meet:[0,29],mehta:[0,26,31,32,33],memori:[3,4,11,12,13,21,24,31,36,37,38],mention:[0,12,13,25,26,28,31,35,36,37,38],mere:[0,15,26,31],meshgrid:[2,5,6,8,9,10,11,25,32],messag:[5,13,36,37],messi:2,met:[0,3,8,31,32],metal:[3,4],meteorolog:9,meter:[6,32,33],method:[0,1,2,3,4,5,7,8,11,12,14,16,17,18,19,22,23,24,26,28,30,31,32,33,38,39],metion:[6,25],metric:[0,1,3,6,7,9,10,14,15,16,31,32,34,35,38,39],metropoli:[23,31],mev:[0,28,31],mgd:[13,36,37],mglearn:[23,31],mgrid:[13,36],mhjensen:[1,2,3,6,7,8,11,21,32,35,38,39],mi:10,mia:[29,31],michael:[26,38,39],michigan:[31,32,33,34,35,36,37,38,39],microsoft:30,mid:[1,38,39],midel:4,midnight:[16,17,18,19,20,21,22],midpoint:9,might:[0,1,2,4,6,9,13,32,33,35,36,37,39],mild:9,millimet:[6,32,33],million:[0,31,32,36,37],mimic:[12,37,38],min:[0,2,5,8,9,31],min_:[0,2,5,14,17,31,32,33],min_samples_leaf:9,mind:[0,6,13,25,31,32,33,34,35,36],mindboard:4,mine:[23,31],mini:[1,11,12,13,21,22,26,35,38,39],minibatch:[1,11,13,38,39],minibathc:[13,36,37],miniforge3:[0,1,2,3,4,6,7,8,11,13,21,31,32,33,35,37,38,39],minim:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,17,18,21,25,32,33,34,36,37,38,39],minima:[0,1,7,13,31,35,36,37,38,39],minimum:[0,1,2,6,8,9,11,13,32,34,35,36,37,38,39],minmaxscal:[0,32],minor:[6,13,25,28,36],minst:[1,39],minu:[7,35],mirror:9,misc:[6,25],misclassif:[8,9,10],misclassifi:[8,10],miser:0,mismatch:[1,39],miss:[0,7,10,32],mistak:4,mit:30,mix:[1,2,31,39],mixtur:[13,21,36,37],mk:[9,24],mkdir:[0,6,7,9,31,32,34,35],ml:[0,1,10,13,24,25,26,32,35,36,37,39],mlab:28,mle:[5,7,35],mlp:[1,37,39],mlpclassifi:[1,37,38,39],mlpregressor:[0,31],mm:24,mn:[12,28,37,38],mnist:[1,11,26,38,39],mod:28,mode:[27,29,31],model:[2,3,5,7,8,9,10,11,13,14,15,16,18,19,21,23,25,28,30,32,33,34,35,36],model_select:[0,1,3,5,6,7,9,10,11,31,32,33,34,35,38,39],moder:10,modern:[0,6,7,23,31,34,35],modif:[2,12,13,36,37,38],modifi:[0,1,3,5,7,8,10,12,13,31,32,33,35,36,37,38,39],modul:[0,7,11,24,31,33,35],modular:28,modulo:28,moe:[11,32],moment:[5,6,13,21,28,33,34],momentum:[22,26],monitor:[13,21,36,37],monoton:[5,12,28,33,34,37,38],mont:[0,6,23,28,30,31,34],moor:[5,6,33],more:[0,1,2,4,5,7,8,9,10,11,12,13,14,18,22,23,26,28,38],moreov:[0,3,31],morten:[29,31,32,33,34,35,36,37,38,39],most:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,21,23,25,28,31,32,33,34,35,36,37,38,39],mostli:[1,11,39],motion:[0,13,31,36,37],motiv:[1,4,39],move:[0,4,5,6,7,9,12,13,14,21,25,28,31,32,33,34,35,36,37,38],mpl:[0,7,31,35],mpl_toolkit:[2,6,13,25,35,36],mplot3d:[2,6,13,25,35,36],mplregressor:[1,38,39],mse:[0,4,5,6,9,10,15,16,17,19,25,26,31,32,33,34,35],mse_simpletre:10,mselassopredict:[5,33],mselassotrain:[5,33],mseownridgepredict:[6,33],msepredict:[5,33],mseridgepredict:[0,5,6,33,35],msetrain:[5,33],msg:[0,31,32],msle:[0,31],mt:[7,12,35,37,38],mu0:28,mu1:28,mu2:28,mu:[0,6,11,13,28,31,34,36,37],mu_1:32,mu_:[6,28,32,33,34],mu_i:[6,32,33,34],mu_n:11,mu_x:28,much:[0,1,2,3,4,5,6,8,9,10,11,12,13,24,25,28,31,32,33,34,36,37,38,39],multi:[0,1,3,7,23,31,32,35],multiclass:[1,7,35,38,39],multidimension:[11,12,31,37,38],multilay:[1,39],multinomi:[7,35],multipl:[2,4,5,6,7,12,13,28,32,34,35,36,37],multipli:[3,5,6,11,13,24,28,32,33,34,36],multiplum:8,multivari:[0,2,10,11,23,28,31],multivariate_norm:[11,14],murphi:[11,30,31,33],must:[0,1,2,5,6,8,10,12,13,14,28,31,32,34,35,36,37,38,39],mut_add:2,mutabl:2,mutat:[7,35],mutual:[1,3,6,13,34,35,36,39],mx_:28,myenv:[0,1,2,3,4,6,7,8,11,13,21,31,32,33,35,37,38,39],myriad:[0,15,23,31],mz1:28,mz2:28,n1:24,n2:24,n:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,17,18,19,21,24,25,26,28,31,32,33,34,35,36,37,38,39],n_0:[12,28,37,38],n_:[1,2,3,8,12,28,37,38,39],n_boostrap:[6,10,34],n_bootstrap:[6,34],n_categori:[1,3,38,39],n_cluster:14,n_compon:11,n_epoch:[13,21,36,37],n_estim:10,n_examples_to_gener:4,n_featur:[1,38,39],n_filter:3,n_hidden:2,n_hidden_neuron:[0,1,31,38,39],n_i:28,n_input:[0,1,3,32,38,39],n_instanc:9,n_iter:[35,36],n_iter_i:[7,11,35],n_job:10,n_k:14,n_l:[12,28,37,38],n_layer:[1,39],n_m:9,n_neuron:[1,39],n_neurons_connect:3,n_neurons_layer1:[1,39],n_neurons_layer2:[1,39],n_point:14,n_sampl:[6,8,9,10,14,34,37,38],n_split:[6,34,35],n_step:4,n_t:2,n_x:2,nabla:[1,13,35,36,38,39],nabla_:[2,13,21,35,36,37],nabla_w:[13,36,37],nag:[13,36,37],naimi:[0,31],naiv:[7,35],naive_kmean:14,najafi:[29,31],nall:[0,31],name:[0,1,3,4,5,6,7,8,9,10,12,13,14,15,23,24,25,28,29,31,32,33,34,35,36,37,38,39],nameerror:[6,10,15,25,34,35,36],narrow:[13,36,37],nary_f:[2,13,37],nary_op_arg:[2,13,37],nary_op_kwarg:[2,13,37],nary_oper:[2,13,37],nation:[1,5,32,33,34,38,39],nativ:[23,31],natur:[0,1,4,8,9,12,13,25,26,28,30,31,35,36,37,38,39],navier:[12,37,38],nb:28,nb_:24,nbconvert:31,nd:14,ndarrai:[2,6],ndef:13,ne:[9,10,24,28,32],nearest:[1,3,6,11,38,39],nearli:[13,35,36],neat:31,neatli:36,neccesari:[6,34],necess:2,necessari:[0,1,3,4,8,14,31,38,39],necessarili:[0,4,11,28,31],necesserali:[5,33,34],neck:[7,35],need:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,21,22,24,26,28,32,33,34,35,36,37,38,39],neg:[0,1,3,5,6,7,10,13,24,28,31,33,34,35,36,37,38,39],neg_mean_squared_error:[6,34,35],neglect:28,neglig:28,neighbor:[3,6,11],neither:[4,13,36,37],neq:[13,14,28,35,36],nervou:[12,37,38],nest:[2,9,12,37,38],nesterov:[13,36,37],net:[2,4,12,37,38],netlib:[24,31],network:[0,9,13,21,23,30,32,36],neural:[0,13,21,23,30,32,35,36],neural_network:[0,1,2,31,37,38,39],neuralnetwork:[1,38,39],neuralnetworksanddeeplearn:[38,39],neuron:[1,2,3,4,12,39],neutral:[0,31],neutron:[0,31],never:[1,3,4,6,9,28,34,38,39],new_box:[2,13,37],new_chang:[13,21,36,37],new_hobbit:31,new_root:[13,37],new_trac:[13,37],new_tracing_count:[3,4],newaxi:[0,3,6,9,34,35],newli:[0,31],newton:[1,7,8,13,28,38,39],next:[0,1,2,3,4,5,6,8,9,13,14,21,22,31,32,33,35,36,38,39],next_guess:[13,36],next_input:4,nf8_grad:13,nfrom:13,ng:[1,38,39],ngini:9,ni:14,nice:[0,1,5,11,31,32,33,34,38],nielsen:[26,38,39],nimport:13,niter:[13,21,35,36,37],nitric:[0,32],nlambda:[0,5,6,33,34,35],nlp:30,nm:28,nm_n:[0,31],nmse:[6,34],nn:[2,5,6,12,24,33,34,37,38],nn_model:[1,39],nnmin:2,node:[1,2,3,9,10,12,26,37,38,39],node_constructor:[],nois:[0,4,5,6,8,9,10,13,15,16,19,25,31,32,33,34,35,36],noise_dimens:4,noisi:[1,6,19,25,34,38,39],non:[0,1,3,4,5,6,7,9,10,11,12,13,14,21,24,25,28,31,32,33,34,35,36,37,38,39],noncommerci:[26,34],none:[0,1,2,3,4,5,9,10,13,28,31,32,33,34,35,36,37,39],nonlinear:[3,6,8,9,11,12,34,37,38],nonneg:[6,9,13,34,35,36],nonparametr:6,nonsens:28,nonsingular:24,nonumb:[3,7,8,13,21,24,35,36,37],nonxla:[3,4],nor:[1,4,13,36,37,39],norm:[0,1,5,6,8,11,13,17,31,32,33,34,35,36,37,38,39],normal:[3,4,5,6,7,8,9,10,11,12,13,15,16,18,19,21,23,24,25,26,28,31,32,33,35,36,37,38],normali:[24,31],norvig:31,norwai:[6,25,26,31,37],notat:[0,2,5,6,13,14,21,28,31,32,33,34,36],note:[0,1,2,3,4,5,6,7,8,11,12,13,14,15,16,19,22,23,24,25,26,28,30,31,35,36,37,38,39],notebook:[0,1,3,9,15,23,25,26,31,34,38,39],notesexercise5week452022:31,notessep14:[19,35],notessep28:36,noth:[1,2,5,8,12,14,28,32,33,37,38,39],notic:[4,5,12,13,24,28,31,33,36,37,38],notimplementederror:[],notion:3,novel:[3,6,10,35],novemb:[1,27,29,31,39],now:[0,2,4,5,6,7,8,10,11,12,14,15,16,17,22,23,24,25,26,28,31,32,35,38],nowadai:[0,1,3,9,23,31,39],nox:[0,32],np:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,21,24,25,28,31,32,33,34,35,36,37,38,39],npr:2,nprint:13,nsampl:[6,9,34,35],nt:2,nthi:[0,31],ntrained_model:6,nu:28,nuclear:[5,32],nuclei:[0,28,31],nucleon:[0,31],nucleu:[0,31],num:4,num_allow_arg:[0,31],num_coordin:2,num_hidden_neuron:2,num_it:2,num_iter:21,num_neuron:2,num_neurons_hidden:2,num_output:[3,4],num_point:2,num_tre:10,num_valu:2,number:[1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,22,24,25,26,27,29,31,33,34,35,38,39],numberid:[7,35],numberparamet:3,numer:[0,5,6,9,10,11,12,13,17,21,23,24,30,31,32,33,34,35,36,37,38],numpi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,23,25,28,32,33,34,35,38,39],numpy_vjp:[],numpy_wrapp:[],nunmpi:[5,32],nvalu:9,nx:[2,13],nx_test:6,nx_train:6,nx_train_mean:6,ny:28,ny_pr:6,ny_train:6,ny_train_mean:6,o:[0,6,7,8,9,11,15,21,24,29,30,31,32,35],obei:[6,11,13,32,33,34,36],object:[0,1,2,4,6,8,10,13,24,31,32,35,36,37],obliqu:[5,32],observ:[0,1,3,5,6,7,8,9,10,11,12,13,14,28,33,34,35,36,37,38,39],obtain:[0,1,5,6,7,8,9,10,12,13,14,17,21,22,24,25,26,28,31,32,33,34,35,36,37,38,39],obviou:[5,6,11,28,32],obviouli:31,obvious:[0,4,5,6,21,22,24,26,31,33,34],oc:32,occupi:[0,32],occur:[0,6,8,9,24,28,31],oct:26,octob:[20,21,22,27,29,31,37],od:0,odd:[0,3,7,31,32,35],odenum:2,odesi:2,oen:0,off:[1,3,4,5,9,13,19,28,33,34,36,37,38,39],offer:[6,11,23,24,27,29,31,34],offic:[29,31],offici:[27,31],often:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,16,23,24,28,31,32,34,35,36,37,38,39],ofter:[24,31],ol:[0,13,15,16,17,18,22,26,31,32],old:[1,5,10,13,33,34,35,36,38,39],ols_fit:34,ols_fit_beta:34,ols_sk:6,ols_svd:6,olsbeta:[0,5,33],omega:[2,3,6],omega_0:3,omit:[0,5,31,32,33,34],on_train_batch_begin:[3,4],onc:[1,6,9,11,13,34,35,36,37,39],one:[0,1,3,4,5,6,7,8,9,10,11,13,14,19,21,22,23,24,25,26,28,29,31,32,33,34,37,39],onehot:[1,38,39],onehot_vector:[1,38,39],onehotencod:9,ones:[0,2,5,6,8,9,10,11,13,21,24,25,31,32,33,34,35,36],ones_lik:4,onl:3,onli:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,19,21,24,25,26,28,31,32,33,34,35,36,37,38,39],onlin:[11,27],onto:[5,11,32],op_nam:[3,4],open:[0,1,4,6,7,9,15,23,25,27,29,31,34,35,39],oper:[0,1,3,5,6,10,11,12,13,15,23,28,31,32,33,34,36,37,38,39],operation:28,oplu:28,opmiz:[13,36,37],opportun:[0,31],oppos:[6,13,36,37],opposit:[1,5,8,32,39],opt:[1,5,26,31,33,39],optim:[0,2,3,4,5,6,7,9,10,11,14,15,16,17,18,19,21,22,25,26,33,34],optimis:[1,3,39],optimizer_v2:3,option:[0,1,3,5,6,7,8,11,21,24,25,26,32,33,34,35,38,39],optionalxlacontext:[3,4],optmiz:[1,8,13,21,32,36,37,38,39],oral:31,orang:0,order:[0,1,2,3,5,6,7,8,9,10,11,12,15,16,22,24,25,26,28,31,32,33,34,35,38,39],ordinari:[0,2,3,7,11,13,15,16,17,19,21,22,23,26,34,35,36,37],ordinrari:34,oreilli:30,org:[0,3,4,7,11,21,23,24,30,31,35,36,37],organ:[6,7,10,24,34,35],orient:[1,5,28,32,33],origin:[0,3,5,6,8,11,12,13,24,31,32,34,36,37,38],orthogn:[5,32],orthogon:[0,5,6,8,11,13,17,24,31,32,33,36],orthonorm:[5,32,33],os:[0,1,4,5,6,7,8,9,29,31,32,33,34,35,39],oscar:[1,39],oscil:[3,13,36,37],oslo:[0,15,23,25,26,27,29,31,32,33,34,35,36,37,38,39],osx:[0,15,23,25,31],other:[0,1,2,3,5,6,7,8,10,13,14,15,19,23,25,26,27,28,29,30,33,34,36,39],otherwis:[0,1,4,7,13,21,24,26,31,32,35,36,37,38,39],ouput:[5,7,12,33,34,35,38,39],our:[1,2,3,6,7,8,9,10,12,14,15,16,17,18,19,21,22,23,24,25,26,28,33,34,37],ourmodel:0,ourselv:[0,5,6,8,11,13,31,32,33,34,35,36],out1:[],out2:[],out:[0,1,2,4,5,6,7,8,9,10,11,12,13,16,21,23,24,25,26,28,31,32,33,34,35,36,37,38,39],out_fil:9,outcom:[0,7,9,10,12,28,32,35,38],outdoor:9,outer:[6,12,13,38,39],outfil:4,outgrad:2,outlier:[0,8,31,32],outlin:[6,10,11,34],outlook:9,outperform:10,output:[0,1,3,4,5,6,7,8,9,10,12,13,16,24,25,26,28,31,32,33,34,35,36,37,38],output_bia:[1,38,39],output_bias_gradi:[1,38,39],output_shap:4,output_weight:[1,38,39],output_weights_gradi:[1,38,39],outputlayer1:[12,37,38],outputlayer2:[12,37,38],outsid:4,over1:[13,36,37],over:[0,1,3,4,5,6,9,10,12,13,21,24,25,31,32,33,34,35,36,37,38,39],overal:[1,10,38,39],overcast:9,overcom:[12,13,36,37,38],overdetermin:[0,31],overfit:[0,1,3,6,9,10,13,21,34,36,37,38,39],overflow:[1,5,33,34,38,39],overhead:[12,38],overlap:[3,7,8,9,35],overlin:[0,5,6,9,10,11,14,24,31,32,33,34],overst:[0,31],overtrain:4,overview:[3,35],own:[4,5,6,8,12,13,21,22,23,24,25,33,34,36,37,38,39],owner:[0,32],ownmsepredict:0,ownmsetrain:0,ownridgebeta:[0,6,33],ownypredictridg:0,ownytilderidg:0,oxid:[0,32],p0:2,p1:2,p:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,17,24,28,31,32,33,34,35,36,38,39],p_:[2,4,8,9],p_hidden:2,p_i:[5,28,33,34],p_j:28,p_n:28,p_output:2,p_x:28,pack:[0,31],packag:[0,1,2,3,4,5,6,7,8,11,13,15,21,22,23,25,26,28,32,33,35,36,37,38,39],pad:[3,4],page:[0,23,31],pai:[0,1,9,13,36,37,39],pair:[0,2,3,9,23,28,31,32],pamilla:31,panda:[0,4,5,6,7,9,11,15,23,25,33,34,35],panel:31,paper:[1,39],paradigm:[0,31],parallel:[3,4,10,13,21,23,24,31,36,37],param:[2,4],param_distribut:35,param_grid:35,paramat:2,paramet:[0,1,2,3,4,5,6,7,8,9,10,12,13,16,17,18,19,21,22,25,26,28,33,34,38,39],parameter:[0,6,10,25,31,32],parametr:[0,6,15,16,31,32,34],paramt:[3,5,33,34],parent:2,parent_argnum:[],parser:[0,31],part:[0,1,3,5,6,10,17,18,21,22,24,27,28,29,31,33,34,37,39],partial:[0,1,5,6,7,8,10,11,12,13,16,28,31,32,33,34,35,36,38,39],particip:[23,27,29,31],particl:[0,4,13,28,31,36,37],particular:[0,1,2,3,5,6,9,10,11,12,13,16,25,28,30,31,32,33,34,35,36,37,38,39],particularli:[5,6,8,11,13,21,28,32,34,35,36,37],partit:[1,4,9,38,39],partli:[6,31],pass:[2,3,12,14,35],password:[25,26],past:[10,28],patch:[6,28,34],path:[0,4,6,7,9,15,23,31,32,34,35],pathcollect:21,patient:[7,35],patter:4,pattern:[0,3,4,12,27,30,31,37,38],pauli:[0,31],pc:[11,23],pca:[0,7,23,31,32,35],pcolor:6,pcolormesh:6,pd:[0,4,5,6,7,9,11,31,32,33,34,35],pde:2,pdf:[0,3,4,5,6,9,19,20,25,26,30,31,33,34,35,36],pedagog:[0,31,32],penal:[6,32,33,34],penalti:[6,13,25,32,33,34,35,36],penros:[5,6,33],pentagon:[13,35,36],peopl:[0,1,9,13,23,32,36,37,38,39],per:[0,1,6,27,29,31,32,34,39],percentag:[0,10,11,29,32],perceptron:[0,1,7,31,35],peregrin:31,perfect:[0,1,13,21,31,36,37,38,39],perfectli:[4,6,34],perform:[0,2,3,4,5,6,8,10,11,12,13,14,15,16,17,19,21,23,24,25,26,28,31,32,33,34,35,36,37],performac:4,perhap:[0,5,13,31,32,33,35,36],perimet:[1,9,39],period:[1,4,28,38,39],permut:11,persist:[13,36,37],person:[5,6,7,27,29,31,32,33,34,35],perspect:30,pertin:[12,26,38,39],petal:[8,9],peter:30,phantom:28,phase:[6,12,37,38],phenomena:28,phi:8,phi_k:8,philosophi:[13,36],phone:[29,31],photo:4,php:26,phrase:[0,31],physic:[0,1,4,7,12,13,26,28,29,30,31,32,33,34,35,36,37,38,39],physicist:26,pi:[2,3,5,6,7,9,12,13,28,33,34,35,36,37,38],pick:[1,9,10,11,13,14,36,37,38,39],pickl:[1,39],pictur:[0,31],pie:[23,31],piec:[11,14],pillow:[0,15,23,25,31],pinv:[5,6,13,21,32,33,34,36,37,38],pip3:[0,1,15,25,31,39],pip:[0,1,15,23,25,31,39],pipelin:[0,6,8,10,32,34],pippin:31,pit:4,pitfal:[6,32,33],pitt:[12,37,38],pixel:[1,3,4,38,39],pixel_height:[1,3,38,39],pixel_width:[1,3,38,39],place:[0,4,6,8,13,24,25,31,34,35,36],plai:[0,3,4,5,6,8,11,23,31,32,33,34,35],plain:[8,10,12,13,14,21,22,26,35,36,38],plan:[6,9,29,30,31],plane:[8,9],plateau:[5,33],platform:[3,4,23,31],plausibl:[12,37,38],pleas:[6,7,11,13,25,26,29,31,32,35,36,37],plenti:[1,39],plethora:[3,12,37,38],plot:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,21,23,24,25,26,28,31,32,33,36,37,38,39],plot_confusion_matrix:[7,10,35],plot_count:6,plot_cumulative_gain:[7,10,35],plot_data:[1,39],plot_dataset:8,plot_decision_boundari:[9,10],plot_import:10,plot_max:4,plot_min:4,plot_model:4,plot_numb:4,plot_predict:8,plot_regression_predict:9,plot_result:4,plot_roc:[7,10,35],plot_surfac:[2,6,13,25,36],plot_train:9,plot_tre:[9,10],plqvvvaa0qudcjd5baw2dxe6of2tius3v3:[],plt:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,24,25,28,31,32,33,34,35,36,37,38,39],plu:[0,3,5,7,31,32,33,35],pm:[8,34],pmatrix:2,pml:30,pn:3,png:[0,4,6,7,9,31,32,34,35],point:[0,1,2,3,5,6,7,8,9,10,11,13,14,15,16,17,19,21,22,24,25,28,29,31,32,34,35,36,37,38,39],point_1:4,point_2:4,poisson:[23,28,31],poli:[6,8,34,35],poly100_kernel_svm_clf:8,poly3:0,poly3_plot:0,poly3dcollect:[13,36],poly_featur:[8,9],poly_features10:9,poly_fit10:9,poly_fit:9,poly_kernel_svm_clf:8,polydegre:[0,5,6,10,32,33,34],polygon:[13,35,36],polym:[12,37,38],polymi:25,polynomi:[0,5,6,7,8,9,10,11,15,16,17,19,21,22,25,26,31,32,34,35],polynomial_featur:[6,34],polynomial_svm_clf:8,polynomialfeatur:[0,6,8,9,32,34,35],polytrop:[0,6,31,34],pool:3,pool_siz:3,poor:[1,13,21,35,36,37,39],poorli:[0,32],pop:[],popul:[0,5,31,32,33,34],popular:[0,1,3,6,7,8,9,11,12,15,23,24,25,28,31,32,35,37,38,39],popularli:[0,31],portabl:10,portion:[11,13,21,36,37],pose:[0,4,5,6,11,28,31,34],posit:[0,1,2,3,5,7,8,10,11,13,14,17,24,28,31,32,33,34,35,36,37,38,39],possibl:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,19,21,23,24,25,26,28,29,31,32,33,34,35,36,37,38,39],possible_gradient_typ:[3,4],possible_gradient_types_non:[3,4],possibletapegradienttyp:[3,4],posterior:[5,33,34],postpon:[0,31,32],postscript:[25,26],postul:[5,33,34],potenti:[0,3,5,6,12,13,31,32,33,34,36,37,38],pott:[12,37,38],power:[0,1,5,6,8,9,12,13,31,32,34,36,37,38,39],pp:[5,6,18,33,34,35],practic:[0,5,6,7,8,25,26,28,32,33,34,35],practition:[0,1,3,31,39],pre:31,preced:[1,11,12,28,37,38,39],preceed:4,preceq:8,precis:[0,2,5,11,13,24,25,26,28,31,32,33,34,36,37],pred:[6,34,36,37],predicit:0,predict:[0,1,5,6,7,8,9,10,15,16,23,25,30,31,32,33,34,35,37,38,39],predict_prob:[1,38,39],predict_proba:[7,10,35,37,38],predictor:[0,5,6,7,9,10,11,31,32,33],prefer:[0,1,6,8,9,11,13,15,23,25,26,31,39],prepar:[0,6,24,25,26,31,32],preprocess:[0,4,6,7,8,9,10,11,33,34,35],prerequisit:0,prescript:[25,26],presenc:[13,36,37],present:[0,5,6,7,9,12,13,21,24,25,26,28,31,32,33,36,37,38],preserv:[3,11,24],press:[13,30,35,36],pretrain:[1,4,39],pretti:[0,4,8,9,15,23,25,31],prev_centroid:14,prev_g:2,prev_g_flag:2,prevent:[13,28,36,37],previou:[0,1,2,3,4,5,6,8,10,11,12,13,21,22,24,25,26,28,32,35,36,37,38,39],previous:[2,3,9,10,28],price:[0,4,9,13,32,36,37],primal:8,primari:[0,7,31,35],prime:28,primit:2,princip:[0,5,7,23,31,32,35],principl:[0,6,7,8,14,31,34,35],print:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,21,24,28,31,32,33,34,35,36,37,38,39],print_funct:[8,9],printout:[0,31],prior:[0,5,6,31,32,33,34],privat:[0,31],pro:26,prob:[1,28,39],probabilist:[0,30,31,32],probabl:[0,1,3,4,6,7,10,13,23,31,32,35,36,37,38,39],problem:[0,3,4,5,6,7,8,9,10,11,12,16,17,23,24,25,26,28,34],probml:30,proce:[0,5,6,7,8,9,10,11,13,24,31,32,33,34,36],procedur:[2,4,5,6,8,10,11,13,21,25,32,33,34,35,36,37],proceed:24,process:[0,2,4,6,9,10,12,13,15,21,23,24,25,28,30,31,34,35,36,37],prod:30,prod_:[1,5,7,33,34,35,38,39],produc:[0,3,4,5,6,9,10,11,12,13,23,24,25,28,31,32,33,34,36,37,38],product:[0,1,3,5,6,7,8,12,13,16,21,23,24,31,32,33,34,35,38,39],profess:[0,31],profil:[3,4],profile_util:[3,4],progag:26,program:[0,1,4,5,6,8,12,14,15,16,21,23,24,27,28,29,31,32,34,37,38,39],programm:24,progress:[1,4,14,36,39],prohibit:[6,34],project1:[6,25],project:[0,1,2,3,5,11,13,17,18,19,20,21,22,23,27,29,32,33,34,36,37,38,39],project_root_dir:[0,6,7,9,31,32,34,35],promin:[12,37,38],promis:8,promot:[29,31],prone:9,pronounc:[13,23,31,36,37],proof:[0,11,12,13,31,34,35,36,38],propag:[2,3,13,26,36,37],proper:[0,2,6,7,25,31,34],properli:[1,6,8,10,13,21,25,26,36,37,39],properti:[0,1,3,12,13,16,17,24,31,34,36,37,38,39],proport:[0,1,5,9,11,13,16,28,31,32,36,37,38,39],propos:[1,4,6,10,25,26,31,39],propto:[5,13,33,34,35,36,37],proton:[0,31],prove:[3,13,35,36,37],provid:[0,1,3,4,5,6,8,9,10,12,13,15,21,23,24,25,26,28,31,32,33,34,35,36,37,38,39],proxi:[1,13,21,36,37,39],prune:9,pseudo:[24,28,36],pseudocod:[25,26],pseudoinv:[5,33],pseudoinvers:[5,6,33],pseudorandom:[6,28,34],psycholog:[0,31],pt:[13,36],ptratio:32,punish:[0,1,31,38,39],pure:[3,9,28],purest:9,puriti:9,purpos:[0,3,10,12,14,31,32,37,38],put:[1,31,39],py:[0,1,2,3,4,5,6,7,8,11,13,21,25,31,32,33,34,35,36,37,38,39],pycod:31,pydata:23,pydot:9,pyhton2:31,pylab:[0,7,31,35],pylint:[3,4],pypi:23,pyplot:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,24,25,28,31,32,33,34,35,36,37,38,39],pythagora:[5,33,34],python2:[0,15,25,31],python3:[0,1,2,3,4,6,7,8,11,13,15,21,23,25,31,32,33,35,37,38,39],python:[1,2,3,4,5,6,8,11,12,13,14,16,21,22,25,26,28,32,33,36,37,38,39],pytorch:[0,23,25,26,31],pywrap_tf:[3,4],q:[5,6,8,11,28,32,34],qp:8,qquad:[2,11,13,24,36,37],qr:[5,6,24,32],quad:[1,13,24,36,38,39],quadrat:[0,8,9,13,15,16,31,36],qualit:[4,9,25,26,28],qualiti:[0,9,15,16,23,31,32],quantifi:[1,39],quantil:10,quantit:[0,6,9,25,26,31,34],quantiti:[0,2,5,6,7,9,10,11,12,14,16,24,28,31,32,33,34,35,38],quantum:[4,12,30,31,37,38],quartil:[0,32],quench:5,queri:9,question:[0,5,6,9,11,12,13,25,29,31,32,33,34,36,37,38],qugan:4,quick:[4,28],quick_execut:[3,4],quickli:[1,3,9,11,13,35,36,39],quit:[1,5,6,9,10,12,32,34,37,38,39],quot:[4,31],r2:[0,5,6,26,31,32,33,35],r2_score:[0,31,32],r2score:[0,31],r:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,21,23,24,25,28,32,33,34,35,36,37,38],r_1:9,r_2:9,r_j:9,r_m:9,rad:[0,32],radial:[0,8,12,32,37,38],radioact:28,radiu:[0,1,9,32,39],rag:2,rain:9,rais:[0,2,13,31,33,37],ramp:[1,39],ran0:28,ran1:28,ran2:28,ran3:28,rand:[0,4,5,6,9,10,13,15,16,21,24,31,32,33,34,35,36,37],randint:[6,9,13,21,34,36,37],randn:[0,1,2,5,6,9,11,13,15,16,21,31,32,33,34,35,36,37,38,39],random:[0,1,2,3,4,5,6,8,9,13,14,15,16,21,23,24,25,31,32,33,34,36,37,38,39],random_forest_model:10,random_index:[13,21,36,37],random_indic:[1,3,38,39],random_st:[0,7,8,9,10,11,32,35,37,38],randomforestclassifi:10,randomizedsearchcv:35,randomli:[1,6,9,13,14,21,34,35,36,37,38,39],randuniform:35,rang:[0,1,2,3,4,5,6,7,9,10,11,12,13,14,21,24,28,31,32,33,34,35,36,37,38,39],rangl:[0,6,11,28,31,32],rangle_x:28,rank:[5,32],rankdir:4,raphson:[1,8,13,38,39],rapidli:[0,31],rare:[1,13,31,34,35,36,37,38,39],rate:[0,1,2,3,4,8,9,10,12,13,22,26,32,35,38,39],rather:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,24,28,31,32,33,34,35,36,37,38,39],ratio:[4,7,9,10,11,35],rational:[0,31],ravel:[5,6,7,8,9,10,11,13,24,32,34,35,36],raw:3,raw_df:32,rbf:[8,11,12,37,38],rbf_kernel_svm_clf:8,rbf_pca:11,rc:[0,28,32],rcond:[0,31,32],rcparam:[0,1,3,7,8,9,10,28,31,35,38,39],re:[2,4,13,35,36],reach:[1,4,5,6,7,9,10,11,12,13,14,33,34,35,36,37,38,39],read:[0,2,3,4,5,6,7,8,11,12,16,21,22,24,25,26,27,28,30,33,35,36,37,38,39],read_csv:[0,6,7,9,31,32,34,35],read_fwf:[0,31],reader:[0,6,24,28,31,32,33],readi:[0,1,5,6,8,10,11,12,24,25,31,33,34,38,39],readili:[1,38,39],readthedoc:23,real:[0,1,2,4,7,10,11,12,13,24,32,34,35,37,38,39],real_loss:4,real_output:4,realist:8,realiti:28,realiz:[1,12,37,38,39],realli:[0,1,31,39],rearrang:[13,36,37],reason:[0,1,3,4,10,13,30,31,35,36,37,39],reassign:[1,39],recal:[5,6,9,10,11,12,24,28,31,32,33,34,35,36,38],recast:3,receiv:[1,3,10,12,28,37,38,39],recent:[0,2,3,4,6,9,10,13,15,21,25,30,31,33,34,35,36,37],recept:[3,12,37,38],receptive_field:3,recip:[0,6,7,24,25,26,31,32,35],reciproc:[5,33],recogn:[0,4,5,10,31,33,34],recognit:[0,1,3,12,27,30,31,37,38,39],recommend:[0,2,3,4,5,6,8,13,15,18,21,22,23,24,25,26,30,33,34,38,39],reconsid:9,reconstruct:11,record:[10,20,25,26,27,29,31,36,37],rectangl:[9,13,35,36],rectangular:[5,32],rectifi:[1,3,12,37,38,39],recur:[0,23,31],recurr:[0,1,23,31,39],recurs:[9,23,24,31],red:[0,3,4,6,8,9,21,34,36],redefin:[0,10,31,32],redefinit:33,reduc:[1,3,5,6,9,10,11,13,21,31,33,34,35,36,37,38,39],reduct:[0,10,11,23,28,31,32],refer:[0,1,2,3,5,6,7,11,12,13,14,20,24,25,26,30,31,32,34,35,36,37,38,39],referenc:2,refin:[12,37,38],refit:[6,34],reflect:[0,1,4,5,25,26,28,31,39],refresh:[23,31],refreshprogrammingskil:31,reg:[10,11],regard:[1,9,13,36,39],regardless:[12,37,38],region:[3,4,6,9,12,25,37,38],regist:[6,25,28],reglasso:[5,33],regr_1:[0,9],regr_2:[0,9],regr_3:[0,9],regress:[1,8,11,12,15,16,21,22,23,24,39],regressor:[0,7,10,31,35],regridg:[0,5,6,33,34,35],regular:[0,3,4,5,6,7,9,13,17,26,29,31,32,33,34,36,37],regularis:6,reilli:[0,15,30,31],reinforc:[0,8,23,31],reiter:[1,39],reject:7,rel:[0,4,6,7,9,12,13,28,31,32,34,35,36,37,38],relat:[0,1,3,4,5,11,13,14,24,28,31,33,34,36,37,39],relationship:[0,4,9,31],relativeerror:[0,31,32],releas:[1,3,4,6,13,23,25,26,31,34,36,39],relev:[0,1,5,7,11,15,21,22,23,25,26,28,31,39],reli:[0,6,8,31],reliabilti:[25,26],reliabl:[7,28,35],relu:[3,4,26,38],remain:[1,2,4,6,12,24,28,32,33,34,35,37,38,39],remaind:28,reman:2,remark:[1,39],rememb:[0,8,13,24,25,26,31,36,37],remind:[0,5,11,13,24,28,32,33,34],remov:[0,4,5,6,31,32,33,34],render:[0,31,32],reorder:[5,7,32,33,35],reorgan:[0,31],repeat:[0,1,3,4,5,6,9,10,11,13,14,21,22,24,25,26,28,31,33,34,35,36,37,38,39],repeated:31,repeatedli:[0,6,10,13,34,36,37],repet:3,repetit:[6,31,32,34,35,36],rephras:[13,35,36],replac:[0,1,3,4,5,6,10,12,14,15,16,21,22,23,25,26,31,32,33,34,35,38,39],replica:[6,34],repo:[25,26],report:[20,31,36,37],reportexampl:[20,25],reportsampl:20,repositori:[0,4,25,26,31,32],repres:[0,1,2,3,4,5,6,7,8,9,10,12,13,26,28,31,32,33,34,35,36,37],represent:[0,1,3,6,28,31,34,35,38,39],representd:3,reproduc:[0,5,6,9,12,15,16,23,25,28,31,32,38],repuls:[0,31],request:[0,13,21,31,36,37],requir:[0,1,3,4,5,6,8,9,11,12,13,17,24,31,32,33,34,35,36,37,38,39],res1:2,res2:2,res3:2,res_analyt:2,res_analytical1:2,res_analytical2:2,res_analytical3:2,resaml:[6,25],resampl:[0,7,10,19,23,31,32,35,36],rescal:[0,11,12,32,37,38],rescu:[5,33,34],reseach:[6,25],research:[0,4,13,21,23,30,31,36,37],resembl:[6,28,34],reserv:[1,5,6,28,33,34,38,39],reshap:[0,1,2,3,4,6,8,9,10,15,16,24,31,32,34,38,39],residenti:[0,32],residu:[0,5,13,31,36],resiz:[5,32],resourc:31,respect:[0,1,2,3,5,6,7,8,10,11,12,13,14,16,17,21,25,28,31,32,33,34,35,36,37,38,39],respond:[12,37,38],respons:[0,7,9,12,31,32,35,37,38],rest:[0,5,32],restat:[0,12,31,38],restor:4,restored_discrimin:4,restored_gener:4,restrict:[0,3,9,12,31,37,38],result:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,21,22,23,24,25,26,28,31,34,35,36,37,38,39],retail:[0,32],retain:[5,6,32,34,35],rethink:34,return_data:14,return_sequ:4,return_x_i:9,reus:[1,3,6,18,19,20,25,26,39],reveal:[0,12,31,37,38],revers:[1,24,39],review:[23,24],revisit:[14,38],revolut:31,reward:[0,4,31],rewrit:[0,3,5,6,7,8,10,11,12,13,19,24,25,28,33,35,36,37,38],rewritten:[2,6,8,10,28,34],rewrot:[13,35,36],rf:10,rgb:3,rgoj5yh7evk:23,rh:[6,34],rho:[0,10,13,21,31,36,37],rho_1:10,rho_2:10,rho_m:10,rich:[0,31],ride:9,rideclass:9,ridedata:9,ridg:[7,11,13,21,22,23,26,31],ridge_fit:34,ridge_fit_beta:34,ridge_sk:6,ridgebeta:[5,33],ridgecv:35,right:[0,1,2,3,5,6,7,8,9,10,12,13,14,16,17,19,24,25,28,31,32,33,34,35,36,37,38,39],right_sid:2,rightarrow:[0,1,5,6,8,11,12,13,28,31,32,34,35,36,37,38,39],rigor:[0,31],ring:6,rise:[0,31],risk:[0,13,15,16,31,35,36,37],rival:4,river:[0,32],rm:[0,28,32],rmse:[0,32],rmsporp:[13,21,36,37],rmsprop:[1,3,4,13,22,26,39],rnd_clf:10,rng:28,rnn1:4,rnn2:4,rnn:[4,12,37,38],rnn_2layer:4,rnn_input:4,rnn_output:4,rnn_train:4,rntrick1:28,rntrick2:28,rntrick3:28,rntrick4:28,ro:[0,13,21,31,35,36,37],robert:[18,25,30],robust:[0,31],robustscal:[0,32],roc:[7,10],role:[0,2,5,6,8,23,31,32,33,34,35],roll:6,room:[0,29,31,32],root:[0,5,9,13,28,31,32,33,35,36,37],rot:31,rotat:[1,8,9,10,39],rotation_matrix:9,roughli:[1,3,39],round:[0,7,9,13,32,35,36,37],routin:[13,24,31,35,36],row:[0,1,2,5,6,7,9,11,24,31,32,33,34,35,38,39],rr:[5,32],rrr:[5,32],rug:[13,35,36,37],rule:[0,1,5,6,13,25,31,32,33,34,36,37,39],run:[0,1,2,3,4,5,6,8,9,11,13,15,21,23,25,26,31,32,33,34,35,36,37,39],runtim:[1,6,14,39],runtimewarn:[1,6,34,38,39],russel:31,rust:[0,15,23,24,31],rv_frozen:35,rvert:[1,38,39],rvert_2:[1,38,39],s:[0,1,2,3,4,5,6,7,9,11,12,13,16,17,18,23,24,25,26,28,31,32,33,38,39],s_1:6,s_:[3,6],s_i:[6,7,35],s_j:6,s_k:6,saddl:[13,35,36,37],sai:[0,1,2,3,4,5,6,7,8,9,10,11,12,24,25,28,31,32,33,34,35,38,39],said:[6,9,13,35,36],sake:[0,5,7,11,31,32,33,35],sale:[0,31],sam:31,same:[0,1,2,3,4,5,6,8,9,11,12,14,17,24,25,28,31,32,33,35,38,39],samm:10,sampl:[0,1,2,3,4,5,6,7,8,9,10,13,14,15,16,19,21,23,24,25,28,31,32,33,34,35,36,37,38,39],sample_vari:14,sample_weight:[3,4],sampleexptvari:28,samwis:31,sastri:11,satisfactori:[0,31],satisfi:[1,2,3,6,8,13,17,24,28,34,35,36,38,39],satur:[1,6,34,39],save:[0,4,6,7,9,13,21,31,32,34,35,36,37],save_fig:[0,6,7,9,10,31,32,34,35],savefig:[0,4,6,7,9,28,31,32,34,35],savetxt:4,saw:[5,32],scalabl:10,scalar:[2,5,6,10,13,32,33,34,37],scale:[0,1,3,5,6,7,8,9,10,11,12,13,15,16,17,21,23,24,25,26,29,31,33,35,36,37,38,39],scale_mean:4,scale_std:4,scaler:[0,7,8,9,10,11,32,34],scan:[5,7,33,34,35],scari:[5,33,34],scatter:[0,1,6,7,8,9,14,21,31,32,33,34,35,39],scenario:[6,13,35,36,37],schedul:[13,29,36,37],scheme:[1,13,35,36,37,39],schrage:28,scienc:[0,1,10,12,13,23,27,28,29,30,32,35,36,37,38,39],scientif:[0,15,23,25,26,31,36,37],scientist:[0,31],scikit:[3,5,6,7,8,9,10,13,21,23,24,25,26,27,30,37],scikit_learn:[0,16],scikitlearn:31,scikitplot:[7,10,35],scipi:[0,3,5,6,13,15,23,24,25,31,32,33,34,35,36],scl:6,score:[0,1,3,6,7,9,10,11,15,16,22,25,26,29,31,32,34,35,36,37,38,39],scores_kfold:[6,34,35],scratch:[1,13,37,38,39],sdg:[13,21,36,37],seaborn:[0,1,3,6,7,21,26,31,32,35,38,39],seamless:[0,15,23,25,31],search:[0,1,3,5,9,13,31,33,36,37,38,39],sec:6,second:[0,2,3,4,5,6,7,8,9,11,12,14,15,16,23,24,25,26,28,29,31,32,34,35,38],second_mo:[21,36,37],second_term:[21,36,37],secondeigvector:11,secondli:[12,38,39],section:[4,11,17,24,28,32,33,35,36,37],sector:[0,31],see:[0,1,2,3,4,5,6,7,8,10,11,12,13,15,16,17,18,19,21,23,24,25,26,28,31,32,33,34,35,36,37,38,39],seed:[0,1,2,3,4,5,6,8,9,11,13,14,15,16,21,25,28,31,32,33,34,35,36,37,38,39],seed_imag:4,seek:[1,2,8,39],seem:[1,3,4,36,37,38,39],seemingli:[0,31],seen:[0,1,3,5,10,12,17,28,31,38,39],segment:[13,35,36],seismic:6,seldomli:[0,31],select:[1,5,6,8,9,10,11,17,25,26,27,28,29,30,31,32,33,34,38,39],self:[1,3,4,5,21,32,33,38,39],sell:4,semest:[7,27,35],semi:[8,13,35,36],semilogx:6,send:[5,12,13,29,31,36,37,38],senior:[27,29],sens:[0,4,6,8,25,31,34],sensibl:3,sensit:[0,5,6,9,13,31,32,33,34,37],sent:[2,34],sentdex:[],sentenc:[4,12,37,38],sep:[32,34],separ:[0,1,2,4,6,8,9,12,14,15,23,25,28,31,34,37,38,39],septemb:[16,17,18,19,20,25,31,32,36],sequenc:[2,3,4,7,9,10,12,13,23,24,28,31,35,36,37,38],sequenti:[1,3,4,10,12,28,37,38,39],seri:[0,1,2,3,4,5,6,10,11,12,13,24,31,32,33,34,35,36,37,38,39],serif:[0,7,28,31,35],serv:[0,1,2,3,5,7,13,21,25,30,31,32,33,34,35,36,37,39],servic:[25,26],session:[1,20,25,27,29,31,34,35,36,37,38,39],set:[1,4,5,6,7,8,10,11,13,14,16,17,21,23,24,25,26,28,29,33,34,36,37],set_major_formatt:[6,25],set_major_loc:[6,25],set_tick:[1,8,39],set_ticklabel:[1,39],set_titl:[0,1,2,3,7,12,14,31,35,37,38,39],set_xlabel:[0,1,2,3,7,12,31,35,37,38,39],set_xlim:[7,12,35,37,38],set_xticklabel:[1,39],set_ylabel:[0,1,2,3,7,31,35,38,39],set_ylim:[7,12,35,37,38],set_ytick:[7,35],set_yticklabel:[1,6,39],set_zlim:[6,25],seth:4,setminu:[6,35],setosa:[8,9],setosa_or_versicolor:8,setp:[6,34],setup:[1,4,6,8,21,23,26,31,32,38,39],sever:[0,3,5,6,7,8,9,11,12,13,21,23,24,26,28,31,32,33,34,35,36,37,38],sgd:[1,3,21,22,26,35,39],sgd_clf:8,sgdclassifi:8,sgdreg:[13,35,36],sgdregressor:[13,35,36],sgn:[5,32,33],shallow:[13,36,37],shape:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,24,31,32,33,34,35,36,38,39],shape_bas:[],share:[1,3,31,39],she:[7,35],shell:21,shift:[1,6,12,28,33,37,38,39],ship:3,shire:31,shortcom:[13,35,36,37],shorten:4,shorter:28,shorthand:[31,34],shortli:[24,31],should:[0,2,3,5,6,8,9,11,12,13,15,16,21,22,24,25,26,28,31,32,33,34,36,37,38],should_sync:[3,4],show:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,21,24,25,28,31,32,33,34,35,36,37,38,39],show_shap:4,shown:[0,4,5,7,8,11,12,13,21,24,32,35,36,37,38],shrink:[3,5,6,8,11,25,32,33],shrinkag:[5,6,32,33],shrunk:11,shuffl:[0,1,3,4,6,13,21,32,34,35,36,37,38,39],side:[0,2,5,8,12,13,24,26,31,33,34,35,36,37,38],sigh:[23,31],sigma0:28,sigma1:28,sigma2:28,sigma:[0,1,5,6,7,10,11,12,13,17,18,19,24,25,28,31,32,33,34,35,36,37,38,39],sigma_0:[5,32,33],sigma_1:[5,32,33],sigma_2:[5,32,33],sigma_:[5,24,31,32,33,34],sigma_fn:[7,12,35,37,38],sigma_i:[0,5,31,32,33],sigma_j:[5,17,32,33],sigma_m:[6,28,34],sigma_n:[11,28],sigma_t:[13,36,37],sigma_x:28,sigmoid:[1,2,4,7,8,10,12,26,35,36,37,38],sigmundson:[6,32,33],sign:[1,2,7,8,10,28,29,35,38,39],signal:[1,3,10,12,37,38,39],signatur:[3,4],signifi:4,signific:[1,39],significantli:[1,13,21,28,35,36,37,38,39],sim:[4,5,6,13,18,25,28,33,34,36,37],similar:[0,1,2,3,4,5,6,7,8,9,10,11,14,17,23,24,25,26,31,32,33,34,35,39],similarli:[0,1,3,5,8,10,13,20,28,31,32,33,39],simpl:[1,2,3,5,6,7,8,10,11,12,14,15,16,17,19,21,22,23,24,25,26,28,34,38,39],simple_rnn:4,simplepredict:10,simpler:[0,1,5,6,7,13,16,19,21,22,23,25,26,31,33,36,37,39],simplernn:4,simplest:[0,1,3,4,9,10,12,14,31,37,38,39],simpletre:10,simpli:[0,1,2,4,5,6,8,9,10,11,12,15,23,24,25,26,28,31,32,33,34,37,38,39],simplic:[2,5,6,7,8,9,10,11,12,14,32,33,34,35,37,38],simplicti:[5,32],simplifi:[0,6,9,15,23,25,31,32,33,34],simplist:[3,6,28,34],simul:[6,34],simultan:[6,34],sin:[0,1,2,3,4,9,12,13,21,24,31,36,37,38,39],sinc:[0,1,2,3,5,6,7,8,9,10,11,13,21,24,28,30,31,32,33,34,35,36,37,38,39],sine:[3,12,37,38],singl:[0,1,2,3,5,6,7,8,9,12,13,24,26,28,31,32,33,34,35,36,39],singular:[0,6,13,24,25,31,33,34,35,36],sinusoid:3,site:[0,1,2,3,4,6,7,8,11,13,21,25,26,27,31,32,33,35,37,38,39],situat:[0,4,5,7,13,21,28,31,32,35,36,37],six:[3,28],size:[0,1,2,3,4,5,6,8,9,10,11,13,21,22,24,25,26,28,31,33,34,35,36,37,38,39],sketch:10,ski:9,skill:[0,31],skip:[3,4,11],skiprow:32,skl:[0,6,31,32,33],sklearn:[0,1,3,5,6,7,8,9,10,11,13,14,31,32,33,34,35,36,37,38,39],skplt:[7,10,35],sl:[6,33,35],slack:8,slice:[2,24,31],slide:[0,3,15,16,25,26,28,31,32,34,36,38,39],slight:[6,13,34,36,37],slightli:[1,2,3,5,6,7,10,28,32,33,34,35,39],slope:[8,11,12,37,38],slow:[0,2,8,13,32,35,36,37],slower:[5,24,31,32,33],slowest:24,slowli:[12,38],slp:[1,38,39],small:[0,1,2,3,5,6,8,9,10,11,12,13,21,23,24,25,28,31,32,33,34,35,36,37,38,39],smaller:[0,1,2,5,6,8,9,11,13,28,31,32,33,34,35,36,37,39],smallest:[0,4,14,15,16,31,35],smallest_row_index:14,smooth:[0,3,6,9,13,25,31,35,36],sn:[0,1,3,6,7,31,32,35,38,39],sne:11,sneak:31,so:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19,21,23,24,25,26,28,29,31,32,33,34,35,36,37,38,39],soar:6,social:[0,31],societ:31,soft:[1,7,10,12,35,37,38,39],soften:8,softmax:[3,7,35],softwar:[0,8,15,23,24],sol:8,sole:[0,6,31],solid:[0,7,31,35],solut:[0,1,2,3,5,6,8,10,11,13,17,18,24,25,26,28,31,32,33,34,35,36,37,39],solution_ev:36,soluton:2,solv:[0,1,3,5,6,8,10,11,12,13,24,25,26,31,32,37,38,39],solve_expdec:2,solve_ode_deep_neural_network:2,solve_ode_neural_network:2,solve_pde_deep_neural_network:2,solveod:2,solveode_popul:2,solver:[2,7,8,9,10,11,21,24,35],some:[0,1,2,3,4,5,6,7,8,9,10,11,12,14,28,33,34,37,38,39],some_model:[6,32,33],somehow:4,someth:[0,1,3,4,7,9,11,25,26,28,31,32,35,38,39],sometim:[0,1,11,12,13,14,31,32,36,37,38,39],somewhat:[37,38],soon:[24,29],sophist:[0,31],sopt:[13,36],sort:[5,6,9,11,28,32,34],sound:[3,5,33,34],sourc:[0,1,3,6,15,23,24,25,26,28,31,32,34,39],space:[0,1,4,5,8,9,11,12,13,14,21,28,32,33,34,35,36,37,38,39],span:[0,3,5,9,11,24,31,32],spare:[1,39],spars:[2,3,6,24,31],sparse_add:2,sparse_mtx:[24,31],sparsecategoricalcrossentropi:3,sparseobject:[],sparsiti:10,spatial:[1,2,3,12,37,38,39],speak:28,special:[6,7,10,12,13,24,28,31,32,33,34,35,36,38],specif:[0,1,2,3,4,5,6,7,8,9,11,12,16,23,24,25,26,28,30,31,32,33,34,35,37,38,39],specifi:[0,3,5,6,7,9,11,13,14,21,25,28,31,33,34,35,36,37],specifici:[0,10,31],spectacular:3,spectral:[1,39],speech:[0,1,3,4,12,31,37,38,39],speed:[1,2,4,13,36,37,38,39],spend:28,spent:[25,26],sphere:[0,32],spin:6,spite:[0,31],spline:8,split:[1,3,4,5,6,8,9,10,11,14,17,25,28,33,34,35,39],splite:0,splitter:[1,10,39],spontan:28,spot:3,spread:[0,11,28,31,32],springer:[18,25,30,31,33],spuriou:[13,21,36,37],sqquar:33,sqrsignal:3,sqrt:[0,3,4,5,6,8,10,11,13,17,21,28,32,33,34,36,37],squar:[1,2,3,4,7,8,9,11,13,14,15,16,17,19,21,22,23,24,26,28,34,35,36,37,38,39],squarederror:10,squaredeuclidean:14,squash:[12,37,38],srtm:[6,25],srtm_data_norway_1:[6,25],stabil:[5,25,26],stabl:[0,4,5,6,7,9,11,23,31,32,33,35],stack:[3,4],stacklevel:[0,31],stage:[5,13,21,25,26,36,37],stai:[0,2,4,5,11,17,31,32],stand:[0,5,9,12,31,32,33,37,38],standadscal:32,standard:[0,1,4,5,6,7,8,10,12,15,16,17,19,21,22,24,25,26,28,31,33,35,37,38,39],standard_basi:[],standardscal:[0,6,7,8,9,10,11,32,33,34],stanford:[13,35],start:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,20,22,24,25,26,28,29,31,32,34,35,36,38,39],start_box:[13,37],start_nod:[13,37],start_tim:14,starting_point:21,stat:[6,32,34,35],state:[1,2,4,5,6,7,8,10,11,12,13,23,26,28,32,33,34,35,36,37,38,39],statement:[0,7,24,35],stationari:[35,36],statist:[0,1,3,4,7,9,10,11,12,13,14,18,24,25,27,30,32,35,36,37,38,39],statu:[0,7,11,31,32,35],stavang:[6,25],std:[0,4,6,31,32,34],steep:[13,21,35,36,37],steepest:37,step:[0,1,2,3,4,6,7,9,10,11,12,13,14,21,22,24,25,31,38,39],step_fn:[7,12,35,37,38],step_length:[13,36,37],step_num:[3,4],step_siz:36,steps_list:9,steps_per_epoch:[3,4],stereo:3,still:[0,2,3,5,6,11,13,17,28,34,35,36,37],stimuli:[12,37,38],stk2100:[30,31],stk3155:[15,25,26,27,29],stk4021:[30,31],stk4051:[30,31],stk4155:[27,29],stk5000:30,stk:[30,31],stochast:[0,1,5,6,8,11,12,15,16,22,25,31,33,34,35,38,39],stock:4,stoke:[12,37,38],stone:[0,7,25,31,35],stop:[1,4,7,9,11,13,14,21,35,38,39],storag:[5,32],store:[0,1,2,3,6,11,13,25,28,31,36,37,38,39],storehaug:[29,31],str:[1,3,4,38,39],straight:[0,6,8,13,31,32,34,35,36],straightforward:[0,2,3,5,6,8,9,10,13,24,31,32,33,34,35,36],strategi:[0,1,9,31,38,39],stratifi:[6,34],strength:[0,5,14,32],stretch:11,strict:[8,13,35,36],strictli:[8,13,35,36],stride:[4,24],strike:6,string:[1,38,39],stroke:[7,35],strong:[3,6,9,10,12,24,28,34,37,38],strongli:[0,8,23,24,26,32],stronli:[0,32],structur:[0,1,2,3,6,9,10,12,23,31,34,35,36,37,38,39],stuck:[1,13,35,36,37,38,39],student:[0,25,26,27,29,30,31],studi:[0,3,4,5,6,7,8,11,12,13,17,19,21,23,25,26,30,31,32,33,36,37,38],studier:30,style:[0,7,9,24,31,35],sub:[9,12,37,38],subarg:[13,37],subdivid:[0,24,31],subfield:[0,31],subject:[6,8,28],submit:31,subplot:[0,1,3,4,6,7,8,9,10,13,14,25,31,32,34,35,36,38,39],subplots_adjust:[8,28],subprogram:[24,31],subract:[0,32],subroutin:[0,31],subscript:[1,38,39],subsequ:[1,4,5,6,12,24,28,32,34,37,38,39],subset:[1,6,9,12,13,23,31,34,35,36,37,38,39],subspac:[0,8,11,32],substanti:[9,10],substep:11,substitut:[3,6,12,24,34,37,38],subsubset:9,subtask:6,subtl:[1,39],subtract:[0,4,5,6,11,13,17,21,24,25,28,33,34,36,37],subtre:9,subval:[13,37],succeed:[0,4,31],success:[3,7,9,13,28,35,36],successfulli:[4,9],sudo:[0,15,23,25,31],suffer:[0,1,2,5,10,31,32,33,39],suffici:[1,6,8,11,13,34,35,36,38,39],suggest:[1,13,26,30,36,37,39],suit:[8,12,37,38],suitabl:[0,28,32],sum:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,24,25,28,31,32,33,35,36,37,38,39],sum_:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,24,25,26,28,31,32,33,34,35,36,37,38,39],sum_i:[0,2,5,6,8,13,17,19,25,32,33,34,36,37],sum_j:6,sum_ja_:0,sum_k:[6,8,12,24,38,39],sum_logist:[13,36,37],sum_m:3,sum_n:3,sum_nx_:3,summar:[5,6,9,26,33,34,35,36,38,39],summari:[1,3,4,10,21,26,27,33,38,39],summat:[0,3,16,32],sundai:[17,18,19,20,21,22],sunni:9,superconduct:[32,33],superfici:3,superscript:[1,12,37,38,39],supervis:[0,5,6,7,9,12,23,31,32,34,35,37,38],supplement:[7,35],support:[0,1,9,10,11,13,23,31,32,36,37,39],suppos:[0,5,6,7,8,10,11,12,13,24,31,32,33,34,35,36,37,38],suppress:[5,13,33,36,37],sure:[0,1,4,6,25,39],surf:[6,25],surfac:[0,6,25,31],surpass:6,surpris:[0,31],surround:[3,23],survei:[0,5,6,31,32,33,34],svc:[8,9,10],svd:[0,6,11,17,31,34],svdinv:[5,33],svm:[8,9,10,11],svm_clf:[8,10],swath:[5,32],sy:[13,35,36],symbol:[1,5,11,13,23,28,31,32,33,36,37,38,39],symmeteri:[1,39],symmetr:[0,5,8,11,12,13,24,31,32,36,37,38],symmetri:[6,9],sympi:[0,15,23,25,31],synonim:28,syntax:[1,13,39],syntaxerror:[1,8,39],system:[0,1,3,4,6,7,9,10,12,13,15,23,24,25,31,35,36,37,38,39],systemat:[4,6,34],t0:[3,6,13,21,36,37],t1:[2,13,21,36,37],t2:2,t3:2,t:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,23,24,25,26,28,29,31,34,35,36,37,38,39],t_0:[2,9,13,36,37],t_1:[13,36,37],t_:2,t_b:10,t_i:[1,2,5,12,26,32,38,39],t_j:[12,38],t_k:9,tabl:[9,25,26,28,29,31,37,38,39],tabul:[0,31],tabular:31,tackl:4,tag:[2,3,4,5,6,7,12,13,14,21,24,28,32,35,36,37,38],taht:[0,31],tail:28,tailor:[2,8,11,31],taiwan:[0,31],take:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,21,23,24,25,28,31,32,33,34,35,36,37,38,39],taken:[0,1,3,6,10,13,24,31,34,36,37,38,39],tan:3,tangent:[1,4,12,13,35,36,37,38,39],tanh:[1,4,7,8,12,35,36,37,38,39],tape:[3,4],target:[0,1,3,4,5,6,7,8,9,10,11,12,26,31,32,33,34,35,36,37,38,39],target_nam:9,task:[0,1,3,6,9,11,12,14,20,25,31,34,37,38,39],tau:[3,5,28,33,34],taught:31,tax:[0,32],taylor:[2,13,35,36],taylornr:[13,35,36],tba:36,tc:8,td:[1,6,13,25,31,34,36,38,39],teach:31,team:[1,39],teaser:0,technic:[0,5,6,13,15,31,32,36,37],techniqu:[0,1,8,10,13,23,28,30,31,32,34,35,36,37,39],technolog:[0,1,31,38,39],tell:[0,4,6,10,11,13,28,34,36,37],temp1:[1,39],temp2:[1,39],temp:[1,39],temperatur:[0,9,31],temporarili:[1,39],ten:[3,17,31],tend:[3,5,6,8,9,10,12,13,14,21,32,33,34,36,37,38],tendenc:[0,31],tension:[6,34],tensor:[3,4],tensorflow:[0,2,4,8,14,15,23,24,25,26,27,30,31,32],term1:[5,6,11,25,32],term2:[5,6,11,25,32],term3:[5,6,11,25,32],term4:[5,6,11,25,32],term:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,21,25,28,31,32,33,35,36,37,39],termin:[0,4,5,9,10,13,15,21,31,32,36,37],terrain1:[6,25],terrain:[6,21,22,25,26],test:[3,4,5,6,7,8,9,10,13,17,19,21,22,24,25,28,34,35,36,37],test_acc:3,test_accuraci:[1,3,38,39],test_error:6,test_imag:[3,4],test_ind:[6,34,35],test_input:4,test_label:[3,4],test_loss:3,test_pr:[1,38,39],test_predict:[1,38,39],test_rnn:4,test_scor:[7,10,35],test_siz:[0,1,3,5,6,10,31,32,33,34,35,38,39],test_split:9,tester:33,testerror:[0,6,32,34],testi:4,testpredict:4,testx:4,text:[0,1,2,4,5,8,9,11,13,15,21,24,26,28,30,31,32,34,35,36,37,38,39],textbook:[17,21,22,25,26,32,34],textual:9,textur:[1,9,39],tf:[1,3,4,13,14,35,36,39],tfe_py_execut:[3,4],th:[0,1,2,5,6,7,9,12,13,14,15,16,24,25,28,31,32,33,34,35,36,37,38,39],than:[0,1,2,3,4,5,6,7,9,10,11,12,13,17,23,26,28,31,32,33,34,37,38,39],thank:[4,6,32,33],theano:[1,23,31,39],thei:[0,1,2,3,4,5,6,7,8,9,11,12,13,24,25,28,32,33,34,35,36,37,38,39],them:[0,1,3,4,6,8,9,10,11,12,13,24,25,26,31,32,33,34,36,37,38,39],theme:[0,31],themselv:[0,28,31],thenc:[6,34],theorem:[2,6,7,32,35,37,39],theoret:[0,4,10,31],theori:[0,1,3,8,9,12,13,18,23,25,30,31,33,36,37,38,39],thereaft:[0,5,6,11,12,15,16,17,24,25,26,31,34,38,39],therebi:[0,5,7,11,31,32,33,35],therefor:[0,1,2,3,4,6,7,8,11,13,28,31,32,34,35,36,37,38,39],therein:11,thereof:[0,6,13,31,34,36,37],theta:[1,4,13,21,28,36,37,38,39],theta_:[1,13,36,37,38,39],theta_i:[1,38,39],theta_linreg:[13,21,36,37],theta_t:[13,36,37],thetaand:[37,38],thetaor:[37,38],thetaxor:[37,38],thi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,23,24,25,26,27,28,30,32,33,34,35,36,37,38,39],thing:[0,1,2,4,5,7,9,28,31,33,34,35,39],think:[0,1,3,4,6,9,12,13,14,28,31,34,35,36,37,38,39],third:[0,3,6,13,21,29,31,34,35,36,37],thirti:[7,35],thorughout:31,those:[0,3,5,6,8,9,10,11,21,24,25,26,27,31,32,34],though:[1,2,3,4,13,24,28,36,37,38,39],thought:[6,14,25,26,28,34],thousand:[0,1,25,31,32,36,37,39],thread:[3,4],three:[0,1,3,5,6,8,9,12,15,24,25,27,28,29,31,32,33,34,35,37,38,39],threshold:[1,3,9,10,11,12,13,36,37,38,39],through:[0,1,2,3,4,5,6,8,11,12,13,14,23,24,28,31,32,33,34,35,36,37,38,39],throughout:[0,4,5,14,23,24,28,31],thu:[0,1,2,5,6,7,8,10,11,12,13,21,25,29,31,32,33,34,35,36,37,38,39],thumb:[0,6,25,31,32],thursdai:[29,31,36,37],tibshirani:[6,18,25,27,30,31,32,34],tick_param:6,ticker:[6,13,25,28,35,36],tif:[6,25],tight_layout:[1,7,35,39],tightli:11,tild:[0,5,6,7,11,15,16,17,18,19,25,28,31,32,33,34,38,39],till:[0,4,7,8,9,10,12,24,31,32,35,36,38,39],time:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,21,23,24,25,26,28,31,32,33,34,35,38,39],timeit:4,timer:4,tini:[1,39],tip:3,titl:[0,1,2,3,4,6,7,8,9,10,13,21,25,28,31,32,34,35,36,37,38,39],tmp:[13,36,37],tmp_log:[3,4],tn:[2,3,7],to_categor:[1,3,4,38,39],to_categorical_numpi:[1,38,39],to_numer:[0,6,31,34],todai:3,togeth:[0,3,6,8,11,13,21,23,31,32,36,37],toi:[14,36,37],told:[13,36,37],toler:[2,6,14],tolist:4,tomographi:[12,37,38],too:[0,2,4,5,6,9,11,13,15,28,30,31,32,34,35,36,37],took:[8,31],tool:[0,1,3,6,13,23,32,34,36,37,39],toolbox:8,top:[0,3,5,6,9,10,18,23,31,33,34],topic:[0,5,6,7,8,23,25,26,32,33,35],topograph:25,topolog:[1,3,12,37,38,39],toposort:[],torkjellsdatt:[29,31],toss:[10,28],total:[0,1,2,3,4,6,7,8,10,11,12,13,14,15,16,22,24,26,28,29,31,32,34,35,36,38,39],total_loss:4,totalclustervari:14,totalscatt:14,toward:[1,2,7,12,13,25,35,36,38,39],towardsdatasci:[36,37],town:[0,32],tp:[4,7],tpng:9,tpu:[13,21,23,31,36,37],tqdm:6,tr:32,trace:[2,3,4,13,37],trace_stack:[13,37],traceback:[0,2,3,4,6,9,10,13,15,25,31,33,34,35,36,37],traceback_util:[3,4],tracer:[2,13,37],tracing_count:[3,4],track:[3,13,14,24,35,36,37],tract:[0,32],tractabl:[0,31,32],trade:[5,9,19,33,34],tradeoff:[0,5,19,25,31,32,33,35],tradit:[0,1,4,6,31,34,38,39],train:[2,3,5,6,8,9,10,11,12,13,17,19,21,25,26,33,34,35,36,37],train_accuraci:[0,1,3,31,38,39],train_dataset:4,train_end:[0,1,32,38,39],train_error:6,train_funct:[3,4],train_imag:[3,4],train_ind:[6,34,35],train_label:[3,4],train_pr:[1,38,39],train_siz:[0,1,3,32,38,39],train_step:4,train_test_split:[0,1,3,5,6,7,9,10,11,31,32,33,34,35,38,39],train_test_split_numpi:[0,1,32,38,39],trainabl:4,trainable_vari:4,trained_model:[6,32,33],trainerror:[0,32],traini:4,training_checkpoint:4,training_dataset:4,training_gradi:[13,21,36,37],training_gradient_fun:[36,37],training_loss:[36,37],trainingerror:[6,34],trainpredict:4,trainscor:4,trainx:4,trait:[0,31],trajectori:4,trajectory_i:21,trajectory_x:21,transfer:9,transform:[0,5,6,7,8,9,10,11,12,13,21,23,24,31,32,33,34,35,36,37,38],transit:[6,12,37,38],translat:[1,4,6,10,32,33,38,39],translate_vjp:[],transpos:[1,5,11,24,32,33,38,39],travers:[0,5],treat:[0,1,3,6,12,13,28,31,32,33,34,35,36,37,38,39],tree:[0,1,6,23,25,31,38,39],tree_clf:[9,10],tree_clf_:9,tree_clf_sr:9,tree_reg1:9,tree_reg2:9,tree_reg:9,trend:28,treue:7,trevor:[18,25,30],tri:[2,3,4,9,13,35,36,37],triain:0,trial:[0,2,4,6,13,28,31,34,35,36],triangl:[13,35,36],triangular:24,trick:[3,4,8,11,13,21,28,36,37],trickier:28,tridiagon:24,trillion:23,trivial:[0,1,5,11,28,31,33,39],troubl:[0,8,12,32,38],truck:3,true_beta:[6,32,33],true_divid:[1,38,39],true_fun:[6,34],truli:31,truncat:21,tucker:8,tuesdai:[29,31,34,35,36,37,38,39],tumor:[7,9,26,35],tumour:[7,35],tunabl:[1,21,22,26,39],tune:[4,9,13,21,22,24,26,31,35,36,37],tupl:[2,13,37],turn:[0,1,5,6,7,8,9,10,11,12,13,19,24,25,28,31,32,34,35,36,37,38,39],tutori:[1,4,39],tv:2,tveito:2,tweak:[1,4,10,28,39],twice:[13,35,36],twist:11,two:[0,1,2,4,5,6,7,9,10,11,12,13,15,16,22,24,27,28,30,31,33,34,36,37,38,39],tx:[13,35,36,37,38],tx_1:[13,35,36],txt:4,ty:[13,35,36],type:[0,1,3,6,8,10,13,16,24,25,28,32,33,34,35,36,39],typeerror:[2,13,37],typic:[0,1,2,3,4,5,7,9,10,12,13,21,26,28,31,32,33,34,35,36,37,38,39],typo:[25,26],u:[0,2,5,6,8,10,11,12,17,24,31,32,33,37,38],u_:24,u_i:[12,37,38],u_m:10,ua:[0,31],ubuntu:[0,15,23,25,31],uci:[0,26,32],uio:[25,26,29,30],un:14,unari:[24,31],unary_f:[2,13,37],unary_oper:[2,13,37],unary_to_nari:[2,13,37],unbalanc:[6,9,34,35],unbias:[0,5,6,31,33,34],uncent:[6,33],uncertainti:[0,5,31,33,34],uncertitud:28,unchang:[1,3,39],uncorrel:[10,28],undefin:[5,32],under:[0,1,5,6,10,13,15,16,23,25,26,31,32,33,34,35,36,39],underdetermin:[0,31],underfit:[1,6,34,39],underflowproblem:[5,33,34],undergo:[5,33,34],undergradu:[27,29],underli:[0,1,9,13,28,31,36,37,39],underset:[4,14],understand:[0,1,3,5,6,10,13,14,21,23,31,32,33,35,36,37,39],understood:[8,13,36,37],undesir:8,undetermin:[5,8,33,34],undo:4,unexpect:[6,34],unexpected:28,unfair:[6,32,33],unfortun:[1,8,9,10,39],unicode_liter:[8,9],uniform:[0,1,5,6,11,13,15,16,25,28,31,32,35,36,38,39],uniformli:[13,28,35,36,37],unifrompdf:28,unimport:[13,35,36],union:[5,6,33,34,35],uniqu:[0,2,6,13,14,24,31,34,35,36],unique_cluster_label:14,unit:[0,1,3,4,5,10,12,28,31,32,33,37,38,39],unitari:[5,6,24,32],unitarili:[24,31],uniti:28,univari:28,univers:[0,1,2,13,15,23,25,26,27,29,31,32,33,34,35,36,37,39],unix:[1,39],unknow:[0,24,31],unknown:[0,1,3,4,5,6,8,10,13,16,21,24,31,32,33,34,36,37,38,39],unknowwn:[12,38],unlabel:[1,39],unless:[0,3,6,11,13,25,26,31,32,34,35,36],unlik:[1,3,8,13,35,36,37,39],unnecessarili:9,unord:3,unravel:[1,38,39],unrol:[3,11],unseen:[0,7,9,35],unstabl:[1,39],unsupervis:[0,1,4,12,23,31,37,38,39],unsymmetr:[24,31],untak:[],until:[1,2,4,9,12,13,14,35,36,37,38,39],untouch:0,unusu:[12,37,38],up:[1,3,4,5,6,8,10,11,13,14,16,18,23,24,25,26,28,29,33,36,37],updat:[1,2,10,12,13,14,21,36,37,38,39],uploa:31,upload:[23,25,26,30],upon:[0,1,6,7,11,24,25,39],upper:[0,8,9,16,24,32],uppercas:[24,31],upsampl:4,upscal:4,us:[4,5,6,8,9,10,11,12,14,15,16,17,18,19,22,24,25,27,28,30,33,34],usa:[31,37],usag:[0,8,23,31,32],usd10000:[0,32],usd:[0,32],use_bia:4,use_multiprocess:[3,4],usecol:[0,31],useless:[1,38,39],user:[0,1,2,3,4,6,7,8,11,15,21,23,24,25,31,32,33,35,38,39],usernam:[25,26],userwarn:[3,6,21],usetex:28,usg:[6,25],usr:28,usual:[0,3,4,7,12,13,14,31,35,36,37,38],ut:[5,33],util:[0,1,3,4,6,7,10,14,26,31,32,34,35,39],ux:24,v0:28,v1:28,v2:28,v:[2,4,5,6,11,13,17,21,23,32,33,36,37],v_0:11,va:[1,39],val:[13,36,37],val_accuraci:3,val_loss:4,vale:2,valid:[0,1,4,7,9,10,13,21,23,26,28,31,32,36,37,39],validation_batch_s:[3,4],validation_data:[3,4],validation_freq:[3,4],validation_split:[3,4],validation_step:[3,4],valu:[0,1,2,3,4,6,7,8,9,10,12,13,14,15,16,19,21,23,24,25,31,36,37,38,39],valuat:9,valueerror:[0,31],valy:4,van:[0,18,25,31,32,33,34],vandenbergh:[8,13,35,36],vandermond:[0,31],vanilla:[0,6,11,14,32,33],vanish:[1,4,13,28,35,36,39],var_x:28,varabl:8,varepsilon:[5,6,18,25,33,34],varepsilon_:[5,6,33,34],varepsilon_i:[5,6,33,34],vari:[0,1,3,5,6,10,15,16,31,34,38,39],variabl:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,21,24,31,32,33,34,37,38,39],varianc:[0,1,5,7,9,10,11,13,14,18,19,21,23,24,26,28,31,32,35,36,37,39],variance_i:[5,11,32],variance_x:[5,11,32],variant:[0,1,6,8,12,13,31,32,35,36,37,38,39],variat:[3,4,11,31],varieti:[0,3,12,15,23,25,31,37,38],variou:[1,3,5,6,7,8,9,11,12,13,16,18,21,22,23,24,25,28,32,33,36,37,38,39],varydimens:4,vastli:3,vaue:[1,39],vault:0,vdot:[2,13,35,36],ve:[25,26],vec:[6,34],vector:[0,1,2,3,4,5,6,7,9,10,11,13,14,16,17,21,23,33,34,35,36,39],vector_mean:14,ventur:[0,8,15,23,31],verbos:[1,3,4,39],veri:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,25,26,28,30,31,32,33,34,35,36,37,38],verifi:[3,11,24,31],versatil:[8,31],versicolor:[8,9],version:[0,3,4,10,13,14,15,23,24,25,26,28,31,32,36,37],versu:[1,39],vert:[0,1,5,6,7,8,9,11,13,17,31,32,33,34,35,36,38,39],vert_1:[5,6,32,33,34],vert_2:[5,6,11,17,32,33,34],via:[0,5,6,7,8,9,10,11,12,15,19,23,24,25,27,28,29,31,32,33,34,35,37,38],vidal:11,video:[0,1,12,23,27,29,31,32,33,34,35,38,39],view:[1,3,5,6,12,13,21,28,30,31,33,34,36,37,38,39],violat:8,virginica:9,viridi:[0,1,2,3,31,38,39],virtual:[1,39],viscos:[13,36,37],viscou:[13,36,37],visibledeprecationwarn:2,vision:[0,3,31],visual:[0,3,11,12,15,23,31,32,37],visualis:[1,39],viz:[6,8,28],vjp:[2,13,37],vjp_argnum:[],vjpfun:[],vjpmaker:[],vjpnode:[13,37],vjps_dict:[],vmap:[13,36,37],vmax:[1,6,39],vmin:[1,6,39],voic:3,volum:[0,3,31],vote:10,voting_clf:10,votingclassifi:10,votingsimpl:10,vs:[0,2,4,6,32,34,36],vspace:[2,13,37],vstack:[5,11,24,28,31,32],vt:[5,32,33],w1:8,w2:[8,11],w3:8,w:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,24,28,31,32,34,35,36,37,38,39],w_1:[8,24],w_1x_1:8,w_1x_:8,w_2:[8,24],w_2x_2:8,w_2x_:8,w_3:24,w_4:24,w_:[1,12,37,38,39],w_hidden:2,w_i:[1,2,10,38,39],w_ix_i:[12,37,38],w_j:24,w_m:24,w_output:2,w_px_:8,w_px_p:8,wa:[0,1,3,4,5,6,7,10,11,12,13,14,17,24,25,31,32,33,34,35,36,37,38,39],wai:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,17,24,26,28,31,32,33,35,36,37,38,39],walk:9,walker:28,wang:[0,31],want:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,23,25,26,28,31,32,33,34,35,36,37,38,39],warn:[0,1,4,8,31,32,38,39],warrant:[6,34,35],wast:[3,36,37],watch:[3,4,23],wave:3,wavelet:8,we:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,22,23,24,25,26,27,28,29,30,32,33,34,35,38],weak:[9,10,14],weather:[1,12,37,38,39],web:[23,27,29,31,32],weblink:26,webpag:31,websit:[6,24,25,27,31],wedg:[8,28],wednesdai:[29,31,34,35,36,37,38,39],wee:11,week:[0,5,6,7,25,26,27,29],weekli:[23,25,29,30,31,37],weight:[0,1,2,3,6,7,9,10,12,13,25,26,28,32,35,36,37],weigth:2,welcom:[8,23],well:[0,1,2,3,4,5,6,7,8,9,10,12,13,15,16,19,20,21,23,24,25,26,28,30,31,32,33,34,35,36,37,38,39],went:8,were:[0,1,3,4,5,6,7,8,10,11,12,14,28,31,32,34,35,37,38,39],wessel:[0,18,25,31,32,33,34],what:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,19,23,24,25,26,28,35,36,37,38,39],whatev:3,when:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,21,24,25,26,28,31,32,33,34,35,38,39],whenev:[13,21,28,36,37],where:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,23,24,25,26,28,29,31,32,33,34,35,36,37,38,39],wherea:[6,28,34],wherein:[1,12,37,38,39],whether:[0,3,5,7,9,25,26,28,31,33,35],which:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,23,24,25,26,27,28,29,31,32,33,34,35,38],whichev:[1,3,39],white:9,whiteboard:[19,32,33,34,35,36],who:[0,27,31],whole:[1,3,4,5,9,11,13,33,34,36,37,38,39],whose:[0,6,10,28,32,34],whow:[11,32],whrn:34,why:[0,1,3,6,13,21,25,33,35,36,39],wide:[0,1,3,6,7,12,15,23,24,25,31,34,35,37,38,39],widehat:[6,34],width:[0,3,8,9,31],wieringen:[0,18,25,31,32,33,34],win:10,wind:9,wing:[29,31],winther:2,wiothout:[6,32,33],wiscons:[7,35],wisconsin:[10,26],wisdom:[6,33],wise:[0,1,5,12,13,32,36,37,38,39],wish:[0,2,5,7,8,11,13,14,24,25,26,31,32,35,36],with_std:[0,32,34],wither:6,within:[0,2,3,4,7,9,12,13,14,28,30,31,35,36,38],withinclust:14,without:[0,1,5,6,8,9,11,12,13,21,22,26,31,32,33,34,36,37,38,39],without_trac:[3,4],wo5dmep_bbi:[],won:[0,31],wonder:8,woodi:31,word:[0,1,3,4,5,6,7,14,28,31,32,33,34,39],work:[0,1,4,6,7,8,9,13,15,21,23,25,26,27,28,29,31,32,34,35,36,37,38,39],worker:[3,4],workshop:31,world:[0,8,31,32],worldwid:[0,31],wors:[0,1,3,4,6,31,34,39],worst:9,worth:9,worthi:[25,26],would:[0,1,3,5,6,7,8,9,10,11,12,13,24,25,26,28,31,32,33,34,35,36,37,38,39],wrap:[6,24,31],wrap_util:[2,13,37],wrapper:[0,31],write:[0,1,2,3,5,6,7,8,12,13,15,16,17,20,21,24,25,31,32,34,35,36,37,38,39],written:[0,2,3,5,11,12,13,16,23,24,25,26,28,31,32,33,34,35,36,37,38],wrong:[1,8,38,39],wrongli:10,wrote:[5,11,32],wrt:[10,13,21,36,37],wth:[10,13,21,36,37],www:[23,24,25,26,30,31],wx_1:8,x0:8,x1:[4,8,9,10,13,36,37],x1_exampl:8,x1d:8,x2:[8,9,10,13,36,37],x2d:[8,11],x2d_train:11,x2dsl:11,x3:8,x:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,22,24,25,26,28,31,34,35,36,37,38,39],x_0:[0,5,11,24,31,32,33,34],x_1:[0,2,5,6,7,8,9,10,11,13,24,28,31,32,33,34,35,36,37,38,39],x_2:[0,2,5,6,7,8,9,10,11,13,24,28,31,32,34,35,36,37,38,39],x_3:[8,24,28],x_4:24,x_:[0,2,3,5,6,8,10,11,13,14,18,24,25,28,31,32,33,34,35,36],x_center:11,x_data:[1,38,39],x_data_ful:[1,38,39],x_hidden:2,x_i:[0,1,2,5,6,7,8,9,10,11,12,13,14,17,24,28,31,32,33,34,35,36,37,38,39],x_input:2,x_ix_:[0,31],x_iy_i:8,x_j:[0,2,8,9,12,16,28,32,37,38],x_jy_j:8,x_k:[12,14,24,28,32,37,38],x_l:28,x_m:[6,12,24,28,34,37,38],x_n:[0,2,3,6,8,11,12,13,24,28,31,34,35,36,37,38],x_new:[2,9,10],x_offset:[6,32,33],x_output:2,x_p:[3,7,9,35],x_poli:9,x_poly10:9,x_pred:4,x_prev:2,x_reduc:11,x_scale:8,x_small:[13,36,37],x_test:[0,1,3,5,6,7,9,10,11,31,32,33,34,35,38,39],x_test_own:6,x_test_scal:[0,6,7,9,10,11,32,33,34],x_tot:4,x_train:[0,1,3,4,5,6,7,9,10,11,31,32,33,34,35,38,39],x_train_mean:[6,32,33,34],x_train_own:6,x_train_scal:[0,6,7,9,10,11,32,33,34],x_val:[1,39],xarrai:[23,31],xavier:[1,39],xbnew:[13,35,36],xcode:[0,15,23,25,31],xdclassiffierconfus:10,xdclassiffierroc:10,xg_clf:10,xgb:10,xgbclassifi:10,xgboost:9,xgboot:10,xgbregressor:10,xgparam:10,xgtree:10,xi:[8,13,21,36,37],xi_1:8,xi_:8,xi_i:8,xinv:[33,37,38],xk:8,xla:[3,4,13,21,23,31,36,37],xlabel:[0,1,2,3,4,5,6,7,8,9,10,13,21,25,28,31,32,33,34,35,36,37,39],xlim:[6,10,34],xm:9,xmesh:[13,36],xnew:[0,13,21,31,35,36,37],xp:28,xpanda:[0,32],xpd:[5,11,32],xplot:0,xs:9,xscale:[0,32],xsr:9,xt_x:[13,21,35,36,37],xtest:[6,34,35],xtick:[3,6,8,9,34],xtrain:[6,34,35],xu:[0,31],xx:[0,24,31],xy:[0,6,8,24,25,31],xytext:8,xz:[24,31],y1:4,y2:4,y3:4,y:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,24,25,28,31,32,33,34,35,36,37,38,39],y_0:[0,5,11,24,31,32,33,34],y_1:[0,5,8,9,11,13,24,31,32,33,34,35,36],y_1y_1:8,y_1y_1k:8,y_1y_2:8,y_1y_2k:8,y_1y_n:8,y_1y_nk:8,y_2:[0,5,8,9,11,24,31,32],y_2y_1:8,y_2y_1k:8,y_2y_2:8,y_2y_2k:8,y_3:[0,9,24],y_4:24,y_:[0,1,5,6,10,11,24,31,32,33,34,38,39],y_data:[0,1,5,6,31,32,33,34,35,38,39],y_data_ful:[1,38,39],y_decis:8,y_fit:[0,32],y_i:[0,1,5,6,7,8,9,10,11,12,13,15,16,17,18,19,24,25,26,31,32,33,34,35,36,37,38,39],y_if_:10,y_ix_:[0,31],y_ix_i:[7,8,13,32,35,36],y_iy_jk:8,y_j:[6,8,12,19,25,34,37,38],y_k:[12,37,38],y_m:24,y_model:[0,4,5,6,31,32,33,34,35],y_n:[8,13,35,36],y_ny_1:8,y_ny_1k:8,y_ny_2:8,y_ny_2k:8,y_ny_n:8,y_ny_nk:8,y_offset:[6,32,33],y_plot:9,y_pred1:9,y_pred2:9,y_pred:[0,1,4,6,7,8,9,10,32,33,34,35,38,39],y_pred_rf:10,y_pred_tre:10,y_proba:[7,10,35],y_scaler:[6,33,34],y_test:[0,1,3,4,5,6,7,9,10,11,31,32,33,34,35,38,39],y_test_onehot:[1,38,39],y_test_predict:[0,32],y_test_scal:34,y_tot:4,y_train:[0,1,3,4,5,6,7,9,10,11,31,32,33,34,35,38,39],y_train_mean:[6,32,33],y_train_onehot:[1,38,39],y_train_predict:[0,32],y_train_scal:[6,33,34],y_val:[1,39],yand:[37,38,39],ye:[3,6,7,34,35],year:[0,23,31,39],yet:[0,1,6,8,11,13,31,35,36,37,38,39],yi:[13,21,36,37],yield:[0,2,5,6,8,10,12,13,14,24,28,31,33,34,35,36,37,38],yk:8,ylabel:[0,1,2,3,4,5,6,7,8,9,10,13,21,25,28,31,32,33,34,35,36,37,39],ylim:[3,6,34],ym:9,ymesh:[13,36],yn:0,yo:[8,9,10],yor:[37,38,39],yoshua:[1,30,39],you:[0,1,2,3,4,5,6,8,9,10,11,13,15,16,17,19,20,21,22,23,24,25,26,28,29,30,32,33,34,35,36,37,38,39],young:[0,31],your:[1,2,4,5,6,8,11,13,17,19,20,21,22,23,24,25,33,34,35,36,37,38,39],yourself:[11,13,31,36],youtub:23,ypred:[6,34,35],ypredict2:[13,21,35,36,37],ypredict:[0,13,21,31,32,35,36,37],ypredictlasso:[5,33],ypredictol:[0,5,33,34],ypredictown:[6,32,33],ypredictownridg:[6,33],ypredictridg:[0,5,6,33,34,35],ypredictskl:[6,32,33],yridg:31,ys:9,ytest:[6,34,35],ytick:[3,6,8,9,34],ytild:[0,6,31,32,34],ytilde_test_ol:34,ytilde_test_ridg:34,ytildelasso:[5,33],ytildenp:[0,31,32],ytildeol:[0,5,33],ytildeownridg:[6,33],ytilderidg:[5,6,33],ytrain:[6,34,35],yx:[24,31],yxor:[37,38,39],yy:[24,31],yz:[24,31],z:[0,1,2,3,4,5,6,7,8,9,11,12,13,24,25,28,31,32,34,35,36,37,38,39],z_0:[24,31],z_1:[24,31],z_2:[24,31],z_:[1,2,12,24,31,38,39],z_c:[1,38,39],z_h:[1,38,39],z_hidden:2,z_i:[1,12,37,38,39],z_j:[1,12,39],z_k:[12,32,38],z_m:[1,38,39],z_mod:9,z_o:[1,38,39],z_output:2,zaman:28,zaxi:[6,25],zero:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,21,24,25,28,31,32,33,34,35,36,37,38,39],zeros_lik:4,zeroth:32,zfill:4,zip:[2,4,6,13,37],zm_h:[0,31],zn:[0,32],zone:[0,32],zoom:31,zx:[24,31],zy:[24,31],zz:[24,31]},titles:["3. Linear Regression","14. Building a Feed Forward Neural Network","15. Solving Differential Equations with Deep Learning","16. Convolutional Neural Networks","17. Recurrent neural networks: Overarching view","4. Ridge and Lasso Regression","5. Resampling Methods","6. Logistic Regression","8. Support Vector Machines, overarching aims","9. Decision trees, overarching aims","10. Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods","11. Basic ideas of the Principal Component Analysis (PCA)","13. Neural networks","7. Optimization, the central part of any Machine Learning algortithm","12. Clustering and Unsupervised Learning","Exercises week 34","Exercises week 35","Exercises week 36","Exercises week 37","Exercises week 38","Exercises week 39","Exercises week 41","Exercises week 42","Applied Data Analysis and Machine Learning","2. Linear Algebra, Handling of Arrays and more Python Features","Project 1 on Machine Learning, deadline October 9 (midnight), 2023","Project 2 on Machine Learning, deadline November 13 (Midnight)","Teaching schedule with links to material","1. Elements of Probability Theory and Statistical Data Analysis","Teachers and Grading","Textbooks","Week 34: Introduction to the course, Logistics and Practicalities","Week 35: From Ordinary Linear Regression to Ridge and Lasso Regression","Week 36: Statistical interpretation of Linear Regression and Resampling techniques","Week 37: Statistical interpretations and Resampling Methods","Week 38: Logistic Regression and Optimization","Week 39: Optimization and Gradient Methods","Week 40: Gradient descent methods (continued) and start Neural networks","Week 41 Neural networks and constructing a neural network code","Week 42 Constructing a Neural Network code with introduction to Tensor flow"],titleterms:{"1":[0,15,16,17,18,25,31,32],"12":38,"13":26,"14":34,"19":39,"2":[0,15,16,17,18,26,31,32],"2023":[25,29],"21":35,"23":35,"3":[0,15,16,31,32],"31":32,"34":[15,31],"35":[16,32],"36":[17,33],"37":[18,34],"38":[19,35],"39":[20,21,36],"4":[0,32],"40":[21,37],"41":[21,38],"42":[22,39],"5":0,"7":33,"9":25,"case":[8,10,28,32,33,35,36],"class":35,"do":[1,31,33,34,36,37,38,39],"final":[12,21,26,32,33,36,37,38],"function":[0,1,6,7,8,10,11,12,13,21,25,26,28,31,32,33,34,35,36,37,38,39],"import":[5,21,24,31,32,33],"new":[4,33,34],A:[0,1,4,8,9,21,31,33,34,35,39],AND:[37,38,39],And:[21,31,32,33,35,36,37],But:[21,36,37],In:29,Is:39,Ising:6,OR:[37,38,39],The:[0,1,2,3,5,6,7,8,9,11,12,17,23,31,32,33,34,35,36,37,38,39],To:[31,32],With:[4,33],about:[31,32],abov:33,activ:[1,12,26,33,37,38,39],ad:[0,6,17,25,31,32,37,38],adaboost:10,adagrad:[13,21,36,37],adam:[13,21,36,37],adapt:[10,21,36,37],adjust:[1,38,39],advanc:21,adversari:4,again:[3,9,35],ai:31,aim:[8,9,17,18,19,20,21,22,31],aka:[31,32],al:21,algebra:[24,31],algorithm:[9,10,11,12,21,26,32,36,37,38,39],algortithm:[13,35,36],all:8,an:[0,4,10,31],analys:[5,32],analysi:[0,5,6,11,23,25,26,28,31,32,33,34],analyt:[0,16,17,21],ani:[13,35,36],anoth:[9,33,34],appli:23,approach:[0,8,14,31,34,36,37],approxim:[12,38],architectur:[1,38,39],argument:[36,37],arrai:[24,31],artifici:[37,38],assist:29,assumpt:[33,34],august:32,autocorrel:28,autograd:[2,13,21,36,37],automat:[13,21,36,37],avoid:[36,37],b:[17,25,26,36,37],back:[1,11,12,38,39],background:[23,25,26,34],bag:10,base:[13,21,34,36,37],basic:[0,5,7,9,10,11,24,32,33,34,35],batch:[1,36,37,39],bay:[5,33,34],befor:11,beta:[33,34],better:[8,37,38],bia:[6,25,34],bias:[38,39],binari:[1,38,39],bind:31,bird:10,boldsymbol:[32,33,34],boost:10,bootstrap:[6,10,34],boston:[0,32],breast:[1,39],brief:[31,34,35,36],bring:[12,38],build:[1,3,9,39],c:[25,26,31],calcul:32,can:[21,31,34,36,37],cancer:[1,7,9,11,35,39],cart:9,center:32,central:[13,23,28,34,35,36],chain:[12,38],challeng:35,chang:10,channel:31,chi:[0,31],choic:39,choos:[1,38,39],cifar01:3,classic:11,classif:[1,9,10,26,35,38,39],classifi:[8,35],clip:[1,39],cluster:14,cnn:3,code:[0,1,2,5,9,11,12,13,14,21,26,31,32,33,34,35,36,37,38,39],collect:[1,3,38,39],come:35,commun:31,compact:35,compar:[2,10],comparison:33,compet:[21,36,37],complet:32,complex:[0,6,25,32],complic:[6,36,37],compon:11,comput:[9,36,37],computation:34,computerlab:31,con:9,concept:28,condit:[33,34,35,36],confid:34,conjug:[13,36],construct:[38,39],continu:37,contn:31,convex:[8,13,35,36],convolut:[3,12,37,38],correctli:[33,34],correl:[11,32,35],correspond:[35,36],cost:[1,10,32,33,34,35,36,38,39],cours:[23,30,31],covari:[5,11,28,32],cover:31,critic:26,cross:[6,25,34,35],cython:31,d:[25,26],data:[0,1,3,6,7,9,11,15,16,23,25,28,31,32,33,35,38,39],dataset:[1,3,38,39],deadlin:[25,26,31],decai:[2,36,37],decis:[9,10],decomposit:[5,11,17,24,32],deep:[1,2,35,39],defin:[1,31,38,39],definit:38,degre:[0,32],deliveri:[25,26],delta:34,dens:[0,31],deriv:[5,12,32,33,34,35,36,38,39],descent:[2,10,13,21,26,35,36,37],descript:25,design:32,detail:[3,31],develop:[1,38,39],diagon:11,differ:[8,26,36,37],different:21,differenti:[2,13,36,37],diffus:2,dimension:[2,3,8,25,32],directli:[36,37],disadvantag:9,discret:28,discuss:35,distribut:[5,28,33,34],distrubut:[33,34],doe:[32,33,37,38],domain:28,dot:[36,37],down:[1,39],dropout:[1,39],e:[25,26],each:35,economi:32,electron:[25,26],element:[0,28,31,36,37],elimin:24,energi:31,ensembl:10,entropi:[9,35],environ:[0,15,31],equat:[0,2,12,31,32,33,35,36,38],error:[0,10,31,32,34],essenti:31,estim:[33,34],et:21,etc:31,euler:2,evalu:[1,26,38,39],exampl:[0,1,2,3,4,6,7,8,9,10,21,31,32,33,34,35,36,37,38,39],exercis:[0,6,15,16,17,18,19,20,21,22,31,32,34],expect:[18,28,33,34],expens:34,experi:28,explor:[0,15,16,31],exponenti:2,express:[17,18,31,32,35,36],extend:[35,36],extrapol:4,extrem:[10,31],ey:10,f:[25,26],fall:29,famili:[1,31,32,39],famou:24,fantast:32,featur:[9,24,32],feed:[1,12,37,38,39],find:[34,36,37],fine:[1,39],first:[4,12,26,31,32,33,35,36,38],fit:[0,10,31,33],fix:32,flow:39,fold:[34,35],forc:3,forest:10,format:[25,26,31],forward:[1,2,12,37,38,39],fourier:3,frank:[6,25,32],freedom:[0,32],frequent:32,frequentist:[0,31],fridai:35,from:[5,10,12,21,26,32,33,34,35,36,37,38],full:[2,38,39],funtion:39,further:[3,5,32],g:25,gan:4,gate:[37,38,39],gaussian:24,gd:[13,21,36,37],gener:[4,9,31],geometr:[11,35,36],get:21,gini:9,good:[0,31],goodfellow:21,grade:[29,31],gradient:[1,2,10,13,21,26,35,36,37,39],grid:35,group:35,growth:2,ha:23,handl:[24,31,32],happen:[33,34],have:31,heard:31,hessian:[32,35,36],hidden:[2,39],histogram:34,homework:[35,36],hous:[0,32],how:35,hyperbol:[37,38],hyperparamet:[1,38,39],hyperplan:8,i:[1,39],id3:9,idea:11,ideal:[35,36],ident:[33,34],identifi:34,ii:31,iid:[33,34],illustr:[33,37,38],implement:[1,38,39],implic:[5,32],improv:[1,36,38,39],includ:[13,21,35,36,37],increment:11,independ:[33,34],index:9,inform:29,input:2,instal:[23,25,31],instructor:29,intercept:32,interpret:[5,11,31,32,33,34,35,36],interv:34,introduc:[11,13,21,32,36,37],introduct:[0,6,23,24,25,26,31,37,38,39],invers:[5,24,33],invert:32,iter:[10,36],its:32,jacobian:32,jax:[13,21,36,37],job:[37,38],julia:31,jungl:10,k:[34,35],kera:[1,3,39],kernel:[8,11],l:38,lagrangian:8,lambda:35,lasso:[5,6,25,32,33,34,35],last:[32,34,35,37],later:[5,32],layer:[1,2,3,12,38,39],learn:[0,1,2,11,13,14,15,16,21,23,25,26,31,32,33,34,35,36,37,38,39],least:[5,6,18,25,31,32,33],lectur:[31,32,33,34,35,38,39],level:10,librari:[23,31],likelihood:[7,33,34,35],limit:[1,13,28,34,35,36,37,39],linear:[0,8,13,24,26,31,32,33,35],link:[5,11,27,30,32,33,34],literatur:[25,26],logist:[7,26,31,35,36,37,38,39],loop:[36,37],loss:[32,35,36],lu:24,machin:[0,8,13,23,25,26,31,35,36],made:[33,34],mai:31,main:28,make:[0,9,10,15,16,31,32],mani:[10,12,38],manipul:32,margin:[33,34],mass:31,materi:[27,31,32,33,34,35],math:[5,32],mathemat:[3,5,8,32,36,37,38],matric:[5,24,31,33],matrix:[1,5,11,12,24,31,32,33,35,36,37,38,39],matter:[0,31],max:32,maximum:[33,34,35],mean:[0,31,32,33,35],measur:35,meet:[5,10,28,31,32],mercer:8,method:[6,9,10,13,21,25,34,35,36,37],midnight:[25,26],min:32,mini:[36,37],minibatch:[21,36,37],minim:[31,35],ml:31,mle:[33,34],mlp:[12,38],mnist:[3,4],model:[0,1,4,6,12,31,37,38,39],moment:[36,37],momentum:[13,21,36,37],moon:[8,9],more:[3,6,21,24,25,31,32,33,34,35,36,37,39],multi:[37,38,39],multilay:[12,37,38],multipl:[1,3,38,39],multipli:8,need:[25,31],network:[1,2,3,4,7,12,26,31,35,37,38,39],neural:[1,2,3,4,7,12,26,31,37,38,39],neuron:[37,38],newton:[21,35,36,37],nice:39,noen:[21,36,37],non:8,normal:[0,1,34,39],notat:[12,37,38],note:[21,32,33,34],novemb:26,now:[1,9,13,21,33,34,36,37,39],nuclear:[0,31],nueral:35,numba:31,number:[0,2,21,28,32,36,37],numer:[2,25,26,28],numpi:[21,24,31,36,37],object:[3,38,39],obtain:11,octob:[25,38,39],od:2,off:[6,25],ol:[5,6,21,25,33,34,36,37],one:[2,12,35,36,38],ones:[37,38],oper:24,optim:[1,8,13,23,31,32,35,36,37,38,39],order:[13,21,36,37],ordinari:[5,6,18,25,31,32,33],organ:[0,31],orient:[38,39],oslo:30,other:[4,9,11,12,24,31,32,35,37,38],our:[0,4,5,11,13,31,32,35,36,38,39],outcom:[23,31],output:[2,39],overarch:[0,4,8,9,17,18,19,20,21,22,31,32],overview:[10,31,36,37],own:[0,10,11,15,16,26,31,32],packag:[24,31],panda:[31,32],paper:25,paramet:[31,32,35,36,37],part:[13,23,25,26,32,35,36],partial:2,pass:[1,38,39],pca:11,pdf:28,pencil:25,perceptron:[12,37,38,39],perform:[1,9,38,39],period:3,perspect:[1,39],plan:[32,33,34,35,36,37,38,39],plot:[34,35],point:4,poisson:2,polynomi:[3,33],popul:2,practic:[13,21,29,31,36,37],pre:[1,3,38,39],predict:4,predictor:35,preprocess:32,prerequisit:[3,23,31],princip:11,principl:3,pro:9,probabl:[5,28,33,34],problem:[1,2,13,21,31,32,33,35,36,37,38,39],procedur:[9,31],process:[1,3,38,39],product:[36,37],program:[2,13,25,26,35,36],project:[6,25,26,31,35],prop:[13,36,37],propag:[1,12,38,39],properti:[5,28,32,35],python:[0,9,15,23,24,31],quick:8,r:31,random:[10,11,28,35],raphson:[35,36],rate:[21,36,37],read:[9,31,32,34],real:[6,25,31],recommend:[31,32,36,37],rectangular:33,recurr:[4,12,37,38],recurs:[36,37],reduc:[0,32],reduct:3,reformul:2,regress:[0,5,6,7,9,10,13,17,18,25,26,31,32,33,34,35,36,37,38],regular:[1,35,38,39],relat:32,relev:[30,32,34,35,37,38],relu:[1,39],remark:3,remind:[6,8,31,35,36],repeat:32,replac:[13,36,37],report:[25,26],repositori:34,repres:[38,39],requir:[2,23],resampl:[6,25,33,34],rescal:[6,33],residu:32,resourc:2,result:[32,33],review:39,revisit:[13,35,36],rewrit:[31,32,34],rewritten:35,ridg:[0,5,6,17,18,25,32,33,34,35,36],rm:[13,36,37],rmsprop:[21,36,37],rule:[12,38],s:[8,10,21,34,35,36,37],same:[13,21,34,36,37],sampl:11,scale:[32,34],schedul:[27,31],schemat:9,scheme:2,scienc:31,scikit:[0,1,11,15,16,31,32,33,34,35,36,38,39],search:35,second:[13,21,36,37],select:35,semest:29,sensit:[35,36],septemb:[33,34,35],session:33,set:[0,2,3,9,12,15,31,32,35,38,39],sgd:[13,36,37],should:[1,39],sigmoid:39,similar:[13,21,36,37],simpl:[0,4,9,13,31,32,33,35,36,37],singl:[10,37,38],singular:[5,11,17,32],size:32,slightli:[36,37],soft:8,softmax:[1,38,39],softwar:[25,31],solv:[2,33,35,36],solver:13,some:[13,24,31,32,35,36],specifi:2,split:[0,15,16,31,32],squar:[0,5,6,10,18,25,31,32,33],standard:[13,32,34,36],start:[21,37],state:[0,31],statement:31,statist:[5,6,23,28,31,33,34],steepest:[10,13,35,36],step:[26,34,35,36,37],still:32,stochast:[13,21,26,28,36,37],stop:[36,37],strongli:31,studi:35,subtract:32,suggest:31,sum:34,summari:[29,31,37],superposit:3,supervis:[1,39],support:8,svd:[5,32,33],syntax:[36,37],systemat:3,t:[32,33],taken:21,teach:[27,29],teacher:[29,31],technic:33,techniqu:[6,11,25,33],technolog:23,tensor:39,tensorflow:[1,3,39],tent:31,term:[34,38],test:[0,1,15,16,26,31,32,33,38,39],textbook:[30,31],than:[35,36],thei:31,theorem:[5,8,11,12,28,33,34,38],theori:28,thi:[17,18,19,20,21,22,31],think:32,thursdai:[32,33,34,35,38,39],time:[36,37],tip:[13,21,36,37],togeth:[12,38],tool:31,top:[1,39],topic:31,toward:11,trade:[6,25],tradeoff:[6,34],train:[0,1,4,15,16,31,32,38,39],transform:3,tree:[9,10],tuesdai:33,tune:[1,39],two:[3,8,23,25,32,35],type:[2,4,12,31,37,38],uio:31,understand:34,univers:[12,30,38],unsupervis:14,unsupport:[36,37],up:[0,2,9,12,15,21,31,32,34,35,38,39],us:[0,1,2,3,7,13,21,23,26,31,32,35,36,37,38,39],usag:[33,34],valid:[6,25,34,35],valu:[5,11,17,18,28,32,33,34,35],vari:[21,36,37],variabl:[28,35,36],varianc:[6,25,33,34],variou:[0,15,26,31,34,35],vector:[8,12,24,31,32,37,38],veri:39,video:[36,37],view:[0,4,10,32],visual:[1,9,38,39],vs:3,wai:[9,21,34],warm:21,wave:2,we:[21,31,36,37,39],websit:39,wednesdai:33,week:[15,16,17,18,19,20,21,22,31,32,33,34,35,36,37,38,39],weekend:35,weekli:[27,34],weight:[38,39],what:[0,31,32,33,34],when:[36,37],which:[1,21,36,37,39],why:[31,32,34,37,38],wisconsin:[7,35],wrap:[32,34],write:[4,11,26,33],x:[32,33],xgboost:10,xor:[37,38,39],yet:33,you:31,your:[0,10,15,16,26,31,32],yourself:35,z_j:38}}) \ No newline at end of file +Search.setIndex({docnames:["chapter1","chapter10","chapter11","chapter12","chapter13","chapter2","chapter3","chapter4","chapter5","chapter6","chapter7","chapter8","chapter9","chapteroptimization","clustering","exercisesweek34","exercisesweek35","exercisesweek36","exercisesweek37","exercisesweek38","exercisesweek39","exercisesweek41","exercisesweek42","exercisesweek43","intro","linalg","project1","project2","schedule","statistics","teachers","textbooks","week34","week35","week36","week37","week38","week39","week40","week41","week42","week43"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["chapter1.ipynb","chapter10.ipynb","chapter11.ipynb","chapter12.ipynb","chapter13.ipynb","chapter2.ipynb","chapter3.ipynb","chapter4.ipynb","chapter5.ipynb","chapter6.ipynb","chapter7.ipynb","chapter8.ipynb","chapter9.ipynb","chapteroptimization.ipynb","clustering.ipynb","exercisesweek34.ipynb","exercisesweek35.ipynb","exercisesweek36.ipynb","exercisesweek37.ipynb","exercisesweek38.ipynb","exercisesweek39.ipynb","exercisesweek41.ipynb","exercisesweek42.ipynb","exercisesweek43.ipynb","intro.md","linalg.ipynb","project1.ipynb","project2.ipynb","schedule.md","statistics.ipynb","teachers.md","textbooks.md","week34.ipynb","week35.ipynb","week36.ipynb","week37.ipynb","week38.ipynb","week39.ipynb","week40.ipynb","week41.ipynb","week42.ipynb","week43.ipynb"],objects:{},objnames:{},objtypes:{},terms:{"0":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,23,25,26,27,29,30,32,33,34,35,36,37,38,39,40,41],"00":[0,1,5,6,9,11,32,33,36,39,40,41],"000":[1,3,39,40,41],"0000":9,"00000":9,"000000":[5,11,32,33],"00000000e":[5,33,36,39],"0000164":21,"000054":32,"0000747":21,"0001":[1,17,39,40,41],"0001042":[],"0001225":33,"00012934":[],"00015239":[],"0001539814498783133":[],"00016826":[],"00018647":[],"00019432":[],"00019883":[],"00019998":5,"00020665":[],"00021438167895478945":[],"00022035":[],"00022902":[],"0002364":[],"0002382102844775691":36,"00024087":5,"0002442":[],"00025381":[],"00027064":[],"00028129":[],"00029012":5,"00029993":[],"00031174":[],"00031535148309577417":6,"00031535148309580783":6,"00033136014047192484":9,"0003324":[],"00034548":[],"00034944":5,"00036838":[],"00038288":[],"00040825":[],"000417932":2,"00042089":5,"00042432":[],"00045244":[],"000464088":2,"00047025":[],"00048049":[],"00048325":[],"00050142":[],"00050694":5,"00052115":[],"00053008":[],"0005557":[],"00057757":[],"00058016":6,"00060705":6,"00061058":5,"00061585":[],"00062595":6,"00063364":35,"00063862":35,"00064009":[],"0006527":[],"00066668":6,"00067395":[],"00068088":35,"00068251":[],"00068734":6,"00068946":6,"00070937":[],"00072412":[],"00073541":5,"00075597":35,"00075639":[],"00076495":6,"00076617":33,"00076905":6,"0007698473260556325":6,"0007698473260556343":6,"00078616":[],"00079129":6,"00079910":35,"00079968":5,"00081564":[],"00083346":35,"00083826":[],"00084705":6,"00085889":6,"00086063":33,"00087126":[],"00087697":6,"00088573":5,"00089187":35,"00090992":33,"00091628":[],"00092647":6,"000929":[],"00092904":35,"0009485400848532":[],"00096314":5,"00096557":[],"001":[1,2,8,13,17,36,37,39,40,41],"00100519":6,"00102956":[],"00104613":[],"0010479245926411787":[6,35],"00105081":6,"00105497":[],"00106677":5,"00107008":[],"00107405":6,"00111756":6,"00114101":[],"0011526":6,"00115506":33,"00115669":33,"00115999":5,"00117627":[],"00118508":6,"00118591":[],"00119699":35,"00125459":21,"00126452":[],"00128479":5,"00131428":[],"001323":6,"00134327e":[],"00137818":6,"00139705":5,"00140139":[],"00140849":35,"00143234":21,"00145652":[],"00148047":21,"00148709":[],"00149311":6,"00149956":6,"00152117":6,"00154733":5,"00154860":35,"00155308":[],"00156376":6,"00161414":[],"00163526":21,"00168251":5,"00169021":21,"00170724":[],"00172117":[],"00172452":[],"00174276":6,"00175331":6,"00178871":[],"00182747":33,"00183398":33,"00183869":[],"00186347":5,"00186362":[],"00186694":21,"001880":5,"00190742":[],"00192967":21,"00198187":[],"00199495":[],"00200":8,"00202624":5,"00202679":[],"00202756":6,"00203959":[],"00211371":[],"00213144":21,"00217499":6,"00219194":35,"00219502":[],"00219624":[],"00220306":21,"00224413":5,"00225484":[],"00225909":[],"00228742":6,"00229911":[],"00234197":[],"0023548":6,"002381316302584886":6,"0023813163025848865":6,"00242398":[],"00242847":[],"00242954":35,"00242999":6,"00243186":6,"00243341":21,"0024401":5,"00245177":[],"0024598":[],"00249435":6,"00249831":[],"00251517":21,"00254359":33,"00259385":[],"00266858":2,"00267887":[],"00270244":5,"00272586":[],"00274989":6,"00277816":21,"00283853":33,"00286972":[],"00287151":21,"00289724":6,"0029114":[],"00292838":[],"00293132":[],"00293838":5,"0030207":[],"00305172":[],"003100":32,"00310113":2,"00312361":6,"00313452":21,"00313577":[],"00315593":6,"00316561":[],"00317175":21,"0032153180657605116":[6,35],"00323332":6,"00324512":[],"00324969":[],"0032542":5,"00325450":35,"00327833":21,"003301":6,"00334743":[],"00335448":[],"00335936":[],"0033955154592040923":[6,35],"00341073e":[],"00346394":[],"00348543":32,"00353575":33,"00353823":5,"00354492":[],"00358844":[],"00359612":[],"003620":32,"00362111":21,"0036237":6,"0036367":6,"0036718":33,"00369758":6,"00370554":[],"0037095":[],"00374279":21,"00375475":[],"003755":[],"00379522":[],"0038332550504751595":36,"0038335":6,"00383872":[],"003909404072811221":[6,35],"00391839":5,"00392139":[],"00396398":[],"00398509":[],"0039987":6,"004":[5,34,35],"004091940707753925":[6,35],"00410387":6,"00410478":6,"00410646":[],"00411073":[],"004113634617443131":[6,33],"00411363461744314":[6,33],"004113634617443147":[6,33],"00413413":21,"0041559863458613296":[6,35],"00420072":35,"00424046":[],"00424909":2,"00424967":6,"00426027":5,"00426531":[],"00427304":21,"00431775":25,"00433417":11,"00439287":[],"00440346":6,"00440395":[],"00441613":[],"00443743":6,"00445655":11,"00446979":[],"00447992":11,"004480":11,"00451679":[],"00453622":[],"00455536":[],"004579219539673834":[6,35],"00458878":6,"00460304":[],"00460405":33,"004610275230656182":[6,35],"00462287":6,"00463639":33,"00465099":35,"00469926":[],"00471782":5,"00471983":21,"00472199":6,"00472512":6,"00472549":[],"00474485":[],"00478655":[],"00480366":[],"00480371":[],"0048526":[],"00487843":21,"0048938":[],"0049544":6,"004999999999999994":[],"005000000000000001":0,"00502702":[],"00504808":[],"00512927":5,"00517114":6,"00519105":[],"00526348":6,"0053018":6,"00537764":[],"00538851":21,"00542313":[],"00550379":33,"00552246":33,"00554552":6,"00555311":[],"00556826":6,"00556958":21,"0055941":[],"00562524":33,"0056799":5,"00569405":33,"00575271":[],"00579953":6,"00584432":33,"00588657":6,"00594042":[],"00595615":[],"00598615":[],"00600971":[],"00607783":6,"00610607":33,"00611979e":[],"00613258":[],"00615193":21,"00615394":[],"006162":6,"00617499":5,"00619918":[],"00620347":[],"00626773":33,"00627535":[],"00630331":6,"00631057":[],"00635475":[],"00635865":21,"00642221":6,"00642268":[],"00642935":[],"00644939":33,"00646613":[],"00651112":[],"00658316":[],"00660427":6,"00663699":[],"00665974":[],"00669662":[],"00672607":6,"00673407":6,"00676387":6,"00679797":[],"0068011":6,"00680794":[],"006829400694106674":[],"00683748":5,"00683964":6,"00686806":[],"0068697":[],"00687175":[],"0070235":21,"007024126888938144":[6,35],"00703355":[],"00704231":[],"00712321":[],"0071642501586093735":[],"00719176":6,"0072595":21,"00726135":33,"0072675":[],"00727211":[],"00727646693":[0,32],"007315":[32,33],"00736955":[],"00738008":[],"00739382":33,"0074331":5,"00753349":[],"00754534":[],"00759119":6,"007607459165915922":33,"00761275":[],"00769731":[],"00777931":[],"007785":[],"00778523":[],"00781918":35,"00784393":6,"00788598":[],"007891914573161948":[],"00798188":33,"00798988":[],"00799998":[],"00801855":21,"00803064":6,"00805074":35,"00805892":[],"00813803":6,"00817631":6,"00817834":[],"00823002":5,"00825399":33,"00827728":6,"00828799":21,"00830822":[],"00831018":6,"00832189":[],"00834567":6,"00843617":[],"00844667":[],"00848904":6,"00851512":[],"00857028":33,"00858536":[],"00862101":[],"0086649156":[0,32],"008675369724975977":5,"00868983":[],"00880924":33,"008897354602673473":33,"00890232":[],"00894639":5,"00905423":6,"00906293":[],"00915433":33,"00915458":21,"009163470508352218":5,"009164545680330616":[6,35],"00917248":6,"00920609":[],"00922229":[],"00923278":33,"00929251598272297":[],"00934327e":33,"00934499":6,"00934865":[],"0093869":[],"009442796383765939":33,"00946219":21,"00946636":33,"00952322":[],"00952586":[],"0096208":6,"00976647":[],"009855809602167547":[],"00986552":[],"00989896":[],"00990475":5,"00992331":6,"00996754":6,"01":[0,1,2,5,6,9,11,13,17,21,31,32,33,35,36,37,38,39,40,41],"010018312644139219":[6,35],"01004321":[],"01006401":[],"0100706":6,"0100949":33,"01018743":[],"01023308":21,"010315":11,"01031541":11,"010331721306655165":[6,35],"01033856":[],"01035984":[],"01038358":[],"01045155":21,"01045774":33,"01050849":[],"010516485576646504":[6,35],"0105301":33,"01054509":33,"0105536":[],"01059601":33,"0106014":[],"01066519":6,"01066976":[],"01068907":33,"01076611":5,"01076733":[],"01080274":21,"01089797":[],"0109":[],"010902":32,"01094846":[],"01097423":[],"0110":29,"01103246":[],"01107621901137467":[6,35],"01112952":[],"011225":2,"01128968":[],"01130932":[],"0113104":6,"01135167":[],"01148039":[],"01161357":33,"01164198":33,"01165807":[],"01176096":33,"01179792":6,"011917343246903285":[],"01191824":5,"01193226":21,"012073649469946107":[6,35],"0120771":[],"01214101":[],"01219292":6,"01222822":33,"01223198":6,"01229732982000352":29,"01231917":6,"01233322":21,"01233332":[],"01247118":[],"01257265":[],"01265755":33,"012658":33,"01267006":[],"01268892":[],"01272215":[],"01288591":[],"01289962":33,"01290811e":[],"01290947":6,"01291943":[],"01295356":5,"01300561":[],"013121574062587286":[6,35],"01318643":6,"013341":[],"01335857":33,"01344196":[],"01347636":[],"01347916":6,"01348565":6,"01362274":21,"013623165903312745":[],"01362461":[],"01365363":33,"01366733":[],"01367553":6,"01372375":[],"01382052":[],"01389847":33,"01397146":6,"01405935":6,"01408051":21,"01409821":[],"01416528":6,"01420034":[],"01424197":[],"01427149":[],"01432847":[],"01433809":5,"014436800088896381":[6,35],"01448147":33,"01449782":6,"01455922":25,"01456159":33,"01458337":6,"014586":33,"01458611":33,"0146081":6,"01463049":6,"01463052":[],"01476097":33,"01477821":[],"01478446":[],"01492":[],"0149713":33,"01502518":[],"0150723888951771":6,"01507238889517717":6,"01508632":[],"01508966":[],"01514564":[],"01521658e":[],"01524072":33,"015244":33,"01526688":[],"01529503":[],"01529708":33,"01531845":6,"01537557":[],"0154222":[],"01542292":35,"01544605":[],"01549377":6,"01549939":35,"01550546":35,"01552289":[],"01555268":21,"01558197":5,"01562311":[],"01566461":[],"01580414":33,"01581562":[],"01591021":33,"01594452":35,"01596986":33,"01600491":[],"01603602":[],"01607534":21,"01616709":33,"01619664":[],"016285782696017142":[6,35],"01633169":[],"01633913":6,"01640891":6,"01655318":6,"016587414993045335":[6,35],"01663866":[],"01667827":[],"01671556":[],"01678384":[],"01691871":[],"01691985":6,"0169643":5,"016972818397989375":25,"01704432":[],"01708691":33,"01708781":6,"01708852":6,"01713366":6,"01722502":[],"01724499":5,"01731293":[],"01735584819559331":[6,35],"017355848195593312":[6,35],"01747077":[],"01762067":[],"01765474":[],"017665":5,"01775594":21,"01783414e":33,"01809873":[],"018232":[32,33],"01831050e":6,"01831207e":6,"01835274":21,"01859922":[],"01865187e":[],"01866537":6,"0186893":[],"01873344":11,"01873869":5,"01881546":[],"01882522":[],"01896127":33,"01897575":[],"01898855":6,"01899119":[],"01905883":6,"01908936":6,"019140656913589":[],"01914066":[],"01916913":[],"0191717":33,"01918548":[],"01919702":[],"01931743":[],"01936105":[],"01963203":33,"01963611":6,"01969145":6,"01975416527168255":[6,35],"01975848":6,"01989299":[],"01989549":[],"01999282":[],"02":[0,4,6,7,12,32,36,38,39],"0200568":[],"02017377":33,"02024701e":[],"02024962":6,"020271":21,"020404272938413143":[],"02044454":[],"02054837e":6,"02061026":[],"02061094":[],"02066371":33,"02068067":6,"02071142":[],"0207306":[],"02073509":5,"02075115":33,"02079171":[],"02081274":33,"02083512":33,"02089297":33,"02095266":21,"02098261":6,"02103178":33,"02109939":33,"02123176":6,"0212604":[],"02126208":[],"02138725":[],"021592704588021174":[6,35],"021592704588021178":[6,35],"02178583":[],"02183021":[],"02186131":[],"02198702e":6,"02198703e":6,"02208512":6,"02215597":[],"022210866177877393":32,"02228115":6,"02229529":6,"02231445":[],"02252765":5,"02276062":32,"02279888":33,"02284019":[],"02287894":[],"02288816":[],"022999498260366198":[6,35],"02308518":[],"02314144":21,"02329285":33,"02348765":6,"02355925":[],"02365049":6,"02385515":33,"02392053":21,"02400359":[],"02416381":[],"02424794":35,"02447466":[],"0245528":6,"024632":33,"02468681":[],"02485679":33,"02492265":5,"02498832":6,"025027":[],"02503753":6,"02507163":32,"02509184":11,"025092":11,"02511518":6,"02522069":6,"02531037":[],"02536494":[],"02542246":[],"02546675":35,"025709":[11,33],"02574735e":[],"02582613386840159":29,"02586427":6,"02588522":33,"02593026":[],"0260906":6,"02610528":[],"02618169":[],"02622906":[],"026250840755899812":[],"02625193":8,"02635835":[],"02641575":21,"026605727637184554":[6,35],"026605727637184558":[6,35],"02702978":[],"02707227":5,"02723445":6,"02730775":21,"02745507":33,"02757522":33,"02760977349102238":[6,35],"027609773491022394":[6,35],"02761736":[],"02763182":33,"02764023":[],"02790465":[],"02804715":[],"02809859":[],"02816083":33,"028389":[],"02838933":[],"02845284":[],"02857":4,"02881357":33,"02892224":[],"029":[],"02912421":33,"02942218":33,"02944425":[],"029483":5,"02950229":33,"0296969":[],"0297291":33,"029733":[32,33],"02976145":6,"02992852":[],"02994311":5,"02f":[6,26],"03":[1,6,33,36,39,40,41],"0301458":21,"03025391":[],"03032441e":6,"03049638":32,"03060273":[],"03061555":25,"03063575":[],"03065428":[],"03074083":[],"03077640549":4,"03099776":5,"031":[5,34,35],"03107818":[],"03113051":[],"03117156":21,"03119091":[],"03172365":[],"03195835":[],"03196357":6,"03203047":[],"03251863":5,"03256632e":[1,39,40,41],"03267527":6,"03279636":6,"0330308045183219":6,"0330308045187757":6,"03308408":5,"03321947":32,"03338173":[],"03365768507152769":[6,35],"03370315":[],"03376827":33,"033790755027115954":[],"03389964":[],"034047":32,"034169230664804":[],"03438051":21,"03443175":[],"03447512":6,"034557":33,"034985":33,"03543039":[],"03543455":[],"03543958":[],"03557316":21,"03562355":6,"03568439":6,"035909":32,"0359565":5,"03616508":[],"03630548":6,"03633213":33,"0366352614656884":[],"03707133":11,"03717939":[],"03727597":[],"03728183e":[],"03735403":[],"0374748":[],"03774822e":[],"0377961":32,"03781367141738902":[6,35],"03813208":[],"03814292":6,"03815288":6,"038211969489939":29,"03821197":29,"038300":[11,33],"03856554":[],"03868779":[],"03894328":[],"03894873":33,"039":[],"039039":5,"03903968":33,"03908546":[],"03914571":21,"03935519":[],"03946221":[],"03982972":33,"039967668952797":6,"0399676689527975":6,"04":[1,6,11,36,39,40,41],"040102":5,"04010697":6,"04014929":[],"0401585":[],"04057027":21,"04058784":[],"04063602":6,"04084872":[],"041":9,"04103307":33,"041050166905828786":[],"04107874":5,"041079":5,"04111096":[],"0411487294305088":6,"041148729430523":6,"04191629":[],"04193203":33,"04198166":33,"042044382097756156":[],"04214702":33,"04218461":[],"04220758":6,"04223754":[],"04225015":[],"04259402":[],"04276619":[],"04292593":[],"04295757":35,"043":9,"04310095":[],"04314342":[],"04315108":5,"0431531":[],"04346721":5,"04355837":6,"04362":9,"04362755":[],"04372783":[],"0437499":2,"04389027":6,"04423486":6,"04426647":[],"04426744e":33,"044334":[32,33],"04438319":21,"04448923":[],"044613":6,"0447389":[],"04478101":33,"04537385":6,"04543942":6,"04547353":[],"04555073":[],"04566964":6,"04574692":[],"0458":9,"04581197":25,"04584982e":[],"04597076":21,"04619338":21,"04648335":5,"046531":[],"04662395":33,"04669463":[],"04683565":5,"04690007":[],"04720848":[],"04746791":33,"04778116":[],"04784395":6,"04816611e":[],"04818727730430286":[6,35],"04822955":33,"04828291":0,"04869126e":[],"048920":32,"04892055":6,"0489354":[],"04899609":33,"04909093":6,"04912436":6,"04926746":35,"049462":32,"049556996627824":6,"0495569966278269":6,"04956816":32,"0496375":[],"04977051":21,"04it":6,"05":[1,4,6,13,26,33,38,39,40,41],"05009826":6,"05024857":[],"05056463":[],"050663":[],"05066303":[],"05091289":[],"05100875":6,"0510594":25,"05126901":[],"051418":5,"051649":[11,33],"0517473":5,"05183886":[],"05227921801205679":[6,35],"052305":33,"05234611":[],"0523738":21,"05238712":[],"05263":9,"0526992":25,"052992":[],"05302":9,"053417":33,"05357244":[],"05364854":8,"05383795":6,"053849":5,"053944":[],"05412502":[],"05419212":21,"05432856":[],"054375":[],"05446143":[],"05447415":6,"05459089":[],"054617":33,"054655":33,"054954":[],"05505310046363":2,"05515143e":[],"05526765":33,"05533":9,"05544019":[],"055676":[32,33],"055697":11,"055734":33,"055910":33,"055987":33,"05599455":[],"056019":11,"056030":[],"05614483":5,"05623":9,"056418":11,"05648":9,"05651951":6,"05667":9,"056683":33,"056898":11,"057124":[],"05715377":11,"057154":11,"05716368155342902":[6,35],"057179":[],"057219":[],"057231":11,"057300":33,"057361":11,"057393":33,"057406":[],"057418":33,"057457":33,"057462":11,"057502":11,"057613":11,"057657":11,"057722":33,"05781491e":[],"057831":11,"057835":33,"05785343":6,"057864":11,"05789007":6,"05792524":[],"05796251":6,"05807125":6,"058121":11,"058216":11,"0582573":[],"05825965":[],"05834444":33,"058388":11,"058435":[],"05852973":[],"058552":33,"058556":[],"058567":11,"058645":33,"05873105":21,"058738":[],"05880359":29,"05883":9,"05884":9,"058854":33,"058921":11,"058952":33,"058996":33,"059004":11,"05900655":21,"059031":33,"059182":[],"059427":[],"059439":11,"05966593":[],"059736":[],"05977068":33,"059807":33,"05982961":[],"059830":[],"05989727":[],"059949":11,"059951":33,"05999":9,"059993":33,"06":[6,33,37,38],"060001":[],"060037":[],"060083":33,"06020587":6,"060254":33,"06026294":[],"060278":[],"060300":[],"060334":[],"060349":32,"060387":[],"06043581":6,"060567":[],"060716":33,"06072551":[],"06075426":[],"060756":33,"060872":33,"061013":[],"061034":[],"061084":[],"061092":[],"061138":11,"061163":33,"061239":[],"061264":[],"061281":11,"061359":33,"061443":33,"061452":33,"061484":11,"061614":33,"061642":[],"061679":32,"061747":11,"061775":[],"061813":11,"061826":11,"061833":11,"061836":[],"061869":11,"061888":11,"061915":[],"06200174":5,"062016":33,"062071":11,"062082":[],"062082386342319454":[6,35],"062100":[],"062221":[],"062273":11,"062292565":4,"06231773":[],"062337":33,"062351":[],"062390":11,"062470":[],"062523":11,"062599":33,"062624":33,"062631":11,"062675":11,"062749":[],"062797":[],"062852":11,"062874":33,"062894":11,"062963":11,"062967":[],"06299237e":[],"063000":[],"06301519":25,"063019":33,"063055":[],"063061":33,"06307625":[],"063080":33,"063081":[],"063159":11,"0632":[],"063260":33,"06331463":[],"063325":[],"063359":11,"063407":[],"063434":11,"063436":[],"063443":32,"063597":11,"063653":33,"063716":[],"063722":11,"063723":11,"063724":32,"063747":11,"063760":[],"063822":[],"063832":[],"063894":33,"063905":11,"063912":[],"063927":[],"06394871":21,"063953":5,"06397412":[],"063980":5,"063982":[],"06406913":25,"06407201":[],"064074":33,"064101":5,"064134":11,"064145":11,"06424868":21,"064294":[],"064320":5,"064412":[],"064420":[],"06444":9,"064444":11,"064501":33,"064527":11,"064532":[],"06453579006728322":[6,35],"064602":[],"064606":33,"064609":33,"064634":[],"064640":5,"064696":11,"064699":33,"064793":33,"06481015":[],"06484621":38,"064856":[],"064874":[],"06488406":[],"064896":5,"06491736":6,"064938":5,"064948":5,"064987":[],"065006":[],"065026":32,"065069":5,"065077":33,"065089":[],"06511966":[],"065158":[],"065214":[],"065215":11,"065249":[],"065289":5,"065378":33,"065390":33,"065410":33,"06547790180152352":[6,35],"06547790180152355":[6,35],"065517":[],"065582":11,"065588":[],"065593":11,"065614":11,"065645":11,"065735":11,"06578047":[],"065801":[],"065808":11,"065815":[],"065872":[],"065910":[],"065982":[],"066042":[],"066066":33,"066077":[],"066344":[],"06637":9,"06638817":[],"06642248":[],"066438":[],"066453":[],"066467":11,"066474":33,"066500":33,"066612":33,"066647":33,"06664867":[],"06666117":[],"0666807":2,"06668613e":[],"066762":[],"066768":11,"066787":33,"066804":[],"06682268":[],"0668226833598415":[],"066837":[11,33],"066854":33,"066870":11,"066992":11,"066999":33,"067009":[],"067139":11,"06724062":5,"067315":11,"067328":[],"067409":[],"067419":[],"067420":5,"067437":[],"067440":[],"067457":5,"067591":5,"067611":[],"067630":[],"067637":33,"067660":5,"067707":33,"067745":[],"067748":[],"067820":5,"067826":[],"067832":[],"067915":[],"067955":5,"067979":[],"068":[],"068082":11,"068083":[],"068141":5,"068241":[],"068257":11,"068264":33,"068307":33,"068340":5,"068403":[],"068406":11,"068407":5,"06842111e":[],"068441":33,"06844519414009444":[6,35],"06844519414009445":[6,35],"06853772":[],"068551":11,"06855126e":[],"068606":[],"068629":33,"068650":11,"068727":33,"068734":[],"0687531":[],"068757":[],"068815":5,"068816":[],"068906":33,"068945":5,"068974":[],"068987":[],"068997":11,"069028":33,"069033":[],"069055":[],"06915522":[],"069213":[],"069257":[],"069296":[],"069320":11,"069365":[],"069384":[],"069388":[],"069452":33,"069522":11,"069570":5,"069584":[32,33],"069594":[],"069629":[],"06962991":21,"069630":[],"069634":5,"069739":[],"069746":[],"069766":[],"069803":[],"069822":[],"069939":[],"06995653":21,"06it":6,"07":[6,33],"070009":11,"070042":[],"07004211":[],"070043":[32,33],"070067":[],"070107":[],"070146":33,"070157":[],"07016":9,"07017":9,"07020234":[],"070213":33,"070220":[],"070228":[],"070275":[],"07039":9,"070406":5,"0704374681593734":11,"070441":[],"070457":33,"070461":11,"070569":[],"070582":33,"070597":[],"07062318":6,"070645":11,"070694":11,"070737":33,"070769":[],"070795":[],"070811":[],"070889":[11,33],"070964":11,"070986":33,"071062":[],"071138":[],"07115":9,"071191":[],"071252":11,"071258":[],"0713":[0,32],"07130734":[],"071323":5,"07136324":[],"07139233":[],"071423":[],"07145103":11,"071452":[],"071498":[],"071554":[],"071579":5,"07160048164232538":[6,35],"0716004816423254":[6,35],"071601":5,"071611":[],"071662":5,"071685":5,"071726":5,"071773":[],"071788":[],"071792":5,"071801":[],"071805":5,"071872":[],"071879":[],"07188255":[],"071942":11,"071951":5,"072000":[5,33],"072009":[],"072022":5,"072098":[5,11],"072111":33,"072128":[],"072132":33,"072168":[],"07226292":[],"072285":11,"072305":5,"072310":[],"072369":[],"072404":[],"072410":5,"072476":33,"072483":11,"072486":5,"072495":5,"07250301":29,"072621":33,"072624":[],"072637":5,"072707":5,"072790":[],"072805":[],"072830":[],"07285":3,"07286416":[],"072914":[],"072931":[],"072953":[],"072967":5,"072973":5,"073008":[],"073059":5,"073079":5,"073080":5,"073088":[],"073152":[],"073184":5,"073187":5,"07321674":[],"07331468":[],"073354":[],"073362":[],"073376":5,"073387":5,"073406":5,"073421":5,"073422":[],"073444":[],"073445":[],"073465":5,"073471":5,"073476":5,"073494":[],"073498":5,"073541":[5,11],"07358383":[],"073586":5,"073598":[11,33],"073618":5,"073630":[],"073634":[],"073640":11,"073644":33,"073708":[],"073712":5,"073716":[],"073720":11,"073728":[],"073797":5,"073802":11,"073840":5,"073853":[],"073858":[],"073972":[],"073980":[],"073984":[],"07404236":25,"074067":[11,33],"074084":33,"07410236e":[],"074108":5,"074161":5,"07417526":25,"07420079":[],"074201":[],"074210":33,"07421084":5,"074323":33,"074327":[],"074330":[],"074340":11,"074419":[],"074439":[],"074455":5,"074457":[],"074509":[],"0745177":[],"074545":[],"074560":[],"07456491":5,"074577":5,"074686":[],"074708":11,"074772":[],"074780":[],"074879":[],"07490892":6,"074969":[],"074970":[],"075030":11,"075058":[],"075089":5,"075249":[],"075331":11,"075342":[],"075421":11,"075513":[],"075521":[],"075523":[],"075582":[],"075587":[],"075684":11,"075758":[],"075779":[],"07581582":21,"075816":33,"075889":33,"075980":[],"075984":[],"075990":[],"076012":[],"076105":[],"076125":[],"076127":[],"076136":[],"076150":33,"07617146":21,"076249":[],"076266":[],"07627734":[],"076354":[],"07641937":35,"0764924":6,"076504":[],"076527":11,"076587":[],"076592":[],"076662":[],"076721":[],"07678":9,"076820":[],"076825":[],"076833":[],"076857":[],"07692307692307693":9,"076938":[11,33],"076950":[],"076996":[],"077068":5,"07706814":5,"077168":33,"077171":[],"077219":[],"077226":[],"077313":5,"077330":5,"077403":5,"077429":5,"077455":5,"077460":33,"077542":[],"077549":[],"077613":[],"077630":5,"077650":[],"077705":[],"077710":[],"077756":[],"07777777777777778":[1,39,40,41],"077931":5,"078":[],"078029":[],"078041":5,"07804489":33,"078110":33,"078187":[],"07820":9,"078329":[],"078336":33,"078412":[],"07842458":[],"078467":[],"078540":33,"078545":[],"078548":5,"078593":[],"07864":9,"078656":[],"078707":[],"07871":9,"078845":[],"078868":[],"078974":33,"078986":33,"079121":[],"079124":[],"079165":[],"079226":[],"079255":5,"07929472":[],"079381":11,"079432":[],"079434":[],"07944154":[25,32],"079455":[],"079581":[],"0796891867672603":[6,35],"079731":11,"079878":[],"07988085572440823":[],"079882":[],"079946":33,"079948":11,"08":[6,9,29,33,37,38],"080105":[],"080163":[],"080181":[],"080233":11,"080256":[],"080284":11,"08030109":[],"080406":[],"080411":[],"08043851":5,"080473":[],"080502":5,"080505":[],"080571":5,"080607":11,"080616":33,"08066381":29,"080690":[],"080750":11,"080755":5,"080764":33,"08076969085177746":[],"080773":[],"080903":5,"080906":5,"080933":[],"080935":5,"080953":11,"080980":5,"081057":5,"081120":5,"081126":[],"081136":5,"081164":5,"081246":[],"081276":33,"08131003":6,"081466":5,"08156108":6,"081570":[],"081584":[],"08159374":[],"081617":5,"081621":5,"08165104":33,"081655":33,"081677":11,"081679":5,"081680":[],"08174081":[],"081742":5,"081772":[],"081804":5,"08185019":21,"08185315":[],"081896":5,"081916726599974":[],"081955":[],"081960":5,"081976":[],"0819836":[],"082189":[],"082205":[],"08221578":[],"082225":5,"082246":5,"082255":[],"082347":[],"08238863600759742":[],"08245909":[],"082506":[],"08251519":6,"082517":[],"08255129":21,"08256285":[],"082577":[],"082653":33,"08271388":29,"08272096":33,"082746":11,"082760":[],"082781":[],"082875":32,"08293853":21,"08299273e":6,"083000":[],"083066":[],"083096":[],"08318298e":[1,39,40,41],"083317":[],"08333333333333333":[1,9,39,40,41],"08336233266":4,"08339896":25,"083527":[32,33],"08352721390288316":32,"08376632":[6,33],"083766322923899":[6,33],"0837663229239043":[6,33],"083853":[],"08389064":[],"08394792":32,"083988":[],"084075":[],"084076":33,"084207":11,"084247":[],"08426840630693412":[6,35],"08426840630693413":[6,35],"08449894":[],"08455":9,"08474":9,"084764":[],"084809":33,"08481871":[],"084843":[],"085023":[],"08505008":[],"085235":[],"0853136633465326":36,"085391":[],"085454":[],"08551306":6,"08551338":[],"08551625":[],"08576932":6,"08593216":6,"08611111111111111":[1,39,40,41],"086441":[],"086518":[],"08652153831327969":5,"086636":5,"086843":[],"086864":[],"086868":5,"08690":9,"086900":5,"086932":5,"08703034":[],"087247":[],"087250":[],"087271":5,"08728068":[],"087311":5,"08758":9,"087603":[],"087642":[],"08770809":[],"087887":32,"088155":[],"08815506":[],"0881981":5,"08823":27,"08844723450419088":[],"088697":[],"08871404":5,"08881497884574564":33,"08888888888888889":[1,39,40,41],"08902":9,"0892144853354966":36,"08928088":[],"0895387":33,"089539":33,"089710":[],"08973767":[],"08988514":21,"08996":9,"09":[1,33,39,40,41],"09030678":21,"090365":[],"09076319":[],"09149148":[],"09166666666666666":[1,39,40,41],"0917":9,"09172409":6,"09179697e":[],"092":[],"09251":9,"093":[],"09308274":[],"09327269724691106":[],"09336399":[],"093408":[],"09391542":25,"09408163":32,"094082198961999e":6,"0940821989652176e":6,"09444444444444444":[1,39,40,41],"09524714":32,"09527217":[],"09599224":[],"09609807":5,"09726322":[],"09744":9,"09760094":[],"09780":9,"09787053":21,"09791":9,"09832963":21,"09858511":[],"09861229":[25,32],"09903804":8,"09919198949274803":[6,35],"09951287404314545":[1,39,40,41],"0998713":[],"0n":[0,32],"0s":4,"0x10febc640":21,"0x10febcf10":21,"0x1162c32b0":[],"0x1183f2640":13,"0x118c9b1c0":13,"0x118f6d610":[],"0x11ada9670":37,"0x11de12520":[],"0x11df37280":[],"0x11f5f6520":37,"0x11fdbfd60":[],"0x1268ba940":[],"0x127a38670":[],"0x127e425e0":[],"0x13002a640":[],"0x1305bb1c0":[],"0x13eaa7490":[],"0x13ef4e1c0":[],"0x156346610":36,"0x16c9a8880":[],"0x2800bca90":[],"1":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,19,20,21,22,23,25,27,28,29,30,31,34,35,36,37,38,39,40,41],"10":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,17,21,25,26,28,29,30,32,33,34,35,36,37,38,39,40,41],"100":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,21,25,29,30,32,33,34,35,36,37,38,39,40,41],"1000":[0,1,2,4,5,8,11,13,14,21,24,29,32,33,36,37,38,39,40,41],"10000":[2,5,6,10,11,13,29,34,35,41],"100000":8,"10001":10,"1001":[9,29],"1002":29,"1003":29,"10030":9,"10035098":11,"100351":11,"1005":29,"1007":34,"10077114273548984":[6,35],"1009":29,"101058":[],"1011":29,"1013":29,"1013904243":29,"10141413e":6,"1015":29,"10156593":[],"10160394":[],"10188623":[],"102":[3,33],"1023":29,"10230":9,"1024":3,"10247463629935179":[],"10251317e":[],"1026":29,"10268273":[],"1027":29,"103":[1,39,40,41],"1030":29,"10340":9,"10354083919795562":[],"1036131":25,"1037":29,"10378326e":[1,39,40,41],"1038":29,"10391807":6,"10398646080125036":[6,35],"10398646080125037":[6,35],"10399758":[],"1040":29,"10405456":11,"10430":9,"10440776":[],"104411":[32,33],"1047":29,"10479359":25,"10490195":25,"10520":9,"10555555555555556":[1,39,40,41],"10572":35,"10589577":5,"106095":[11,33],"10638925":[],"1063892533225306":[],"106431":32,"10656534":21,"10683216":[],"10706523":21,"10741066e":21,"10776220958055382":11,"1078":35,"10790125813226321":33,"108":[6,9],"10812381":5,"108124":5,"10851799e":21,"1089452":[],"10913":6,"10927588":[],"109276":[],"10931453":6,"10954867e":[],"10959669":32,"10960":9,"10983954":[],"10m":4,"10th":9,"10x":[0,32],"11":[0,2,3,4,5,6,7,8,9,10,11,12,13,15,16,18,21,25,26,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"1100":29,"11007935789924998":25,"1101":29,"11022302e":[5,39],"11022363":[],"11039573e":[],"11078018494378859":[],"111":[1,7,12,36,38,39,40,41],"11100":9,"11112589053037751":9,"11197884":[],"11202337":35,"112383":[11,33],"1124":9,"11352187":[],"11388888888888889":[1,39,40,41],"11390":9,"11400145":32,"11427818":[],"114550":35,"11462415":5,"11482289e":6,"115":35,"11507992e":[1,39,40,41],"11547777218876518":[6,35],"115822":6,"11587186":32,"11590":9,"1160326":21,"11657689":21,"11660":9,"11666666666666667":[1,39,40,41],"117":[8,35],"117430":32,"11744554e":6,"11749517":[],"11780":9,"118":2,"1182":35,"118318":[32,33],"11837308":[],"11837671":[],"1184":4,"11840":9,"11890":9,"11896755":[],"119":2,"11911824":29,"119936":2,"11m":[],"12":[0,1,2,3,4,5,6,8,9,11,12,13,21,25,29,31,32,33,35,37,38,40,41],"120":[2,3],"12011393e":[],"12023635e":[],"1203":9,"1203284":8,"12044974":33,"120450":33,"120508":[],"12050822":[],"1206":8,"121":[8,9,10],"12129289":[],"1213":35,"12155548":[],"1215pm":[30,32],"12182967":6,"122":[2,8,9,10],"12222222222222222":[1,39,40,41],"12224317":[],"122282":32,"123":2,"12318726e":6,"12330033":33,"12333649":6,"123711":6,"12380":9,"124":[0,32],"12400":9,"12417157":21,"12427537":21,"12552073e":6,"12568438":[],"12591227":33,"12594172":[],"126":9,"1261":9,"12618549":5,"12634093":21,"1265":9,"12693357":21,"12695501":[],"127":4,"1271":6,"12765651865754318":5,"1277":6,"12777777777777777":[1,39,40,41],"127812":32,"12790":9,"128":[3,4,13,37,38],"12814914":[],"128664":6,"12871842":33,"129":2,"12921833":[],"1297":9,"1298":9,"129963":35,"12998822":[],"12m":[],"12pm":[30,32],"13":[0,2,4,5,6,9,11,12,13,21,22,23,25,29,32,33,35,36,38,39,41],"130":9,"13003291":6,"13055555555555556":[1,39,40,41],"130694":33,"13069442":33,"13076331":[],"131":9,"13155259":21,"132":9,"13220608e":6,"1326":9,"1326197715":32,"13280":9,"133":[7,36],"13310008":25,"13404683":[],"13410999":[],"134110":[],"13422946e":[],"13444436":[],"1345":35,"1346":35,"135":9,"13535942":6,"13542726":[],"13580759":29,"136236":6,"13646574":5,"13661243e":6,"13679863":6,"1371":6,"13740":9,"137400784702911":33,"13749148e":[],"13756504":21,"13759245e":[],"137652":[11,33],"1377":[3,4],"1378":[3,4],"1379":[3,4],"1380":[3,4],"1381":[3,4],"1382":[3,4],"13821034":21,"13827006":[],"13829298":[],"1383":[3,4],"1384":[3,4],"1385":[3,4],"1386":[3,4],"13865173":5,"138775":[11,33],"1388888888888889":[1,39,40,41],"1388976715362099":[],"13890":9,"1392559585048734e":6,"139255958997547e":6,"13925918083728273":[],"139431112903922":35,"1394311129039245":35,"1395084586525954":35,"1395235273363669":35,"13987729":[],"13m":[],"14":[0,2,4,5,6,8,9,10,11,12,13,21,25,29,31,32,33,38,39,40,41],"140":[2,9],"14021063":6,"14023656":[],"141":2,"14100":9,"1412":[21,37,38],"1416398":6,"14174745":6,"1418":9,"142":9,"14250":9,"14277718e":33,"143":[2,7,36],"1437":[1,39,40,41],"1438149":[],"14389839":29,"14400":9,"1440501043841336":[1,39,40,41],"14421971":25,"14440":9,"1446729567":4,"144993":32,"145":2,"14526269":25,"14549142":32,"146":2,"14629156":35,"146704":[],"14670413":[],"14697721":[],"14710":9,"14722222222222223":[1,39,40,41],"147400":[11,33],"147420":[11,33],"1479":9,"148":[3,4],"148009":[],"14812206":6,"14845":6,"14857":6,"14859":6,"149":[3,4],"149294":[],"149299":[],"14962649":[],"14978631":21,"14g":[6,35],"14m":[],"15":[0,2,3,4,6,7,8,9,12,13,15,16,17,18,21,29,32,35,36,37,38,39,41],"150":[3,4,8,9],"15005476":5,"15047127":[],"15048894":21,"15055258":21,"150726":[],"15098090e":6,"151":[3,4],"15119514":13,"15130074e":6,"1513237":[],"151515":[],"151517":35,"15183857":[],"152":[3,4,9],"15200":9,"1520039":[],"152701":[],"1527777777777778":[1,39,40,41],"153036":[32,33],"15313054":35,"1532465":13,"15383855":[],"15384615384615385":9,"15443469e":36,"15457792":21,"155":9,"15553403":[],"15649598":[],"15673992":[],"15693449e":[],"156956":5,"15697121e":[],"15724663":25,"1575":9,"158":9,"15827078":25,"15863713":[],"1587":9,"1590":9,"15913825":32,"15962297":[],"15975618":[],"15990":9,"15990395":[],"15g":[6,35],"15m":[],"15pm":32,"16":[1,2,3,4,5,6,8,9,10,21,29,32,33,34,35,38,39,40,41],"1600552":[],"1603":3,"16043757":32,"1608179281668718":29,"16081793":29,"16087734":[],"16111111111111112":[1,39,40,41],"16168603e":[],"16211139":5,"16220":9,"162246":5,"16231451":4,"1625":9,"1628":9,"162999":32,"163":2,"16304863":33,"163049":33,"1630775253":[1,39,40,41],"16309331":21,"16342407":5,"16343471":6,"16356503":35,"16384":3,"16385836":21,"16389131":13,"164":2,"16456084":[],"164812":5,"16481217":5,"16492688":25,"165":2,"16500":9,"16521791":[],"16570701":[],"166":[2,9],"16650509":25,"167":2,"16762223e":[],"167787":5,"168":9,"16805821e":6,"16921883":[],"169219":[],"16933554":[],"17":[1,2,4,5,6,8,9,18,21,29,33,35,38,39,40,41],"17006020e":[],"17022089147584388":[],"17078905":25,"1709":9,"17121077":[],"17136288":[],"17138811":32,"17144765665252978":[],"171525":33,"1715252":33,"17174962e":[1,39,40,41],"17222222222222222":[1,39,40,41],"17257288":[],"1726":9,"17275391":[],"173":21,"17300":9,"17305512":[],"1731":9,"17362603":[],"17440757e":[],"17446471":6,"17451":[],"17469167":5,"174692":5,"1752":9,"175300":[32,33],"17540272":[],"17603044":[],"17615838052499":[],"17641709":6,"17647619":6,"17733642":[],"17758251":21,"17777777777777778":[1,39,40,41],"17801022":5,"17829104":25,"17841553":21,"17861098":6,"17917768":5,"179404":[],"17949575":5,"17953942":11,"1797":[1,3,39,40,41],"17m":[],"18":[2,4,6,7,8,9,10,13,19,21,29,35,36,37,38,41],"18029127":5,"1803":27,"18065292":25,"1807":4,"1809":9,"181":9,"1812":9,"18128852":[],"1821":9,"183":2,"18314387":[],"18333333333333332":[1,39,40,41],"1836":35,"18383522":33,"184":[2,9],"18409473e":[],"18433544":[],"184519":[32,33],"18474816e":[],"18488944":[],"18489312":[],"1849":[3,4],"185":2,"1850":[3,4],"1851":[3,4],"18518557":29,"1852":[3,4],"1853":[3,4],"1854":[3,4],"1855":[3,4],"1856":[3,4],"1857":[3,4],"185713":[],"18571316":[],"1858":[3,4],"1859":[3,4],"186":2,"1860":9,"18611111111111112":[1,39,40,41],"18613217e":6,"18624242":[],"18660":9,"18670072e":33,"18673098":11,"1871257":25,"18726877":[],"1875353":32,"18761375":13,"18780801":32,"18807824e":[],"18824315":[],"18829946":[],"1887":6,"189367":32,"189496":[32,33],"189621963782685":11,"189622":[32,33],"18993003":25,"19":[2,4,6,9,13,21,25,29,32,35,38,41],"19003":6,"19123037":21,"19166136":[],"19166666666666668":[1,39,40,41],"191963":32,"19207979":5,"1921649":[],"19220":9,"19314584":25,"19335893":21,"19343949":[],"1937079":[],"19393543":21,"1940":[0,33],"194042826649355e":6,"1940428268204826e":6,"19426595":21,"1943":[12,38,39],"19431161":[],"194312":[],"19436962e":[],"19463967":[],"194861702085775":[],"1956":9,"19569961":[6,33],"19590868":[],"19652884e":[],"1970":[25,32],"19717411":25,"1973":9,"197370":[11,33],"19740":9,"19743643":[],"19769458e":[],"19772911":32,"1979":[6,35],"19800":9,"19825288e":[],"19888258":[],"19910208":25,"19983530":6,"1999":[27,35,41],"1_1":[12,38,39],"1_2":[12,38,39],"1_3":[12,38,39],"1cm":[0,8,10,29,32],"1d":[1,2,3,39,40,41],"1e":[1,2,4,13,14,21,37,38,39,40,41],"1e10":14,"1e4":6,"1f":[1,40,41],"1k":25,"1n":[0,32],"1s":[],"1x":[0,32],"2":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,19,21,22,23,24,25,26,28,29,31,34,35,36,37,38,39,40,41],"20":[0,1,2,4,6,7,8,9,13,21,29,30,32,33,34,35,36,38,39,40,41],"200":[0,2,3,4,8,9,10,41],"2000":[0,33],"20015436":6,"20017452":[],"2004":[13,36],"2006":31,"2008":32,"2010":[1,40,41],"20101684":13,"2011":[1,39,40,41],"2014":4,"20142361":[],"2015":[1,40,41],"2016":[0,32],"2017":41,"2018":[0,6,33,35],"2019":[8,9],"2021":[6,14,33,34,36],"2022":32,"2023":[3,4,15,16,17,18,19,20,21,22,23,27,32,34,35,36,37,38,39,40,41],"2027":9,"20272874":[],"20277777777777778":[1,39,40,41],"20289224":[],"20355156":35,"20371418":[],"20484434":[],"204932":11,"20493234":11,"20494446":32,"20500":9,"205231":32,"20594513":[],"2060":9,"2069":9,"20695722":[],"207545":[11,33],"207888":32,"20820528e":[],"20833333333333334":[1,39,40,41],"20867052175003364":[6,35],"20916295":33,"20956318":[],"20967833":25,"209789":32,"20980":9,"21":[0,1,2,3,4,5,6,7,9,12,13,15,21,25,32,33,35,38,39,40,41],"210340":[11,33],"21053692":21,"21055226":[],"21058097":5,"21059098":[],"21110005":35,"21130":9,"21152452":21,"2116753732":4,"21169159e":6,"21275991":32,"213103":[11,33],"213743":[11,33],"21401303e":[],"21460652":[],"214607":[],"21467941":29,"21493779":29,"21546249":[],"21596432":6,"216290":[11,33],"216683":[11,33],"21682143":13,"21710121":[],"2171263":25,"21860973":25,"21879159":[],"2193546":25,"22":[0,1,2,4,5,6,9,12,13,19,21,22,25,32,33,35,36,37,38,39,40,41],"22001043":[],"22044605e":[5,33,39],"22092934e":[],"221":8,"22103874e":[],"221180":[32,33],"22130126":[],"2216":9,"2218":9,"221805":2,"221921":5,"22209775e":[],"222400":[32,33],"22241171":[],"22297358":25,"22328509":[],"22368396":[],"223884":5,"22388434":5,"22416937":[],"22467274":35,"225":4,"22574374":[],"22616902":32,"226296567359957":[],"22663583":29,"22690428":5,"22729927":[],"2284246870217162":[6,35],"22847924":5,"22885848":25,"228942":4,"229241":21,"22974406":29,"23":[1,2,4,6,7,9,12,13,21,25,32,35,38,39,40,41],"23002365e":6,"23031634":21,"23047985":[],"23076923076923078":9,"23110543":[],"23167717":5,"23192074e":[],"232435":[32,33],"23257415":[],"23305112":13,"23333333333333334":[1,39,40,41],"2338675":33,"233868":33,"23392132":[],"234":6,"23516186":32,"23528337":35,"2361161":32,"23636536":21,"2364":9,"23643365":35,"23780865":25,"2379":6,"238":35,"2397":9,"23971032":33,"23979359":[],"24":[0,1,2,4,6,9,13,19,21,25,29,32,35,38,39,40,41],"24005098e":[],"24085321":35,"24128917":5,"24140":9,"24159785":33,"2416":9,"24175744e":6,"2419":9,"24251681":[],"24252405":21,"24280599":[],"242806":[],"2430":9,"24390":9,"24444444444444444":[1,39,40,41],"24569547":[],"246":2,"24602503e":[],"2465439":[],"24679418":13,"24785221":29,"24828523":25,"24829908":5,"24906604e":6,"24960675":21,"24968001e":[],"25":[2,3,4,5,6,7,8,9,11,13,15,20,21,26,32,33,35,36,38,39,40,41],"250":[2,4,7,9,36,41],"25000":[0,33],"25050227":21,"250636":32,"25077762":21,"25084316":[],"25139357":[],"251879":[32,33],"252436":[32,33],"255":3,"255001":[32,33],"25561567":[],"256":[2,4],"25617654e":6,"25617658e":6,"25650679":[],"25663096":[],"2572":9,"2575":9,"25844504":[],"25872167e":[],"259153":[11,33],"25920793":[39,40,41],"2597":9,"25it":6,"26":[2,4,6,9,13,21,35,38],"26037366":[],"261498":5,"26149831":5,"2619":33,"262638":[],"26263837":[],"26291451":[],"26292364":35,"26297455":33,"26301436":5,"26318493":32,"26372759":[],"264":4,"26409315307910025":6,"2640931530791004":6,"264377":[],"26437713":[],"264421":32,"2650":9,"265109911":4,"26514544":[],"2654":9,"26666667":13,"26710969":5,"26776828":[],"26780278":5,"268":9,"26803966":[],"26931499":[],"2697447":[],"26995402":33,"27":[0,1,2,4,6,13,21,33,35,38,39,40,41],"2707158":25,"27092910":6,"27152452":32,"2717818":21,"27305669":21,"273094":5,"27309401":5,"27424746e":[],"27438488":[],"2750":9,"27547557":[],"276263":[11,33],"27650338":[],"27693602e":39,"27700":9,"27717261":[],"2774877574815404":9,"27760":9,"27793476":[],"277935":[],"27859357":[],"27919014":32,"27924636":5,"27971414":[],"27n_":29,"28":[1,2,3,4,6,9,13,16,21,33,35,37,38,39,40,41],"28008933":[],"280179":32,"280573":5,"280647":[11,33],"28081221e":[],"28096517":[],"281930":32,"28194659":21,"28205578e":33,"28206156":[],"28210895":[],"282259":32,"282727":[11,33],"28294305":25,"2830637392":4,"283078":[],"28336218e":6,"28390":9,"28391978":33,"28443039":35,"28475098":8,"28490569":[],"28566769":[39,40,41],"28585116":25,"28607817":[],"2861":29,"28621796e":[],"28638913":[],"28641189":[],"28662669":[],"2871":9,"2873":9,"28818554":5,"288186":5,"2882":29,"28837459":[],"2886":29,"2890":[0,32],"28908491":[],"2892":29,"29":[2,4,6,7,9,20,21,35,36],"29022057":13,"29097377":29,"29135778":[],"291358":[],"2915":29,"29153991":[],"29167186":5,"29174301":21,"29199381":[],"29228133":[],"29275129":[],"29282684":25,"2931":32,"29350903":[],"29374695":32,"29384004e":[],"29401213":[],"2941718e":[],"29454955e":[],"29496954e":[],"2953":[3,4],"2954":[3,4],"2955":[3,4],"2956":[3,4],"2957":[3,4],"29588674":25,"29592687":21,"29633889":13,"296414":32,"29679459":21,"2968":32,"29726695":25,"29731502":21,"29732036":32,"2980":32,"29822833":6,"29894362":11,"2990":32,"299748":[32,33],"2_":[12,38,39],"2_1":[12,38,39],"2_2":[12,38,39],"2_3":[12,38,39],"2_i":[12,38,39],"2_m":[6,29,35],"2_t":[13,37,38],"2_x":29,"2b":29,"2c8f433990d1":[37,38],"2cm":8,"2d":[1,3,11,12,24,32,38,39,40,41],"2e":[6,35],"2f":[0,7,9,10,11,12,32,33,36,38,39],"2g":[2,41],"2g_i":[2,41],"2k":3,"2m":[6,35],"2n":[0,2,3,32,33,41],"2nd":9,"2p":29,"2pm":[30,32],"2pt":4,"2x":[0,3,8,13,32,37,38],"2x_ix_jy_iy_j":8,"2x_j":8,"2y_i":10,"2y_j":8,"3":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,21,24,25,26,27,28,29,30,34,35,36,37,38,39,40,41],"30":[0,1,4,6,7,9,10,13,21,30,32,33,35,36,37,38,40,41],"300":[21,38,39],"30000":[0,32],"30010":9,"30119421":8,"30125775":21,"30129931":25,"30150056":32,"30170017":[39,40,41],"30177145":[],"302":35,"30258509":[25,32],"303":6,"30335380e":[],"30339081517583943":29,"30361418":38,"30442964":33,"30447937":[],"30466214e":6,"30478013":[],"30494363":[],"305":[0,32],"30567713":[],"306":[0,32],"30630294":[],"30677003":[],"306770031113352":[],"307":[0,32],"3072":3,"3073":35,"307631":[],"30763135":[],"3076923076923077":9,"30774404":21,"30787294":6,"308":[0,32],"309":[0,32],"30914432":25,"30940":9,"30971881":[],"30990916":32,"31":[4,6,12,25,29,38,39],"310":[0,32],"31022577":[],"310277":5,"31027702":5,"310579":33,"3105791":33,"31082439":25,"311":[0,32],"31113868e":[],"312":34,"3123314713548606":[6,35],"31248389":32,"31276579e":6,"31290684":33,"313":34,"31318084":5,"3139661":[],"31415359e":[],"31457796":5,"315":[6,34],"3155":[0,5,6,34,35,36],"31579721":[],"31588043":25,"31588332":[],"316":34,"31650694":6,"31705377":[],"31714002":32,"31718909":11,"317367":11,"3175938":5,"317594":5,"31803769":[],"31814386":29,"3189":35,"31895514":21,"31896852":8,"31927572":[],"31995103":[],"32":[3,4,6,12,13,25,29,35,37,38,39],"3200":[1,39,40,41],"32141575":32,"32149601703519115":[6,35],"3214960170351912":[6,35],"3215":9,"32185967":25,"32221699":21,"32244056":21,"32265589":[],"3228044":[],"32341247e":[],"32372846":21,"32382849":32,"324":2,"3245":2,"32450054":33,"3250":[1,6,39,40,41],"32577534":[],"32584888":[],"32615859":[],"326238":[32,33],"32632463":[],"326325":[],"32708194":[],"327291":11,"32729105":11,"3273472571412799":11,"3283771":25,"32941592e":[],"329492":32,"33":[4,9,12,25,29,30,35,38,39],"33020191":[],"3303366":[],"33066907e":[5,33],"33078483":32,"33079132":32,"33104875":[],"33113018":[],"33159476":25,"33166055e":5,"331939":[32,33],"3329671101137754":29,"333":[7,36],"33333333":13,"33408606":[],"33486875":21,"33534416":[],"33537181":32,"335849":[],"33600213":32,"33746734":[],"33746734412664":[],"33800793":25,"33860497":[],"33903511":[],"33995567":[],"339961":[],"3399612":[],"34":[4,9,25,35],"340071371496255":33,"34011629":25,"3403":9,"340583":32,"340782":[11,33],"34100913":[],"34114547":5,"34149655":[],"341497":[],"34154132":[],"34158540e":[],"34193915":33,"342680":[32,33],"3436":[0,32],"3437":[0,32],"3439564710454786":[],"34412923":33,"34447052":[],"34517495":[],"34569596":5,"34685874":[],"348676117830458":5,"34998197":[],"35":[0,4,6,9,17,26,30,32,35],"35058127":21,"35084272":21,"35140":9,"35146218":29,"351636":[11,33],"35182854":5,"35248847":21,"35255737e":21,"35412147":35,"3544313922":6,"35470445e":[5,33],"35533773":6,"35564856":[],"356399":[32,33],"3568919":[],"357508":[32,33],"35771826":6,"3581341341":4,"35825829e":[],"35846425":35,"359":[5,34],"3592571":[],"3597516959642966":[],"3597517":[],"36":[0,4,5,6,26,29,35],"360":[1,39,40,41],"36051635":[],"3613":9,"361556":[32,33],"3616476":[],"3621311":5,"3632959111950474e":6,"363295916323784e":6,"36403046":29,"36420967":[39,40,41],"36434588":[],"36550376":32,"3655222":5,"367":2,"3676":4,"36789460e":[],"3679":4,"36795972e":[],"36802977":32,"3689":4,"369139":[11,33],"36it":6,"37":[4,6,9,19,26,32,36],"3701":4,"3703":4,"3703468543933255":[],"3705":4,"3706":4,"370782966":4,"37112277":[],"3713":4,"3716":4,"37239927e":33,"3724":4,"37266855":32,"3729492":[],"3730":4,"3733":4,"37335014":32,"3737":4,"37376184":32,"37388140e":[],"37396662":6,"3743":4,"37477725":29,"374777250972322":29,"3749":4,"3756":4,"375694":32,"3758":4,"3765":[],"376547":32,"3766":4,"37667238":25,"3767":4,"3770":[],"3773":[],"377372":33,"37737221":33,"3777801602":6,"3780":4,"3782":4,"3784":4,"37853034e":[],"3786":[],"3787":4,"3789":[],"37900111":6,"37917253":[],"3795":[],"3798":4,"3799":[],"38":[4,9,26,29],"380":9,"3800":4,"3802":4,"38020451":[],"380205":[],"3804":4,"38046294":32,"38088413":[],"3812":4,"38135654":21,"38135733e":6,"3814":[],"3815":4,"3816":[],"38165546":[],"3817475779":[6,35],"38201155":21,"3821":[],"382187":32,"38259375":[],"38319502e":[],"3834":[],"3836":[],"3837":[],"3838":[],"38380352":21,"3838917029":37,"3840":[],"3842":4,"3842967":[],"38461538461538464":9,"38461539":37,"38465596":[],"38511413":[],"3853":[],"38533185":6,"3855":4,"3856":4,"386":9,"38629436":[25,32],"3865":[],"387":34,"3871":4,"3873":4,"38764522e":[],"3877":[],"3878":[],"38782352":32,"38787447":[],"38831624":[],"3886":35,"3888":4,"38916861e":6,"3893":[],"3894":4,"38962192e":6,"3898":4,"39":[0,4,9,22,27,30,32,38,39,41],"3901":[],"3907":[],"3907408":[],"39078751e":[],"3911":4,"3918":4,"3919":[],"39197698":33,"391977":33,"3920":4,"39200159":32,"3921":4,"39214397":33,"392144":33,"3923":[],"3928":[],"39287528":[],"3929":4,"39300201":[],"39308683e":[],"3932":[],"3944":[],"39457095":[],"3948":[],"39483726":[],"39541528":[],"3957":4,"39572825":[],"39579407":5,"39612983":[],"3962":4,"39644178":[],"3967":4,"3970":[],"39706038":5,"39730396":26,"3975":[],"397700":[11,33],"39789527":[25,32],"3979":4,"3980313467":6,"39890447":[],"39895173e":[],"39931051e":33,"3996":[],"39965905e":[],"399836":[32,33],"3999":[],"3d":[2,3,4,6,13,26,35,37,41],"3f":[1,3,9,40,41],"3n":25,"3s":4,"3x":[2,8,41],"3x_i":[2,41],"3y":8,"3yk470mj5p931p9dtkk0y6jw0000gn":[1,6,13,26,32,35,37,39,40,41],"4":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,21,25,26,27,29,32,34,35,36,37,38,39,40,41],"40":[0,1,4,6,9,22,26,27,30,32,35,39,40,41],"400":4,"4000":[9,32],"40009482":32,"4010":4,"40111899":11,"401119":11,"4014":[],"40182469":25,"401842":[11,33],"40216748":[],"4033":[],"40362053":[],"40389562":[],"404":33,"404130":[],"40413036":[],"4043":4,"4050":[31,32],"40500157":[],"40512793":25,"405890":[11,33],"40620066":33,"406201":33,"40629059":[],"40644745":[],"4066":[],"40666305":32,"4082":6,"4087":9,"4087793":5,"40892146":[],"40927184e":6,"40contain":27,"41":[2,4,9,22,23,25,27,41],"41021561":[],"4107":9,"41097603":[],"411730":5,"41173033":5,"41219619":[],"41246325":[],"41291861":[],"41371745":[],"41433969":5,"415066":[],"41506637":[],"41511965e":[1,39,40,41],"415201":32,"4155":[2,15,41],"41594943":21,"4162706317":6,"4166666666666667":9,"41716708":21,"41771755":[],"41790059":21,"418506":[11,33],"4187996":[],"41882037e":6,"41894238":25,"42":[1,4,8,9,10,25,39,41],"421120085426022":[],"42138688e":[],"42172457":[],"42198678":[],"421987":[],"42239354":[],"422658":11,"42265837":11,"4230769230769231":9,"4234":4,"42441033":5,"42450":9,"42457498":5,"424575":5,"42484459":38,"42535003":25,"425564":[],"42556446":[],"42578415":[],"4258049":[],"42584543":[],"426":[6,7,36],"42800148":[],"428741":[],"42874148":[],"429":35,"429345":[],"42934502":[],"42967903e":[],"43":[0,1,4,7,9,25,36,39,40],"43043913":[],"43054282":5,"4310":32,"433":35,"43330971e":6,"43425860e":[],"43466245":32,"43490863":[],"43496417":[],"435163":[32,33],"4353":[],"43579948e":6,"43639284e":33,"436462435":4,"43647835":32,"43766686":11,"438060758":6,"43809274e":[],"438136":[32,33],"43902948":32,"439230":6,"43941514":32,"43951204":29,"43it":6,"44":[0,1,4,25,39,40],"44089210e":[5,33],"44116407":32,"441182":[],"44118245":[],"441264":32,"442600":[11,33],"443217":[32,33],"44347438":[],"444":9,"44402322":25,"44407741e":[],"44418822":[],"44520102":[],"44595818":32,"446033":35,"44624525e":33,"446453":32,"44729805":[],"44732200e":[],"44781662":11,"447817":11,"44842116":[],"44921888":[],"44970586e":[1,39,40,41],"45":[4,9,30,32],"450":9,"45014":25,"450257":[11,33],"4504":9,"45062284":32,"45065211":[],"45073476e":[],"450m":[],"45134965":[],"45207509":[],"45253585":32,"452553":32,"45255977":[],"45281756":[],"45290234":21,"452m":4,"45308692":[],"453m":4,"45405253e":[],"454m":4,"45502684":21,"455173":35,"4555094":[],"455592":[],"4557763":11,"455947":[32,33],"455m":4,"456":9,"45610021":[],"45642521":[],"456m":4,"457":[2,4],"457m":4,"458027":[32,33],"458078":[11,33],"458m":4,"45915671e":33,"45922756e":[],"45960079":5,"459m":4,"46":[2,4,9,30,32],"4600624385659884":[],"4601":9,"46022436e":[],"460m":4,"46153846153846156":9,"461m":4,"462":[7,36],"4627795":29,"462m":[],"46313714":[],"46383925e":6,"46383926e":6,"463861":32,"464m":4,"46754435":32,"4676059":33,"467606":33,"467818":[],"46781836":[],"467m":4,"468":41,"46873567":25,"468m":[],"46984697e":6,"47":[2,4,9,30,32],"47042744":5,"470714":[32,33],"47075725":6,"470m":4,"47116868e":6,"4712168":29,"47125748":5,"47132891":5,"47176716":35,"47176783":35,"47179152":35,"471874":[],"47187428":[],"47202442":35,"472445":5,"47244548":5,"47297104":25,"47313680":35,"47364408":25,"473m":[],"47430124e":[],"47447472":[],"475405":[],"47540513":[],"47610036":6,"47700752":32,"47701204":[],"477m":[],"47815203":11,"479465113":4,"479m":[],"47it":6,"48":[2,3,4,9,35],"480":32,"48134747":[],"481401":[],"48140137":[],"48145226":[],"481979":6,"48240312e":[],"48243352e":[],"48257387":[30,32],"483257001":13,"48336413":[],"48356153e":[],"483m":[],"48418018":[],"48423285":[],"48461009":[],"48464841":[],"48476997":11,"484m":[],"48598711":[],"485m":[],"48629506":[],"486852":11,"48685204":11,"4871984":29,"487m":[],"48815255e":[],"488m":[],"489502":[],"48950243":[],"48994188":5,"49":[4,5,6,9,11,26,33,37,38],"49057373":32,"49078463":[],"49152":3,"49216685":21,"492m":[],"49313815":21,"493m":4,"4940954":[0,32],"49545139":21,"49555885e":[],"4959161509357395e":6,"495916150936645e":6,"495m":[],"49616116":[],"497":[3,4],"4974810657432664":[],"497m":[],"498":[3,4],"49865980e":[],"499":[3,4],"4990":29,"4992":29,"4993133":25,"4997":29,"499m":[],"4c4c7f":[9,10],"4d":3,"4f":6,"4pm":[30,32],"4s":[],"4y":8,"4y_i":10,"5":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,21,23,25,26,29,32,33,34,35,36,37,38,39,40,41],"50":[1,2,3,4,6,7,8,9,10,13,21,32,33,35,36,37,38,39,40,41],"500":[1,3,4,6,9,10,13,35,36,37,38,39,40,41],"50000000e":39,"50000455":5,"50000553":5,"50000718":5,"50000855":5,"50000969":5,"50001063":5,"50001142":5,"50001207":5,"50001261":5,"50001306":5,"50001343":5,"50001374":5,"500014":5,"50001414":5,"50001422":5,"50001439":5,"50001454":5,"50001466":5,"50001476":5,"50001485":5,"50001492":5,"50001498":5,"50001502":5,"50001506":5,"5000151":5,"50001512":5,"50001515":5,"50001517":5,"50001518":5,"50001519":5,"50001521":5,"50001522":5,"50001523":5,"50001524":5,"50001525":5,"50046106":21,"50079895":[],"500m":[],"501":[3,4],"5018":29,"50184628e":[],"501m":[],"502":[3,4],"50227564e":6,"50274255":[],"503":[3,4],"50321091":5,"504":[3,4],"50427787":35,"50462474":[],"5046808":29,"505":[3,4],"50519365":[],"50562981":[],"506":[0,3,4,33],"50653545":32,"506553":33,"50655336":33,"50691065":[],"50697511":[],"507":[3,4],"50721349":[],"507d50":[9,10],"508":[3,4],"50837888e":[],"50846111e":6,"50846112e":6,"5092982":25,"50it":6,"50j":[13,37],"50x10":[1,39,40,41],"51":[4,10],"510":[1,39,40,41],"511":[3,4],"511888":5,"51191552":6,"512":[3,4],"51374050":35,"514219":[32,33],"515m":[],"51741855":25,"5177783846":4,"51845286":[],"518895":32,"52":[3,4,37,38],"52015514":[],"52067151":32,"52078202":29,"52180619":32,"52204004":[],"52209178":[],"5222222222222223":[1,39,40,41],"522836":32,"522m":[],"52362157e":33,"52400486e":[],"52482437":[],"525054":[],"52512898":29,"52518625":[],"525739":[],"52573941":[],"526744":[11,33],"52687741":25,"5276":4,"52775466":35,"52795454":[],"52856208":[],"52874252":5,"52942586":11,"52944573":[],"529446":[],"52950417":[],"5297947920715131":[],"53":[3,4,9],"5303329":11,"53049637":38,"5305555555555556":[1,39,40,41],"531280":[32,33],"5320148":[],"53250091":[],"53278871":[],"532789":[],"5340022":[],"534362":32,"53515878":25,"53542722":[],"53558374":25,"5364857":25,"5369485":21,"53700083":25,"53703498":6,"53738247":35,"53755010e":[],"5378811":11,"53811172e":[],"5384615384615384":9,"539261":[11,33],"53946725":21,"54":[3,4,6,9,29],"540":9,"54039921":5,"54041041e":5,"541605":[32,33],"54285633":[],"543939":33,"54393936":33,"544439":[32,33],"54637219":35,"54644868":25,"55":[1,3,4,9,39,40,41],"55086461":[],"552042":[],"55315304":[],"55328795e":[],"5555555555555556":[1,39,40,41],"555m":[],"55649207":32,"556m":[],"557795":[11,33],"55854694":11,"55865092":32,"55867377":32,"55868255":[],"5594":6,"55955126":[],"55972302e":[],"55it":6,"56":[1,3,4,9,39,40,41],"56033697":5,"5608253":32,"5615739502773949":32,"56171141":[],"56198284":5,"561m":[],"56240703e":[],"56249706":25,"56288861":[],"562888614232874":[],"563167":32,"56364308":[],"56366546":[],"56399029e":[],"564":9,"564374":[11,33],"56465688":[],"56475572":32,"56477354":[],"565":9,"56536":[0,32],"56570797e":[],"56589683":35,"566":9,"56636537":[],"56636616e":6,"567":9,"56740132":[],"568":[9,35],"568587":[],"56858701":[],"569":[1,9,40,41],"56912044e":6,"56939714":5,"56965674":35,"57":[0,3,4,8,9,30,32],"570":9,"571":[5,34],"571105947979344e":6,"571105947979394e":6,"57201944e":6,"572069":32,"57285536":[],"573029":[],"57302926":[],"574465":[11,33],"57572321":[],"576":35,"57670824":[],"5769230769230769":9,"5786304":[],"57935482":32,"57952471e":[],"58":[3,4,9,10,30,32],"58076367":11,"5808118":[],"5810785":32,"58182803":32,"58193124":[],"581m":[],"58268575":[],"5828247":[],"5829913":[],"5833333333333334":9,"583595":[32,33],"58427764":29,"58465096":21,"58492636e":33,"58739348":21,"58742004e":[],"58793527":25,"58818643":[],"58841019e":[],"5888888888888889":[1,39,40,41],"58948138":[],"58948347":[],"59":[4,9],"59004971":[],"591317992":4,"5914397":25,"59222238":[],"59327016":25,"59412285":32,"5944444444444444":[1,39,40,41],"59446603":[],"59511582":[],"59545081":29,"59589728e":[],"59642735":29,"596m":[],"5974862":[],"59895188":[],"59916814e":[],"5cm":29,"5f":[8,37],"5x":8,"5y":8,"6":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,21,25,29,30,32,33,34,35,36,37,38,39,40,41],"60":[1,3,4,6,9,40,41],"60000":4,"6019067271":4,"60293962":5,"603636":32,"6037092":[],"60383004":[],"60420593":5,"60543038":33,"60673226":11,"6067329321734374":[],"60675691":25,"606760":5,"6071713":[],"60815105":6,"60883945":32,"60943791":[25,32],"60it":6,"61":[7,36],"61043964e":[],"6111111111111112":[1,39,40,41],"61197218":[],"612939":[32,33],"613579":[32,33],"61394448":[],"614808":[11,33],"61480907":25,"61504341":[],"61532006":[],"6153846153846154":9,"61585143":[],"61653285e":[],"61702282":6,"61775176":35,"618982":[32,33],"61971639e":[],"61992828e":[],"61it":6,"62":[3,4],"621102":32,"62373464":11,"625":[7,36],"62554614":[],"626635268":[6,35],"62841921":[],"62862896":[],"6289054":[],"62894215":5,"629100":5,"62910047":5,"62919818":[],"62it":6,"63":[0,1,3,4,6,7,33,35,36,39,40,41],"6300745149331701":33,"63025821e":6,"63162342":33,"63180447":35,"63227278":32,"63249532e":6,"63277911e":[],"633949":32,"634715":[],"63471545":[],"63498144":5,"6353716266230895":29,"63537163":29,"63567272":[],"63659131":21,"63677721":[],"637129335071195":33,"63837812":32,"63849228e":[],"63875295":[],"63957747":21,"64":[1,3,4,7,13,25,32,36,37,38,39,40,41],"64012627":5,"64056395":29,"64111239":[],"64147722":[],"64158883e":36,"64291044e":[],"64292493":[],"64299732":[],"64316192":35,"64316482":35,"64391062":[],"643m":[],"64502836":[],"64527549":33,"64550753":[],"64594566":5,"645946":5,"646283":[11,33],"64695862":25,"647":6,"64733822":29,"64742912e":6,"647473":[11,33],"64846973e":[],"649382":[11,33],"64969451":[],"649695":[],"64x50":[1,39,40,41],"65":[1,3,4,7,8,9,25,36,39,40,41],"65036493":[],"65196615":[],"652187":[],"65218729":[],"65322635":29,"6536392":33,"65408703e":[],"65409368":29,"65442354":33,"654424":33,"654m":[],"65565751":[],"65571174e":33,"65599456":33,"65626992":38,"65628888":[],"6568551":[],"65704027":[],"657041":32,"65715086":29,"65720414":[],"65743689":33,"65825344":25,"65833132":33,"65885453":5,"65891389":33,"658914":33,"65913552":29,"66":[3,4],"660470":11,"66047048":11,"66051179":[],"66064822":33,"66080313":33,"66204648":6,"66219404":6,"6628996975186953":33,"66294408":33,"66323494":[],"6638":9,"66490332e":21,"66510547":13,"6652177":33,"66545355":[],"66560":9,"66562658e":[],"665m":[],"666597":32,"666897":[],"66689729":[],"667":9,"667239":32,"66798429":[],"668172":[32,33],"66878535":21,"66m":4,"67":9,"67035174":[],"67047975e":6,"67109613":25,"67189384":[],"671m":[],"67264685":[],"672721":[32,33],"67314874e":5,"67347822":[],"67432237e":[],"67541155":13,"67554897":[],"67640036":[],"67671601":[],"6780674":[],"67890723":[],"68":[],"68037392":5,"680374":5,"68192193":5,"68286725":33,"68419351":[],"684194":[],"68534263e":6,"68542204":5,"685643":[],"68564345":[],"68581655":38,"68592431":35,"6860597312101988":[],"6869":9,"68711054":25,"68759903e":[],"687m":[],"6887363571":4,"68929213e":6,"689345":32,"689519":[11,33],"68971917":29,"68992377":32,"69":[7,9,29,36],"690":9,"69009002":[],"690617":[32,33],"69069n_":29,"690710":[],"69071035":[],"69111133e":[],"692":[1,35,39,40,41],"692268":[],"69226802":[],"69230769":37,"6923076923076923":9,"69233822":29,"692m":[],"69314603":21,"69481287":29,"69484813e":5,"69504801":6,"69519297":25,"69582036":[],"69634577e":6,"69695259":5,"69714468":[],"6980":[21,37,38],"69818111":[],"69873514":[],"699":[],"69908626":6,"6999536":11,"69997503":33,"6n_":29,"6pm":32,"7":[0,1,2,3,4,5,6,7,8,9,11,12,13,15,21,25,26,28,29,31,32,33,35,36,37,38,39,40,41],"70":[1,6,7,9,36,39,40,41],"700":[],"70037324e":33,"701":[],"701370":5,"702":[],"70224083":13,"70249832":25,"70344416":5,"704":[],"70408916":32,"70506522":32,"70573539":[],"70653767":4,"706833":[],"70710678":[5,33],"7082333":32,"70832814":5,"7086067479626619":33,"70899024":32,"7094664":[],"70967214":25,"709698":32,"71":[1,39,40,41],"7100524":[],"71038664":25,"71137935":29,"71142161":33,"711422":33,"7119":9,"712018":[11,33],"71269506e":[],"71285447":[],"713163":32,"7135487":[],"71375273e":[],"71424969":[],"71437567912473":[],"71437568":[],"71467081":[],"71504681":[],"71640333":[],"71647328":32,"71727268":5,"717273":5,"71737253":33,"71761101":33,"718165":5,"71977472":25,"72":25,"7207467":32,"7215423":32,"72174172":11,"72228205":32,"72271878e":6,"72328506":[],"7236674":5,"724":3,"72546953":32,"72651548":25,"72742343e":[],"72859758":5,"72981762":8,"73":[6,32,35],"731000":[32,33],"73231305":[],"73293298":[],"7330932":29,"733096":[32,33],"73379189":32,"734107":[],"73410729":[],"73441814":29,"73448544":[],"73456649":[],"74":[6,35,37,38],"740":9,"74081822":8,"740m":[],"741391":[],"7413913":[],"741m":[],"74280244":[],"743189104728408":11,"74384949":33,"74391438":25,"74401372":[],"74430995":29,"74462857":[],"74577867":[],"74607851":33,"74724767":[],"74731872":25,"74818082":[],"74829661":33,"74840212":5,"7484672e":[],"7490462":[],"749765":[32,33],"75":[5,6,8,9,11,26,32,33,35,39,40,41],"750445":[32,33],"75050135":33,"75054469":29,"7506274061293645":[],"751699":[11,33],"75170092":5,"75174305":11,"75268791":[],"75269037":33,"75282841":[],"75315452":[],"75354069":[],"75457798":[],"75472506":21,"75576555":33,"75627883":[],"756279":[],"75631027":[],"756352":[32,33],"75719828":[],"75770568":33,"75823753e":[],"7588118737641243":32,"75963425":[],"76":[9,30,32],"76004012":[],"76010633":[],"76077707e":[],"76084455":[],"76135601":25,"76174289e":[],"7640203256838339":11,"7644":[],"764997683364458":[],"765":[7,36],"7651068":[],"7664107":[],"76771975":[],"7692307692307693":9,"76936315":5,"7694444444444445":[1,39,40,41],"7697":35,"7698352":32,"76985203":29,"77":[9,30,32,37,38],"770204":[],"77025447e":[],"77067609":32,"77133246":29,"77152076":5,"7718":9,"77184871":21,"77203046":25,"77265448":[],"77265782":32,"77343022e":[],"77448317e":[],"7748567":[],"77589027":[],"77632628":[],"77636e":[13,38],"77646856":[],"77714169":8,"7779287093124035":[],"77794957":[],"7782028952":4,"77856932":[],"78":[],"78009660e":33,"7803213":32,"78156479e":5,"78177713":[],"78184120e":6,"78220032":25,"78299706":[],"78316665":29,"785061":32,"78521833":25,"78524451e":[],"78556129":[],"7865355":32,"788388":11,"78838813":11,"78882958":[],"78886274":[],"7893215781870513":5,"78941903":5,"78951443":[],"79":32,"79035184":25,"79072516":[],"79106945e":[],"79111643":5,"79125269":[],"791809":[],"793167":[32,33],"79328516":[],"794282":[11,33],"794906":[],"79490641":[],"795225339396409":[],"79550688e":[],"79578306":[],"79675445":[],"79787771":[],"797e":6,"79896478e":[],"79909592":35,"79914677":[],"7993408651198877":35,"79934087":35,"7995707762668065":35,"7d7d58":[9,10],"8":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,21,22,25,26,27,29,32,33,34,35,36,37,38,39,40,41],"80":[0,1,5,6,8,9,33,34,35,39,40,41],"800":[4,7,36],"80074264":25,"80152684":[],"80189569":[],"80207897":25,"80228781e":[],"802550782087107":[],"80354994":6,"80389541":32,"80447153":32,"80460179":35,"80469739":5,"80540415e":[],"80548430e":[],"8055555555555556":[1,39,40,41],"80609615e":6,"80609616e":6,"80625657":[39,40,41],"80802836":[],"80847477e":6,"80861057":[],"808611":[],"81":[1,39,40,41],"81048318e":6,"81071342":[],"81114345":[],"81122914":21,"81160425":5,"81333804":6,"813929":11,"81392948":11,"814":[7,11,36],"81597834":35,"815am":[30,32],"81633628":11,"816454":[32,33],"81651921":[],"81664404":[],"816847":[32,33],"81753152":[],"81759234":21,"81784973":[],"8182":[],"81840893":32,"81853487e":21,"8186717":[],"81948868":25,"81953844":32,"8197":[],"82":[],"82001111":29,"820122":11,"82012236":11,"82102668":[],"82139086e":[],"82198978":5,"82292185":32,"82296251":[],"82379443":11,"82410428":[],"8249367":21,"82651934e":[],"8265786":5,"827462":29,"82781715":21,"82909728":[],"82988221":25,"83":32,"83009076":29,"8305555555555556":[1,39,40,41],"8306":6,"8311393813043355":29,"83140314":29,"83140314044099":29,"83146596":35,"83190841":[],"83298727":[],"832987270767667":[],"832m":[],"83384573":[],"8342":6,"83443463":25,"83443698":[],"83488328":[],"83505053":[],"8351":6,"83512277":5,"8353591":32,"836186":11,"83618601":11,"83657122":[],"83752888e":[],"83770406":[],"83774539":[],"83793362":[],"83870794e":[],"839818":32,"84":[],"84082439":[],"84094234":[],"84132082":32,"84159521":[],"842101":11,"84210141":11,"842436":[32,33],"84290819e":[],"84355903e":[1,39,40,41],"84359332e":[],"84380376":[],"84443254e":[1,39,40,41],"84444399":[],"845716766413386":[],"84571677":[],"84575663":[],"8461538461538461":9,"84638256":[],"846383":[],"84666445":[],"84671508":29,"84698999":29,"84780262":6,"84783351e":[],"84835621":11,"84846601":[],"84858":34,"84859258":[],"84923989e":6,"84927263":[],"84929103":[],"84942247e":[],"84991754":32,"84994524":5,"84m":[],"85":[1,9,39,40,41],"850164":5,"85035714":[],"85263220":6,"85276246":25,"85278920e":5,"85288931":[],"85297050e":[],"85355539":21,"85365229":21,"853835":32,"85514104":[],"85548858":[],"85601654":0,"85601992":5,"85615662":[],"85654993":32,"85714286":36,"8574":[],"858":9,"85813693":13,"858185":32,"8583333333333333":[1,39,40,41],"85888897e":[],"86":[],"86012593":[],"86015267":[],"86117291":5,"86134827":5,"86145244":11,"861676":32,"86221134":[],"86252988":6,"86282204":32,"86341536":[],"8635085":[],"8638888888888889":[1,39,40,41],"86420934":32,"86452742":[],"86619181":[],"86630":9,"8666666666666667":[1,39,40,41],"86666667":36,"86810":9,"86811569":25,"86850963":25,"86852099":32,"869":[0,32],"87":[9,33],"870":[0,32],"8702784034":4,"87072815e":33,"871":[0,32],"8722222222222222":[1,39,40,41],"87242312":[],"8727831":29,"873":[0,32],"87381451":5,"874":[0,32],"87403627e":[],"87431418":25,"87458904":[],"875":[1,39,40,41],"87533278":[],"87533326":25,"875794":[],"8759":[13,38],"876":6,"87627342":35,"87795661":[],"878123":32,"8784267":[],"8791492":29,"87931006":25,"87953769":25,"88":[13,37,38],"88046261":5,"8805555555555555":[1,39,40,41],"88168312e":6,"88182591":33,"88291866":21,"88305878":[],"88323026":33,"88336879":5,"884399":[],"88442538":5,"884669":33,"88529063e":6,"88613493":33,"88744469e":[],"888214":11,"88821402":11,"888577549915147":[],"8888888888888888":[1,39,40,41],"88901776":32,"88908909e":[],"8897518e":[],"89":0,"89098129":25,"89126914e":33,"8915573":[],"89288636":11,"89321335":29,"89410423":5,"8942133":[],"8944444444444445":[1,39,40,41],"89481038":21,"89604286":32,"89609007":[],"896911":[],"8969113":[],"89793609":[],"89805982e":21,"89823921":[39,40,41],"89897156":32,"89996783":[],"8f":[6,35],"8g":[6,35],"8n":25,"8x8":[1,39,40,41],"9":[0,1,2,3,4,5,6,7,8,9,11,12,13,21,22,23,25,27,28,29,30,32,33,34,35,36,37,38,39,40,41],"90":[1,6,9,40,41],"90075537":5,"9011":6,"90220243":5,"90223115":[],"90266948":5,"9027777777777778":[1,39,40,41],"90297441":[39,40,41],"90325763":[],"9036573":[],"9040":9,"904648525660773":[],"90475506e":6,"9050595316983907":25,"9054":35,"9055555555555556":[1,39,40,41],"90556496":25,"906747":5,"90793019":13,"90803422":[],"90854751":11,"908548":11,"90871918":21,"908736":[],"90873644":[],"909327":3,"90960269":32,"91":[30,32],"910":9,"91022359":25,"91050344e":[],"91080327":21,"91086026":25,"9111111111111111":[1,39,40,41],"91128596":5,"912":[3,4],"9129629":[],"91358019":25,"91373404":29,"914":[3,4],"9142491":[],"91492986e":6,"915":[3,4],"91538877":[],"91619855":13,"91650774":[],"916508":[],"9165822":[],"9166666666666666":9,"917":[3,4],"917482":11,"91748202":11,"91760278":5,"91784246":[],"918":[3,4],"91812702":5,"918992":[32,33],"91966064":[],"92":[6,9,30,32],"920619":11,"92067658":[],"9208878":[],"92103867":[],"921368":5,"92136836":5,"922002":11,"92200223":11,"92236466e":[],"9230769230769231":9,"92351924":[],"923602":32,"92405283":[],"924e":6,"925":[1,39,40,41],"92507116e":[1,39,40,41],"92578916":5,"92579609e":[],"92630576":32,"92648983":[],"92651068":35,"92717417":[],"92729959":[],"92772833":[],"9277777777777778":[1,39,40,41],"92857143":[7,36],"92930426e":[],"9295763474254684":[],"93003138502386":29,"93022647":32,"9305555555555556":[1,39,40,41],"930829":5,"93082933":5,"931":[0,32],"93155188":5,"93158979":5,"932656":[],"93267138892912":[],"93267139":[],"933":[5,34],"93420126":[39,40,41],"93492130e":6,"93500562":[],"93528653e":[],"93571082":[],"93601008e":33,"937":29,"937082":[32,33],"93799826":5,"938":29,"93820524":[],"9387":9,"93884803":[],"939":[0,29,32],"93944615e":[],"93988393":[],"94":[7,29,36],"94226022e":6,"94230225":[],"942422095469182":[],"94256677":[],"94260358":[],"942604":[],"94273542":33,"94284104":5,"94320205":5,"94338159":[],"943439":[],"94399217":29,"944":[3,4],"94400087":25,"94433302e":[],"9444444444444444":[1,39,40,41],"94484047e":39,"945":[3,4],"94591015":[25,32],"946":[3,4],"94639099":11,"94642209":32,"946957":5,"94697839":[],"947":[3,4],"9472222222222222":[1,39,40,41],"948":[3,4],"94814932":[],"94815131":[],"9481513127527335":[],"94822514":6,"94823368":32,"9482527":5,"94854992":[],"94866246":[],"949":[3,4],"949162":11,"94916237":11,"94938706":[],"95":[1,7,9,11,35,36,39,40,41],"950":[3,4],"95008046":6,"9503219":29,"95055425":[],"951":[3,4],"951109":[],"95117099":[],"95166414":32,"95190644":[],"95231424":5,"95235306":21,"952387":33,"9527777777777777":[1,39,40,41],"95284275":5,"953065564":[1,39,40,41],"95327702":[],"95329348":[],"95351665":5,"95355327":[],"954":29,"95429024":[],"95508909":[],"95511792":33,"955118":33,"9555555555555556":[1,39,40,41],"95558642":[],"955820c21e8b":4,"956563":[11,33],"95661705":32,"95679388":32,"95684892":5,"95686268":[],"95697233e":[],"95703":[13,38],"95746721":25,"95763525":[],"9578":[],"958228616652075":5,"95982273":13,"96":[6,7,11,35,36],"960":29,"9601304850035702e":6,"960130485007504e":6,"96024953":5,"96033509e":[],"96046928":[],"96084663":5,"961":29,"96183456":[],"962":29,"962653":5,"962990":32,"963198":[],"9637117593816477":6,"9640435":5,"96459246":32,"96461989e":[],"9649652536":4,"96543101":32,"965548":[32,33],"96599594":25,"96611032":[],"96618584":25,"96631321":33,"96688672":5,"966899":32,"9674916":5,"96750421":[],"967809":[11,33],"96783837":13,"96804366":[],"96841776":[],"96850702":25,"96890557e":[],"969":6,"96911909":29,"97":[7,36],"97005689":5,"97062694":[],"97069774":[],"970698":[],"97108e":[13,38],"9716":[],"9722222222222222":[1,39,40,41],"9723":[],"97243128":5,"97262227":[],"97300836":5,"97449977":32,"97488151":[],"97497404e":6,"975":[1,39,40,41],"97507735":5,"97514104e":[],"97594511":[],"97606135":29,"97606135399951":29,"9764":[],"97644118":[],"9765":[],"97690235":35,"97705827":5,"97758848":5,"9777777777777777":[1,39,40,41],"978":34,"9780387310732":31,"9780387848570":31,"97804446":[],"9781492032632":31,"9783319210079595":[],"978553":5,"97866042":25,"97879245":[],"97898392":[6,33],"979":6,"97906022e":33,"97926491":5,"97948913":[],"9797317":29,"98":[0,1,7,9,36,39,40,41],"980":9,"98004227":[],"9805555555555555":[1,39,40,41],"98073929":5,"98091621":5,"98127617":[],"981321":[32,33],"98139097":5,"98215566e":[],"98275501":5,"98316168":32,"983310":[32,33],"98404993":[],"98413059":5,"984182":[],"98418221":[],"98430782":[],"984308":[],"98454786":5,"984601":[],"98460101":[],"9849967686928113":36,"985":29,"98566191":5,"986":29,"98601306":29,"9861111111111112":[1,39,40,41],"98620879e":[],"986699":5,"98680716":5,"98686102":[],"98694705":[],"98706221":[],"98716878":5,"9871776311306221":[],"98765625":25,"987722":11,"98772232":11,"98808176":5,"98822371":6,"988835":[],"9888544725633199":[],"9888888888888889":[1,39,40,41],"989":29,"9890348":5,"98914003":[],"9893447":5,"98947894":33,"9898ff":[9,10],"99":[6,7,9,11,13,21,35,36,37,38],"990":9,"99006712":32,"99009525":5,"99051150":6,"99083639":[],"99084226e":[],"99088801":5,"991":29,"99106686":[],"99115119":5,"9915165982451293":33,"99176998":5,"992":29,"99215828":[],"99242921":5,"99265097":5,"99268332":[],"993":29,"99316252":5,"99371056":5,"99389612":5,"9940253773173835":[],"9943201":5,"9947756":5,"99484719":32,"99492986":5,"9950597269547777":[],"9952222065466447":33,"99528218":5,"99539415":5,"9955500279779226":[],"99566069":5,"99578809":5,"995840825550726":33,"99589367":[],"996":[5,34,35],"99608161":5,"99630114":21,"9963311287748658":[],"9963961":5,"99650061":5,"9967458":5,"9969332511584248":[],"99700706":5,"99709215":5,"99729756":5,"99751458":5,"99758326":5,"99767262":[],"99775587":5,"9978254":[],"99793613":5,"99799099":5,"99813653":5,"99828624":5,"9983295":5,"99845267":5,"99854557":33,"998577":5,"99861053":5,"99862019":33,"99866581":[],"99869482":33,"99871521":5,"99876945":33,"99881845":5,"99883628":33,"99884384":5,"99884409":33,"99888222":[],"99891093":33,"99891873":33,"99893323":5,"99898558":33,"999":[9,21,29,37,38],"99901896":5,"99903755":5,"99906023":33,"99911427":5,"99912709":33,"99913489":33,"99918546":5,"99919837":5,"99920175":33,"99926459":5,"99927642":33,"9993237":5,"99932732":[],"99933188":5,"9993511":33,"9993736":[],"99938942":5,"99941797":33,"9994385":5,"99944037":[],"99944272":5,"99949077":[],"99949266":33,"99949306":5,"99953381":5,"99953475":5,"99956735":33,"99957911":5,"99961294":5,"9996357":[],"99965056":5,"99967865":5,"99970894":33,"99970988":5,"9997332":5,"99975913":5,"99977849":5,"99978365":33,"99980002":5,"9998161":5,"99984215":[],"99984732":5,"9998542":[],"99987324":5,"99988325":[],"99989476":5,"99991263":5,"99992263":21,"99992746":5,"99993978":5,"99995":5,"999955585168597":6,"99998193":21,"99998703":21,"99999773":21,"99999985":[],"9m":4,"9x":[6,26],"9y":[6,26],"\u00f8yvind":[6,33,34],"abstract":[1,20,37,40,41],"boolean":4,"break":[0,4,6,11,14,32],"byte":[25,32],"case":[0,1,2,3,4,5,6,7,11,12,13,14,16,21,23,24,25,26,27,32,35,38,39,40,41],"catch":[0,32],"class":[0,1,3,4,6,7,8,9,11,12,13,29,32,35,37,38,39,40,41],"default":[0,1,2,4,6,7,13,16,25,26,27,32,33,34,36,37,40,41],"do":[0,2,3,4,5,6,8,9,10,11,12,13,14,15,16,21,22,25,26,27,33,36],"ekstr\u00f8m":4,"export":9,"f\u00f8470":[30,32],"final":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16,18,19,20,22,23,26,28,29,30,32,35,36,40],"float":[0,3,4,5,9,11,13,14,25,32,33,37,38],"function":[2,3,4,5,9,14,15,16,17,18,19,22,23,24,25],"import":[0,1,2,3,4,6,7,8,9,10,11,12,13,14,16,17,26,29,35,36,37,38,39,40,41],"int":[0,1,2,3,4,5,6,11,13,14,21,25,29,33,35,37,38,39,40,41],"long":[0,1,3,4,12,13,32,36,37,38,39,40,41],"m\u00f8svatn":[6,26],"new":[0,1,2,3,5,6,7,8,9,10,11,13,14,17,21,25,26,32,33,36,37,38,39,40,41],"null":32,"public":[0,24,32],"return":[0,1,2,3,4,5,6,7,8,9,11,13,14,21,25,26,29,32,33,34,35,36,37,38,39,40,41],"sch\u00f8yen":[6,33,34],"short":[4,5,26,27,34,35],"super":[3,5,33,34],"switch":0,"throw":[3,6,29,35],"true":[0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,19,25,26,27,29,32,33,34,35,36,37,38,39,40,41],"try":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,24,25,26,27,29,32,33,34,35,36,37,38,39,40,41],"var":[1,5,6,10,11,13,18,19,26,29,32,33,34,35,37,39,40,41],"while":[0,1,3,4,5,6,7,8,9,11,12,13,23,29,32,33,34,35,36,37,38,39,40,41],A:[2,3,5,6,7,10,11,12,13,16,18,20,22,24,25,26,27,28,29,30,31,33,37,38,39],AND:2,And:[0,3,4,5,6,9,13,20,23,24,26,27,29,39,40,41],As:[0,1,2,3,4,5,6,8,10,12,13,16,25,26,27,29,32,33,34,35,36,37,38,39,40,41],At:[0,4,6,13,26,32,37],BE:[0,32],Be:[2,24,32,41],Being:[13,37],But:[0,1,2,3,5,6,9,10,27,29,33,34,35,40,41],By:[0,3,5,6,12,13,17,25,32,33,34,35,36,37,38,39],For:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,40,41],IF:[6,34,35],IN:31,If:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,21,24,25,26,27,29,32,33,34,35,36,37,38,39,40,41],In:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,21,22,23,24,25,26,27,29,31,32,33,34,35,36,37,38,39,40,41],Is:11,Ising:[5,12,33,38,39],It:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,24,25,26,27,29,32,33,34,35,36,37,38,39,40,41],Its:[1,2,4,11,39,40,41],NO:[7,11,36],No:[3,4,6,9,32,34,36,38],Not:[0,1,5,6,32,33,34,35,38,39,40,41],OR:[23,29],Of:29,On:[0,3,15,28,29,30,31,32],One:[0,1,3,4,5,6,7,8,11,12,13,17,20,21,26,29,33,35,36,37,38,39,40,41],Or:[0,1,6,26,32,36,40,41],Such:[0,6,12,16,29,35,36,37,38,39],That:[0,5,7,10,11,12,14,19,26,29,32,34,35,36,39],The:[4,10,13,14,15,16,18,19,20,21,22,25,26,27,28,29,30,31],Their:[23,39,40,41],Then:[0,1,6,8,9,10,11,12,13,14,25,26,32,33,35,36,37,38,39,40,41],There:[0,3,4,5,6,8,9,11,12,14,23,25,26,28,29,30,32,33,34,36,37,38,39,41],These:[0,3,4,5,8,9,10,11,12,13,14,15,16,25,26,27,29,30,32,33,34,37,38,39,40,41],To:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,21,25,26,27,29,34,35,36,37,38,39,40,41],With:[0,5,6,8,9,10,11,12,14,18,25,26,27,29,32,33,35,38,39],_0:[5,8,10,11,13,33,36,37],_1:[2,5,6,8,10,11,12,13,14,25,33,34,35,36,37,38,39,40,41],_2:[2,5,8,11,12,13,25,33,37,38,39,41],_3:25,_4:25,_9:[13,37,38],_:[0,1,2,4,5,6,7,8,9,10,11,12,13,17,18,19,21,25,26,32,33,34,35,36,37,38,39,40,41],_________________________________________________________________:4,__call__:[3,4],__class__:10,__doc__:[6,35],__future__:[8,9],__getattr__:34,__getitem__:[],__init__:[1,3,34,39,40,41],__main__:[2,41],__name__:[2,10,34,41],__traceback__:[3,4],_auto10:[6,12,38,39],_auto11:[6,38],_auto12:[6,38],_auto1:[2,3,4,5,6,7,12,13,21,25,29,33,36,37,38,39,41],_auto2:[2,3,4,5,6,12,13,25,29,37,38,39,41],_auto3:[3,4,5,6,12,13,25,37,38,39],_auto4:[4,6,12,13,25,37,38,39],_auto5:[4,6,12,13,25,37,38,39],_auto6:[4,6,12,25,38,39],_auto7:[4,6,12,25,38,39],_auto8:[6,12,38,39],_auto9:[6,12,38,39],_base:8,_build:[0,17,19,24,26,31,32],_build_call_output:[3,4],_c:[1,39,40,41],_call:[3,4],_call_flat:[3,4],_check_optimize_result:[7,11,36],_compon:11,_coordinate_desc:6,_decor:[0,32],_depth:9,_distn_infrastructur:36,_eagerdefinedfunct:[3,4],_fraction:9,_handl:[3,4],_i:[0,1,2,5,6,7,8,11,12,13,15,16,17,19,26,32,33,34,35,36,37,38,39,40,41],_inference_funct:[3,4],_interpolatefunctionerror:[3,4],_j:[0,1,2,3,5,6,8,13,17,19,26,33,34,35,37,39,40,41],_jit_compil:[3,4],_k:[13,36,37,38],_l:[12,38,39,40],_lambda:[6,32],_leaf:9,_lock:[3,4],_logist:[7,11,36],_m:10,_make_vjp:[13,38],_maybe_define_funct:[3,4],_multilayer_perceptron:[1,39,40,41],_n:[2,5,8,11,13,33,36,37,41],_node:[9,13,38],_notokstatusexcept:[3,4],_num_output:[3,4],_p:[5,8,33],_process_traceback_fram:[3,4],_r:[3,4],_ratio:11,_sampl:9,_select_forward_and_backward_funct:[3,4],_split:[6,9,26],_src:21,_stateful_fn:[3,4],_stateless_fn:[3,4],_t:[13,21,37,38],_test:[6,26],_trace:[13,38],_unpad:[],_valu:[13,38],_varianc:11,_weight:9,a0:3,a0faa0:[9,10],a1:[0,32],a2:[0,32],a3:[0,32],a4:[0,32],a_0:[0,21,22,27,32],a_1a:[0,32],a_1x:[21,22,27],a_2a:[0,32],a_2x:[21,22,27],a_3:[0,32],a_3a:[0,32],a_4:[0,32],a_4a:[0,32],a_:[0,1,16,25,32,33,39,40,41],a_h:[1,39,40,41],a_i:[0,1,2,12,32,39,40,41],a_j:[1,12,39,40],a_k:[0,1,12,39,40],aaron:31,ab:[0,2,5,13,14,21,32,33,34,37,38,41],ab_channel:24,abandon:[1,40,41],abbrevi:28,abid:29,abil:[0,10,32],abl:[0,1,4,5,6,7,10,12,13,16,26,33,36,37,38,39,40,41],about:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,24,25,26,27,30,34,35,36,37,38,39,40,41],abov:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,23,25,26,27,29,31,32,33,35,36,37,38,39,40,41],abovement:[6,35],abscissa:[13,36,37],absolut:[0,2,5,6,13,32,33,34,35,37,38,41],absorb:[33,34],acceler:[13,21,37,38],accept:[0,3,6,9,26,32,33],access:[0,3,11,29,33],accid:[4,6,35,36],accompani:[0,32,33],accomplish:[8,9,13,37,38],accord:[0,1,2,5,6,9,12,13,14,15,16,29,32,34,35,36,37,38,39,40,41],accordingli:11,account:[0,3,5,13,15,29,32,34,35,37,38],accumul:[12,13,21,29,37,38,39],accur:[0,3,4,6,10,13,35,37,38],accuraci:[0,1,3,4,5,6,7,9,10,11,12,27,32,33,36,38,39,40,41],accuracy_scor:[0,1,10,32,39,40,41],accuracy_score_numpi:[1,39,40,41],achiev:[0,1,5,6,8,12,25,32,34,35,38,39,40,41],aco:29,acquaint:[24,32],acquir:[1,24,32,40,41],acr:[0,33],across:[1,3,6,9,24,32,35,39,40,41],act:[1,3,25,39,40,41],action:29,activ:[0,2,3,4,9,23,28,30,32,35,36,37],actual:[0,1,4,5,6,8,11,16,25,29,32,33,34,35,40,41],ad:[1,3,4,5,8,13,15,16,25,34,35,36,37,40,41],ada_clf:10,adaboostclassifi:10,adadelta:[13,37,38],adagrad:[22,27],adam:[1,3,4,22,27,30,32,40,41],adapt:[4,6,13,31,33,35,36],add:[0,1,2,3,4,5,6,8,10,11,12,15,16,17,21,22,26,27,29,32,33,34,35,37,39,40,41],add_outgrad:2,add_subplot:[1,7,12,14,36,38,39,40,41],addendum:5,addit:[0,2,3,5,6,7,8,9,10,12,13,15,17,21,22,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,41],addition:[12,13,36,37,38,39],address:[1,9,11,13,32,37,38,40,41],adjac:[3,12,38,39],adjoint:[5,33,34],adjust:[0,5,12,13,36,37,38],admir:[0,32],advanc:[4,6,12,31,32,35,38,39],advantag:[1,3,5,6,10,13,25,34,35,36,37,38,39,40,41],adversari:32,afecionado:32,affect:3,affin:[0,3,8,11,33],afford:3,aficionado:32,aforement:14,african:[0,33],after:[0,1,2,4,5,6,9,11,12,13,15,20,21,24,25,26,27,29,32,33,34,35,37,38,39,40,41],afterward:[0,32],ag:[0,7,28,32,33,36],ag_0:[2,41],again:[0,1,4,5,6,7,8,10,11,12,13,15,16,21,22,23,26,27,29,32,33,34,35,37,38,39,40,41],against:[1,4,7,10,21,22,27,36,39,40,41],agegroup:[7,36],agegroupmean:[7,36],aggreg:[9,10],agorithm:10,agre:[5,6,29,34,35],agreement:[13,21,37,38],ahead:9,ai:[0,27,31],aid:[11,20],aim:[0,1,4,6,7,11,14,15,16,24,25,26,27,33,35,36,40,41],ainv:5,airplan:3,aka:[5,34,35],al:[0,2,4,15,16,17,27,31,32,33,34,35,36,37,38,39,40,41],alarm:[5,7,34,35],algebra:[0,3,5,13,21,24,33,34,35,37,38],algorithm:[0,1,2,4,5,6,7,8,13,14,22,24,25,26,29,31,32,34,35,36,41],align:[0,2,5,6,7,8,13,26,29,32,33,34,35,36,37,41],all:[0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],allevi:[1,13,36,37,40,41],alloc:[3,25],allow:[0,1,2,3,5,6,8,10,13,15,16,24,25,26,32,33,34,35,36,37,38,39,40,41],almost:[0,1,6,8,11,13,21,29,32,35,36,37,38,40,41],alon:[2,9,41],along:[2,3,4,5,6,9,10,11,24,25,32,33,34,35,36,41],alpha:[0,1,2,3,4,6,7,8,9,10,13,14,29,32,33,35,36,37,39,40,41],alpha_0:3,alpha_1:3,alpha_2:3,alpha_:10,alpha_i:[3,13,37],alpha_k:[13,37],alpha_m:10,alpha_n:3,alpha_opt:[13,37],alreadi:[2,3,4,5,6,10,12,24,25,29,32,33,34,35,38,39,41],also:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,24,25,26,27,28,29,32,33,34,35,36,37,38,39,40,41],alter:[1,39,40,41],altern:[0,1,4,5,6,7,8,9,11,13,25,26,32,33,34,35,36,37,38,39,40,41],although:[0,1,5,6,8,10,13,16,21,32,34,35,37,38,40,41],alwai:[0,3,5,6,12,13,16,21,29,32,33,34,35,36,37,38,39],am:[4,33],ame2016:[0,32],american:[0,33],among:[0,3,5,9,10,12,25,32,33,34,38,39],amongst:[5,34,35],amount:[0,1,3,4,6,8,10,14,24,35,40,41],an:[1,2,3,5,6,7,8,9,11,12,13,14,15,16,17,19,20,21,24,25,26,27,29,30,31,33,34,35,36,37,38,39,40,41],an_:29,anaconda:[0,1,15,24,26,32,40,41],analog:[13,37,38],analys:[6,34,35],analysi:[1,3,4,7,14,15,16,17,19,21,22,25,31,36,39,40,41],analyt:[2,3,5,6,7,12,13,15,22,24,26,27,32,33,34,35,36,37,38,39],analytical_gradi:21,analyz:[0,1,3,4,5,6,16,17,26,27,29,32,33,34,39,40,41],andrew:[1,39,40,41],angl:[0,3,9,33],anharmon:3,ani:[0,1,2,3,4,5,6,7,8,9,10,12,14,18,29,32,33,34,35,38,39,40,41],anim:[4,12,38,39],ann:[12,38,39],annot:[0,1,3,7,8,32,33,36,39,40,41],announc:32,anoth:[0,1,3,4,5,6,7,8,10,11,12,13,25,26,27,29,32,33,36,37,38,39,40,41],ans_vspac:[],ansatz:[0,32],answer:[0,1,3,5,6,25,26,27,30,32,34,35,39,40,41],antialias:[2,6,26,41],anticip:4,anymor:[1,8,40,41],anyon:[4,8],anyth:[1,29,40,41],anytim:[30,32],apach:[1,40,41],apart:[11,13,36,37],api:[1,24,32,40,41],appar:[2,41],appear:[0,1,3,13,16,25,29,32,37,38,39,40,41],append:[1,3,4,8,9,13,21,32,37,40,41],appendix:26,appl:[3,4],appli:[0,1,2,3,4,6,7,8,9,10,11,12,13,15,16,26,27,29,31,32,33,34,35,36,37,38,39,40,41],applic:[0,1,3,4,5,6,7,9,12,13,21,25,26,29,31,32,33,35,36,37,38,39,40,41],apply_gradi:4,approach:[1,2,4,5,6,9,10,11,12,13,17,21,24,29,31,33,36,39,40,41],appropri:[2,6,9,12,13,24,29,35,37,38,39,41],approv:32,approx:[0,2,3,6,10,11,13,29,32,35,36,37,38,41],approxim:[0,1,2,3,4,5,6,7,10,11,13,18,19,26,29,32,33,34,35,36,37,38,40,41],apt:[0,15,24,26,32],aq:29,ar:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],aragorn:32,arang:[1,3,4,6,7,9,10,12,13,26,32,36,37,38,39,40,41],arbitrari:[1,4,6,8,12,13,29,35,36,37,38,39,40,41],arbitrarili:[0,1,11,32,39,40,41],arc:[6,26],architectur:[3,4,12],archiv:27,area:[0,3,6,9,26,31,32],arg:[0,2,3,4,13,32,38],argmax:[1,11,39,40,41],argmin:[4,10,14],argnum:[2,13,38],argnum_0:[],argnum_1:[],args_with_tang:[3,4],argsort:11,argu:[1,13,37,38,40,41],argument:[0,2,3,5,6,11,12,13,21,26,32,33,34,35,39,41],argval:[],aris:[0,6,12,13,29,32,35,36,37,39],arithmet:[0,13,25,32,37,38],arm:[6,34],armadillo:25,around:[0,1,4,5,6,11,29,32,34,35,39,40,41],arr:[],arrai:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,21,24,26,29,33,34,35,36,37,38,39,40,41],arrang:[3,32],arraybox:[13,37,38],arriv:[0,6,9,11,25,29,32,35],arrow:[12,38,39],arrowprop:8,art3d:[13,37],art:[0,1,15,24,32,40,41],articl:[0,3,4,6,10,18,27,32,33,34,35],artifici:[0,2,7,12,31,32,36,41],artificialneuron:[12,38,39],arug:[13,37,38],arxiv:[3,4,21,27,37,38],as_fram:33,asap:32,asarrai:[0,2,6,9,21,33,34,37],ashort:20,asid:33,ask:[5,6,11,12,34,35,39],aspect:[0,6,24,26,32,33,34],assembl:[0,3,32],assert:4,assess:[0,6,26,32,33,34,35],assici:4,assign:[0,7,8,9,12,13,14,28,30,31,32,33,36,37,38,39,40,41],associ:[0,6,9,12,14,29,32,35,38,39],assum:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,19,25,26,29,32,33,34,35,36,37,38,39,40,41],assumpt:[0,3,5,6,9,11,18,26,29,32,33],ast:[0,5,6,18,26,32,34,35,36],astronomi:[32,33,34,35,36,37,38,39,40,41],astyp:[4,9,10],asymmetri:[0,32],asymptot:[4,6,35],async_wait:[3,4],atla:32,atom:[0,32],attempt:[0,4,6,7,8,10,32,34,36],attend:28,attent:[0,25,32],attr:[3,4,34],attract:[0,10,32],attribut:[0,9,13,27,32,34,35,41],attributeerror:[13,34],audi:[0,32],audio:[3,4],august:[15,16,32],aurelien:[0,15,28,31,32,38,40,41],austfjel:[6,26],author:[0,1,10,29,32,40,41],authour:32,auto:[6,9,10,29],autocor:29,autocorrelation_tim:29,autocorrelform:29,autocovari:29,autoencod:[4,24,32],autoencond:24,autograd:[22,24,27,32],autom:[0,24,31,32],automac:25,automag:32,automat:[0,1,2,3,4,11,16,22,23,24,25,32,39,40],automobil:3,autonom:4,avail:[0,1,4,6,10,11,15,20,21,24,25,26,27,28,30,31,32,35,39,40,41],averag:[0,1,3,6,9,10,13,14,21,29,30,32,33,34,35,36,37,38,39,40,41],avoid:[0,4,5,6,9,11,13,21,25,32,33,35,36],awai:[2,3,6,33,34,35,41],awar:[2,10,41],award:[30,32],ax:[0,1,2,3,4,6,7,8,9,10,11,12,13,14,25,26,27,32,33,35,36,37,38,39,40,41],axes3d:[2,6,13,26,36,37,41],axes_grid1:6,axessubplot:33,axhlin:8,axi:[0,1,2,3,4,6,7,8,9,10,11,12,13,14,21,25,26,29,32,33,34,35,36,37,38,39,40,41],axiom:[5,34,35],axlabel:[0,32],axvlin:[4,8],axvspan:4,b1:8,b2:8,b3:8,b:[0,1,3,4,5,6,8,9,10,12,13,14,15,16,21,29,30,32,33,34,35,36,39,40,41],b_0:0,b_1:[0,2,12,13,37,38,39,41],b_2:[0,13,37,38],b_5:[13,37,38],b_:[0,1,25,39,40,41],b_group:9,b_i:[0,1,2,12,32,38,39,40,41],b_ia_:[0,32],b_ia_i:0,b_index:9,b_j:[1,12,38,39,40,41],b_k:[0,1,12,13,37,38,39,40,41],b_m:[12,38,39],b_score:9,b_valu:9,bachelor:[28,30],back:[0,3,4,5,6,8,9,10,15,23,25,27,29,32,33,34,36,37,38],backbon:25,backend:[1,4,21,40,41],background:[31,32,33],backpropag:[1,39,40,41],backtrack:9,backup:25,backward:[1,2,4,12,25,39,40,41],backward_pass:2,bad:[6,33,34],badli:29,bag:[9,24,32],bag_clf:10,baggin:32,baggingboot:10,baggingclassifi:10,baggingtre:10,balanc:[6,35,36],baluka:41,band:25,bandwidth:25,bar:[0,6,11,15,16,26,32],barber:31,bare:[4,10],base:[0,1,3,4,5,7,8,9,10,14,24,29,30,31,32,33,34,36,39,40,41],basi:[5,7,8,10,11,12,13,25,33,34,36,37,38,39],basic:[6,8,12,13,14,24,26,29,32,37,38,39,40],batch:[3,4,11,12,13,21,22,27,36,39],batch_shap:4,batch_siz:[1,3,4,39,40,41],batchnorm:4,bay:[7,36],bayesian:[5,24,31,32,34,35],beam:[32,35,36,37,38,39,40,41],becattini:30,becaus:[0,1,2,3,4,5,6,8,9,12,13,14,32,34,35,36,37,38,39,40,41],beccatini:32,becom:[0,1,2,5,6,7,9,12,13,21,29,32,33,34,35,36,37,38,39,40,41],been:[0,1,2,3,4,5,6,11,12,13,24,25,26,27,32,33,34,35,37,38,39,40,41],befor:[0,1,2,3,4,5,6,7,8,12,13,14,25,26,27,29,32,33,34,35,36,37,38,39,40,41],beforehand:[0,29,32],begin:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,21,23,25,26,29,30,32,33,34,35,36,37,38,39,40,41],behav:[1,6,13,35,36,37,40,41],behavior:[0,1,13,32,36,37,38,40,41],behaviour:[12,38,39],behind:[0,1,6,8,13,32,36,37,39,40,41],being:[0,1,2,3,4,5,7,8,10,11,12,13,17,29,32,33,34,35,36,37,38,39,40,41],believ:[9,25],belong:[7,8,9,13,14,36,37,38],below:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,25,26,27,29,32,33,34,35,36,37,38,39,40,41],benchmark:10,benefici:[1,13,37,38,39,40,41],benefit:[0,1,4,11,13,15,24,32,36,37,38,39,40,41],bengio:[1,21,22,27,28,31,32,33,37,38,40,41],benign:[1,7,9,36,40,41],besid:[4,5,34],bessel:[5,33,34,35],best:[0,1,2,3,4,5,6,7,8,9,10,12,13,26,27,30,32,33,35,36,37,39,40,41],best_estimator_:36,beta1:[21,37,38],beta2:[21,37,38],beta:[0,1,3,5,6,7,10,11,13,16,17,18,19,21,26,32,33,36,37,38,39,40],beta_0:[0,1,3,5,6,7,13,32,33,34,35,36,37,39,40],beta_0x_:[0,32,33],beta_1:[0,1,3,5,6,7,10,13,32,33,34,35,36,37,38,39,40],beta_1x_0:[0,32],beta_1x_1:[0,7,32,36],beta_1x_2:[0,32],beta_1x_:[0,32,33],beta_1x_i:[7,13,33,36,37],beta_2:[0,3,13,32,33,37,38],beta_2x_0:[0,32],beta_2x_1:[0,32],beta_2x_2:[0,7,32,36],beta_2x_:[0,32,33],beta_2x_i:33,beta_3:3,beta_3x_i:33,beta_4x_i:33,beta_:[0,3,6,7,13,32,33,34,35,36,37,38],beta_i:[0,3,5,17,32,33,34],beta_j:[0,5,6,13,18,26,32,33,34,35,37,38],beta_k:[13,36,37],beta_linreg:[13,21,36,37,38],beta_m:10,beta_mg_m:10,beta_n:3,beta_ol:35,beta_p:[7,36],beta_px_p:[7,36],beta_ridg:35,betaol:35,betaridg:35,betavalu:5,better:[0,1,2,3,4,6,9,10,11,12,13,21,32,33,34,35,37,40,41],between:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,17,21,26,27,29,32,33,34,35,36,37,38,39,40,41],beyond:[0,1,5,6,8,13,21,26,32,33,36,37,38,40,41],bf:[13,14,25,29,36,37],bgd:[13,37,38],bia:[0,1,2,3,5,8,9,10,12,13,19,27,32,33,34,36,37,38,39,40,41],bias:[1,2,3,5,6,9,12,23,27,34,38],big:[0,1,2,5,6,14,18,32,34,35,39,40,41],bigger:[1,6,33,34,40,41],bigr:[12,38,39],bike:9,bilbo:32,billion:[3,12,24,38,39],bin:[0,7,29,33,36],binari:[0,3,5,7,9,10,12,23,27,32,34,35,36,41],binarycrossentropi:4,bind:[0,33],binomi:[24,29,32],binsboot:[6,35],bioinformat:[0,32],biolog:[1,12,38,39,40,41],bios1100:[24,32],bird:[0,3,32],birth:32,bishop:[28,31,32],bit:[1,4,25,29,32,39,40,41],bitwis:29,bivari:[2,41],bk:[0,13,33,37,38],bla:[25,32],black:[8,9,14,21],bledso:32,blob:[19,20,26,32,36,37,38],block:[6,10,24,25,29,32,35],blogpost:4,blue:[0,3],bluntli:32,bm:33,bmatrix:[0,1,3,5,7,8,11,13,23,25,32,33,34,36,37,39,40,41],bmi:[1,39,40,41],bodi:[0,1,4,12,32,38,39,40,41],bold:[1,40,41],boldfac:[0,5,16,33,34],boldsymbol:[0,1,2,3,5,6,7,8,10,11,13,14,15,16,17,18,19,21,23,26,32,36,37,38,39,40,41],boltzmann:[12,24,32,38,39],book1:31,book:[19,26,27,31,32,34,41],boost:[1,9,24,32,40,41],boostrap:10,bootstrap:[1,13,19,24,26,27,32,36,37,38,40,41],borrow:32,boston_dataset:[0,33],bot:8,both:[0,1,4,5,6,8,9,10,13,14,15,16,24,25,26,27,29,30,32,33,34,35,36,37,38,40,41],bottl:[7,36],bound:[0,8,12,33,37,38,39],boundari:[2,4,8,11,12,39,41],box:[4,9],boxed_arg:[],boyd:[8,13,36,37],bracket:[4,29],brain:[1,7,12,36,38,39,40,41],branch:9,breast:[5,7,11,27,34,35,36],breat:27,breviti:[13,21,37,38],brew:[0,15,24,26,32],brg:8,brief:[26,27,33],briefli:[0,32],bring:[0,5,6,10,27,32,33,34,40],broad:[0,3,4,32],brought:[13,21,24,32,37,38],brownle:4,browser:32,brute:[3,5,11,33,34,36],bs:[8,9,10],buffer_s:4,bui:4,build:[0,4,5,6,10,25,29,32,34,35,36,37,38,39],built:[0,1,3,4,6,33,35,40,41],bunch:11,busi:[0,33],c1:[8,11],c2:[8,11],c:[0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,19,24,25,29,30,31,33,34,35,36,37,38,39,40,41],c_0:29,c_1:[12,38,39],c_2:[12,38,39],c_3:[12,38,39],c_4:[12,38,39],c_:[0,8,9,10,13,21,29,33,36,37,38],c_i:[12,13,37,38,39],c_k:29,ca:[1,32,40,41],cach:10,cal:[0,8,10,12,13,15,16,32,36,37,39,40],calcul:[0,1,2,4,5,6,8,9,10,11,12,13,14,15,16,18,21,23,25,27,29,32,34,35,36,37,38,39,40,41],california:[27,33],call:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,21,23,24,25,26,27,29,30,32,33,34,35,36,37,38,39,40,41],callabl:[3,4],callback:[3,4],calor:[0,33],cambridg:[13,31,36,37],can:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,23,24,25,26,27,29,30,31,33,34,36,39,40,41],cancel:[0,13,32,33,37,38],cancellation_manag:[3,4],cancer:[5,10,27,34,35],cancerpd:[7,36],candid:[8,9,10,37],cannot:[0,1,4,5,6,7,8,9,28,29,32,33,34,36,39,40,41],canopi:[0,15,24,26,32],canva:[26,27,32],cap:[5,34,35],capabl:[0,1,8,13,24,32,37,38,40,41],capac:[2,30,41],capita:[0,33],caption:[26,27],captur:[4,11,12,38,39],captured_input:[3,4],car:[3,4],card:[0,7,32,36],cardin:[1,40,41],care:[11,36],carefulli:[13,37],carlo:[0,6,24,29,31,32,35],carri:[2,6,7,26,35,36,41],cart:10,casella:31,cast:[1,40,41],cat:[3,4],categor:[0,1,3,9,11,32,39,40,41],categori:[0,1,3,7,10,12,14,32,33,36,38,39,40,41],categorical_crossentropi:[1,3,40,41],caus:[0,5,6,29,32,33,34,35],causal:0,causat:[0,32],cax:[1,40,41],cb:[6,32],cbar:[1,40,41],cc:[0,1,3,4,5,13,27,32,33,34,35,36,37,40,41],ccc:[5,12,34,38,39],cd_fast:6,cdf:29,cdot:[0,2,6,12,13,14,25,29,32,35,36,37,38,39,41],celebr:[13,36,37],cell:[0,2,3,4,6,9,10,13,15,26,32,34,35,36,37,38],center:[0,1,6,7,8,9,11,14,26,29,32,34,35,36,40,41],central:[0,3,5,6,8,16,25,27,32,33,34],centroid:[14,29],centroid_differ:14,centuri:3,certain:[0,3,6,7,9,29,32,33,35,36],certainti:35,cg:[13,37],cha:[0,33],chain:[0,1,13,24,29,32,37,38,40,41],challeng:[37,38],chanc:[1,5,13,29,34,35,37,38,39,40,41],chang:[0,1,2,3,4,5,6,8,9,11,12,13,14,21,25,26,27,29,32,33,34,35,36,37,38,39,40,41],channel:3,chap4:[39,40,41],chapter3:[0,19,26],chapter:[0,6,10,11,18,21,22,25,26,27,31,32,33,34,35,36,37,38,39,40,41],charact:[0,3,5,8,32,33],character:[8,9,10,12,29,38,39],characterist:[0,1,3,10,13,21,32,37,38,40,41],charg:[0,32],charl:[0,33],chase:4,chat:32,chd:[7,36],chddata:[7,36],cheap:[5,33],cheaper:[1,13,37,38,40,41],check:[0,1,3,4,5,6,11,13,25,32,33,37,38,40,41],checkmark:3,checkpoint:4,checkpoint_dir:4,checkpoint_prefix:4,chen:10,chiaramont:[2,41],choic:[0,1,2,3,4,6,9,12,13,14,19,25,27,32,33,35,36,37,38,39],choleski:[5,25,33],choos:[2,3,6,9,10,11,13,14,23,26,27,35,36,37,38],chosen:[0,1,2,6,8,9,10,13,16,21,27,29,32,35,36,37,38,40,41],chosen_datapoint:[1,39,40,41],christian:31,christoph:[28,31,32],cifar10:3,cifar:3,circ:[1,12,39,40,41],circl:[0,8,12,33,38,39],circuit:3,circumfer:9,circumv:[1,5,13,33,37,38,40,41],ckpt:4,clariti:29,class_nam:[3,9],class_val:9,class_valu:9,class_weight:[3,4],classic:[7,9,13,36,37,38,39],classif:[0,3,5,6,7,8,11,12,23,24,26,31,32,33,34,35,37,41],classifi:[0,1,4,7,9,10,11,27,32,39,40,41],classificaton:[1,39,40],classifii:10,clean:[1,39,40,41],clear:[1,5,10,12,13,21,37,38,39,40,41],clearli:[0,3,5,6,7,8,18,29,33,34,35,36],clever:[1,10,39,40,41],clf3:0,clf:[0,6,8,9,10,32,33],clf_lasso:6,clf_ridg:[6,32],clip:[3,29],clone:30,close:[0,1,2,4,6,8,9,11,12,13,14,26,29,31,32,35,36,37,38,39,40,41],closer:[3,5,13,33,37,38],closest:[8,11,13,14,37],closur:[24,32],cloud:[24,32],cluster:[0,1,4,6,11,24,32,35,39,40,41],cluster_label:14,cm:[1,2,3,6,8,9,13,26,36,37,39,40,41],cmap:[0,1,2,3,4,6,8,9,10,26,32,39,40,41],cmap_arg:6,cmb:28,cmd:9,cmu:33,cn_:29,cnn:[12,38,39],cnn_kera:3,cntk:[24,32],co:[0,2,3,6,9,13,21,32,35,37,38,41],code:[3,4,6,7,8,15,16,17,19,22,23,24,25,26,29,31],coef0:8,coef:[0,32],coef_:[0,5,6,8,9,13,32,33,34,35,36,37],coeff:5,coeffici:[0,3,5,6,7,8,9,13,15,16,25,32,33,34,35,36,37,38],coerc:[0,6,32,35],coin:[10,29],coin_toss:10,col:[0,11,32,33],colab:[24,32],cold:9,colinear:[0,33],collabor:[26,27],collaps:8,collect:[0,2,6,10,11,21,24,29,31,32,35],collinear:[5,33,34],color:[0,3,4,6,8,9,10,21,26,29,37],color_channel:3,color_cod:6,colorbar:[1,6,26,40,41],colsample_bytre:10,colsaobject:10,colspec:[0,32],column:[0,1,2,5,6,7,8,9,11,12,17,25,32,33,34,35,36,38,39,40,41],columntransform:9,com:[4,6,19,20,21,24,26,27,31,32,34,36,37,38,39,40,41],combin:[1,2,5,6,7,10,29,34,35,36,37,38,40,41],come:[0,1,3,4,5,12,13,14,15,27,32,33,34,35,37,38,39,40,41],command:[0,1,32,40,41],comment:[0,4,5,6,15,16,26,27,32,33],commerci:[0,15,24,26,32],commod:[0,32],common:[0,1,3,5,6,7,9,11,13,14,26,27,29,32,33,35,36,37,38,39,40,41],commonli:[0,1,4,6,7,9,13,14,33,35,36,37,38,39,40,41],commun:[0,12,26,38,39],commut:3,commutatitav:3,compact:[0,1,3,5,6,7,9,11,12,13,14,32,33,34,35,37,38,39,40,41],compair:0,compar:[0,3,4,5,6,11,13,15,16,21,22,23,25,26,27,32,33,34,35,36,37,38],comparison:[2,4,13,27,37,38,41],compat:[7,36],compet:[0,32],competit:10,compil:[0,1,3,4,13,15,21,24,25,32,37,38,40,41],complet:[0,2,3,4,9,12,32,38,39,41],completenn:[12,38,39],complex:[1,5,8,9,11,12,13,15,16,19,27,32,35,37,38,39,40,41],complic:[0,1,9,13,32,35,36,39,40,41],compoment:33,compon:[0,1,3,4,5,6,7,9,14,16,24,32,33,34,35,36,39,40,41],components_:11,compos:[9,12,13,14,21,24,32,37,38,39],compphys:[0,6,17,19,20,24,26,28,30,31,32,33,36,37,38],compress:[0,32,33],compris:[6,36],compromis:[5,33],compulsori:[24,32],comput:[0,1,2,3,4,5,6,7,8,10,11,12,13,15,16,17,21,24,25,26,27,28,29,31,32,33,34,35,36,39,40,41],computation:[0,3,6,9,13,29,32,36,37,38],computationalscienceuio:32,computerlab:[26,27],con:27,concat:32,concaten:[2,4,6,14,41],concav:[1,9,13,33,36,37,40,41],concentr:[0,10,33],concept:[0,2,24,32,33,41],conceptu:[12,13,36,37,38,39],concern:[0,1,4,7,32,36,39,40,41],concic:32,conclud:[0,5,13,21,34,35,37,38],conclus:[1,39,40,41],concretefunct:[3,4],cond:[2,41],conda:[0,1,15,24,26,32,40,41],condis:33,condit:[0,2,4,5,6,8,9,11,13,29,32,33,38,41],conduct:[24,32],condwav:[2,41],confid:[0,5,6,7,8,18,26,32,33,34,36],configur:[3,21],confirm:[5,12,34,35,38,39],confus:[5,6,7,10,25,33,34,35],confusion_matrix:9,congruenti:29,conjug:[4,8],conjugaci:[13,37],conjunct:3,connect:[0,1,3,4,9,11,12,13,25,32,33,36,37,38,39,40,41],consequ:[5,6,8,10,12,13,33,34,35,36,37,38,39],conserv:[5,14,33],consid:[0,1,2,3,5,6,7,8,9,10,12,13,16,19,21,25,26,27,29,32,33,34,35,36,37,38,39,40,41],consider:[0,1,5,13,32,33,34,35,36,37,39,40,41],consist:[0,1,2,3,4,6,12,13,19,21,26,27,29,33,35,36,37,38,39,40,41],constant:[0,2,4,5,6,8,12,13,29,32,33,34,35,36,37,38,39,41],constitu:[0,32],constitut:[2,6,35,36,41],constrain:[1,3,5,7,11,34,36,39,40,41],constraint:[5,6,8,13,17,33,34,35,37,38],construct:[0,1,2,3,5,6,7,8,9,10,11,23,25,29,32,33,34,35,36],consult:27,contact:[0,32],contain:[0,2,3,4,5,6,7,8,9,11,12,13,17,19,21,22,23,25,26,27,29,31,32,33,34,35,36,37,38,39,41],contemporari:32,content:[1,24,25,32,40,41],context:[3,4,6,10,13,26,35,36,37,38],contigu:25,continu:[0,1,2,3,4,5,6,7,8,9,10,12,13,17,18,21,22,25,26,27,29,32,33,34,35,36,37,39,40,41],contour:[9,10,13,37],contourf:[8,9,10],contrast:[1,4,9,10,12,38,39,40,41],contribut:[0,3,5,13,21,29,32,33,34,37,38],contributor:[0,26,32],control:[0,1,3,9,13,15,24,32,37,38,39,40,41],conv2d:[3,4],conv2dtranspos:4,conv:[3,4],convei:32,conveni:[0,5,6,12,13,25,26,27,32,34,35,36,37,38,39,40],convent:[12,33,39],converg:[1,2,4,5,6,7,8,11,13,14,21,22,27,33,34,36,37,38,39,40,41],convergencewarn:[1,6,7,8,11,36,39,40,41],convert:[0,1,4,5,9,11,13,25,32,33,37,38,40,41],converttomatrix:4,convex:[4,5,7,33],convinc:[13,36,37],convolut:[1,4,24,32,40,41],cool:[4,9],coolwarm:[6,26],coordin:[5,12,14,33,34,38,39],coorel:[0,33],copi:[0,1,14,33,39,40,41],copyright:[27,35,41],core:[2,3,4,10,13,32,38],corel:32,coronari:[7,36],corr:[0,5,7,11,33,36],correalt:[11,24],correct:[0,1,2,3,4,5,7,13,25,29,32,33,34,35,37,38,39,40,41],correctli:[1,2,6,7,10,27,39,40,41],correl:[0,1,3,5,6,7,10,12,13,21,24,29,32,34,35,37,38,39,40,41],correlation_matrix:[0,5,7,11,33,36],correspond:[0,3,5,6,8,9,11,12,15,16,17,24,25,26,29,32,33,34,35,38,39],corss:41,cortex:[12,38,39],cosin:[3,6,35],cost:[0,2,3,5,6,7,8,9,12,13,16,17,19,21,23,26,27,32,38],cost_deep_grad:[2,41],cost_funct:[2,41],cost_function_deep:[2,41],cost_function_deep_grad:[2,41],cost_function_grad:[2,41],cost_grad:[2,41],cost_sum:[2,41],costol:[13,21,37,38],could:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,17,25,26,27,29,32,33,34,35,36,37,38,39,40,41],coulomb:[0,32],count:[0,9,28,29,30,32],countor:[13,37],coupl:[4,5,6,34,35],cours:[0,1,3,5,11,26,27,28,30,33,35,40],courvil:[21,22,27,28,31,32,33,37,38],cov:[5,6,11,25,29,32,33,34,35],cov_xi:[5,11,33],cov_xx:[5,11,33],cov_yi:[5,11,33],covari:[0,7,24,25,32,34,36],covariance_matrix:[5,11,14,33],cover:[0,5,17,24,30,31,33,34],covert:[0,32],covxi:29,covxx:29,covxz:29,covyi:29,covyz:29,covzz:29,cpu:[1,3,4,40,41],cpu_util:[3,4],craft:3,crawford:32,creat:[1,2,3,4,5,6,9,10,11,12,13,24,26,32,34,36,37,38,39,40,41],create_biases_and_weight:[1,39,40,41],create_convolutional_neural_network_kera:3,create_neural_network_kera:[1,40,41],create_x:[5,11,33],credit:[0,7,30,32,36],crim:[0,33],crime:[0,33],criteria:[0,4,9,10,14,29,32],criterion:[9,10,13,36,37],critic:[6,26,32,33,34],critiqu:[26,27],cross:[0,1,3,7,9,10,13,23,24,27,29,32,33,34,37,38,39,40,41],cross_entropi:4,cross_val_scor:[6,35,36],cross_valid:[7,10,36],crossvalid:[6,35],crucial:[1,29,40,41],cs231:3,cs231n:41,cs231n_2017_lecture4:41,cs:[28,30],csr_matrix:[25,32],csv:[0,4,6,7,9,32,35,36],ctnk:[1,40,41],ctx:[3,4],cubic:0,cumbersom:[5,34,35],cumsum:[10,11,32],cumul:[7,10,29],cumulative_heads_ratio:10,cup:[5,34,35],current:[1,2,3,4,6,13,14,21,26,31,36,37,38,40,41],curs:[0,33],curv:[6,7,10,12,26,36,38,39],curvatur:[13,36,37,38],custom:[6,14,26],custom_cmap2:[9,10],custom_cmap:[9,10],cutpoint:9,cv:[6,7,10,35,36],cvxbook:[13,36],cvxopt:[5,8,33],cycl:[1,12,38,39,40,41],cyclotron:[33,34],d2_g_t:[2,41],d:[1,2,3,4,5,6,7,8,9,10,11,13,14,25,29,30,32,33,34,35,36,37,38,39,40,41],d_f:[13,36,37],d_g_t:[2,41],d_net_out:[2,41],da:3,dagger:[5,25,33],dai:[1,9,24,39,40,41],damp:3,daniel:[30,32],darget:9,darkr:29,dat:[0,32],dat_id:[0,6,7,9,32,33,35,36],data1:14,data2:14,data3:14,data4:14,data:[2,4,5,8,10,12,13,14,17,18,19,21,22,25,27,31,35,37,38],data_handl:[3,4],data_id:[0,6,7,9,32,33,35,36],data_indic:[1,39,40,41],data_modul:33,data_panda:32,data_path:[0,6,7,9,32,33,35,36],data_url:33,databas:[1,39,40,41],datafil:[0,6,7,9,26,32,33,35,36],datafram:[0,4,5,7,9,11,32,33,36],datapoint:[1,5,6,7,11,13,33,35,36,37,38,39,40,41],dataset:[0,4,6,7,8,9,10,11,13,14,15,16,19,26,27,32,33,35,36,37,38],datatyp:4,date:[15,16,17,18,19,20,21,22,23,26,27,32,33,34,35,36,37,38,39,40,41],daughter:10,david:31,davison:35,dbh:[1,39,40,41],dbo:[1,39,40,41],dc5e85cd93c3:27,dcomposit:25,ddot:[2,41],dead:[1,40,41],deadlin:[16,17,18,19,20,21,22,23,28],deal:[0,1,3,5,6,8,11,13,14,17,18,25,26,29,32,33,34,35,36,37,38,39,40,41],dealt:0,debt:[7,36],debug:[0,5,6,23,34,35,36,41],decad:[0,3,32],decai:[0,13,29,32],decemb:[28,30,32],decent:10,decid:[0,2,3,5,6,9,26,34,35,36,41],decim:[0,32],decis:[0,1,8,11,24,31,32,39,40,41],decision_funct:8,decision_tre:9,decisiontreeclassifi:[9,10],decisiontreeregressor:[0,9,10],declar:[0,4,25,32],decompos:[5,6,25,33],decomposit:[0,6,12,26,32,34,38,39],decompost:[5,33],deconvolut:3,decor:[0,32],decorrel:[10,13,21,37,38],decreas:[1,2,4,5,6,10,11,13,34,35,36,37,38,39,40,41],deduc:[0,32],deep:[3,7,12,13,21,24,27,28,31,32,33,37,38,39],deep_neural_network:[2,41],deep_param:[2,41],deep_tree_clf1:9,deep_tree_clf2:9,deep_tree_clf:[9,10],deepen:[5,24,32],deeper:[0,3,4,32],deepimag:41,deeplearningbook:31,deer:3,def:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,21,26,29,32,33,34,35,36,37,38,39,40,41],def_covari:29,def_funct:[3,4],default_tim:4,defect:[5,33],defici:[5,33],defin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,23,25,26,27,29,33,34,35,36,37,38],definit:[1,2,5,6,7,8,10,11,12,13,17,25,29,33,34,35,36,37,40,41],defint:29,defun:[3,4],defvjp:[],degre:[3,5,6,8,9,10,11,15,16,17,19,26,29,32,34,35,36],del:[1,40,41],delet:6,delimit:4,deliv:[28,32],delta:[0,2,3,6,8,12,13,14,21,32,37,38,39,40,41],delta_0:3,delta_1:3,delta_2:3,delta_3:3,delta_4:3,delta_5:3,delta_:[1,25,39,40],delta_h:[0,1,32,39,40,41],delta_j:[3,12,39,40],delta_k:[12,39,40],delta_l:[1,3,39,40,41],delta_momentum:[13,21,37,38],delta_n:[0,3,32],delug:24,delv:[0,32],demand:[13,36,37],demonstr:[0,3,5,6,7,11,12,24,32,33,34,35,36,39],demystifi:[38,39,40,41],den:4,denomin:[1,5,34,35,39,40,41],denot:[1,2,6,7,13,29,36,37,38,39,40,41],dens:[1,3,4,40,41],dense_1:4,densiti:[0,2,6,29,32,35,41],depart:[27,30,32,33,34,35,36,37,38,39,40,41],depend:[0,1,2,4,5,6,7,8,11,12,13,15,21,24,25,26,29,32,33,34,35,36,37,38,39,40,41],depict:29,deploy:[0,15,24,26,32],deprec:[2,3,6,13,26,32,33,37],deprecate_nonkeyword_argu:[0,32],depth:[0,3,9,10,25,35,40,41],deriv:[0,1,2,6,7,8,10,11,13,16,17,19,21,24,26,32,38],derivati:[13,37,38],derivative_fn:[13,37,38],descend:[5,9,11,33,34],descent:[0,1,3,7,8,12,22,32,33,39,40],descent_i:21,descent_x:21,descr:33,describ:[0,2,4,5,6,8,10,11,12,13,18,21,25,26,27,32,34,35,37,38,39,41],descript:[0,8,9,27,32],design:[0,1,3,4,5,6,7,10,11,12,13,15,16,17,18,19,23,26,27,32,34,35,36,37,38,39,40,41],designmatrix:[0,32],desir:[0,2,4,5,13,14,32,33,36,37,41],despit:[1,12,38,39,40,41],destroi:25,det:[5,25,33],detail:[0,6,11,13,14,25,26,27,33,36,37,40],detect:[3,8,12,38,39],determin:[0,2,3,4,5,6,8,9,10,11,12,13,16,25,29,32,33,34,35,36,37,38,39,41],determinist:[7,13,29,36,37,38],dev:[1,40,41],develop:[0,3,5,8,10,11,12,21,22,23,24,25,26,27,32,33,34,35,38],deviat:[0,1,2,4,5,6,19,26,29,32,33,34,35,40,41],devic:[3,4],device_nam:[3,4],devis:[12,38,39],df1:32,df:[4,8,11,13,32,37],di:[0,33],diag:[5,8,33,34],diagnost:[1,10,40,41],diagon:[0,5,7,13,18,21,25,26,29,32,33,34,36,37,38],diagonaliz:[5,33],diagram:10,diagsvd:6,dice:[6,29,35],dict:[6,8,36],dict_kei:33,dictionari:[0,33],did:[0,1,5,6,7,10,11,14,26,27,32,34,35,36,37,40,41],die:[1,40,41],diff1:[2,41],diff2:[2,41],diff:[2,41],diff_ag:[2,41],diffeent:8,differ:[0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,17,21,23,24,25,26,29,31,32,33,34,35,36,39,40,41],different:22,differenti:[0,3,16,21,22,23,24,25,32,33,36,39,40],differential_oper:[2,13,38],difficult:[0,1,6,10,13,21,26,29,32,35,37,38,40,41],difficulti:[0,1,13,32,36,37,38,40,41],diffonedim:[2,41],digit:[0,1,3,4,6,26,27,28,30,32,39,40,41],dilemma:[13,37,38],dilut:[1,40,41],dim:[4,11,14,25],dimens:[0,1,2,3,4,5,8,9,11,14,16,17,25,32,33,34,39,40,41],dimension:[0,4,5,6,9,11,13,14,19,21,22,24,25,27,32,34,35,36,37,38],dimensionless:[0,3,32],diment:25,dimnsion:4,diod:3,direct:[0,1,2,4,11,12,13,14,21,32,33,36,37,38,39,40,41],directli:[1,4,5,6,23,29,33,39,40,41],directori:9,disabl:[3,4],disadvantag:[0,32],disappear:[3,6,35],disc_loss:4,disc_tap:4,discard:[6,11,35,36],disciplin:[0,3,12,32,38,39],disclaim:29,discord:32,discourag:[13,33,36,37],discov:[0,32],discover:[5,34],discret:[1,3,5,7,13,34,35,36,37,38,40,41],discrimin:[4,7,10,11,36],discriminator_loss:4,discriminator_loss_list:4,discriminator_model:4,discriminator_optim:4,discuss:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,29,31,32,33,34,35,37,38,39,40,41],diseas:[7,36],disguis:[6,33,34,35],disord:[1,7,36,40,41],dispai:[38,39],displai:[0,1,3,4,5,6,7,8,9,10,11,12,14,26,29,32,33,35,36,38,39,40,41],displaystyl:[0,5,17,32,33,34],displot:33,disregard:[0,32],dissimilar:[11,14],dist:14,distanc:[0,8,9,11,14,29,33],distance_list:9,distinct:[3,7,8,9,10,14,36],distinctli:8,distinguish:[0,4,7,8,29,32,36],distplot:[0,33],distribut:[0,1,4,6,7,10,11,13,14,15,16,18,19,24,25,26,27,32,33,36,37,39,40,41],distrubut:[0,15,24,26,32],dive:[0,8,25,32],diverg:[1,13,36,37,38,40,41],divid:[0,1,3,5,6,7,8,9,11,12,27,29,32,33,34,35,36,38,39,40,41],divis:[6,8,9,13,21,25,29,35,36,37,38],dna:[7,36],dnn1:4,dnn2_gru2:4,dnn:[0,1,2,4,12,32,38,39,40,41],dnn_kera:[1,40,41],dnn_model:[1,40,41],dnn_numpi:[1,39,40,41],dnn_scikit:[0,1,32,39,40,41],doamin:[34,35],doc:[0,6,17,19,20,24,26,27,28,30,31,32,33,36,37,38],document:[4,7,11,13,33,36,37,38,41],doe:[0,1,2,3,4,5,6,8,10,11,12,13,16,21,25,26,29,32,35,36,37,40,41],doesn:[3,9,12,39],dog:[1,3,4,39,40,41],domain:[5,8,13,26,27,34,35,36,37],domin:[0,32],don:[0,1,3,5,6,8,11,13,15,21,24,26,27,32,33,37,38,39,40,41],done:[0,2,3,4,5,6,9,10,11,13,17,25,26,32,33,34,35,36,37,38,41],dot:[0,2,3,5,6,7,8,9,10,11,12,13,21,25,26,29,32,33,34,35,36,39,40,41],doubl:[3,4,25,32],doubli:[1,40,41],down:[0,3,6,9,11,12,13,21,32,36,37,38,39],download:[0,1,3,5,6,25,26,31,32,39,40,41],downsampl:3,dozen:[1,40,41],dq:[6,35],drag:[13,37,38],dramat:11,drastic:4,draw:[4,6,10,13,35,36,37],drawback:[0,1,3,13,33,36,37,38,40,41],drawn:[1,4,6,7,11,29,32,35,36,39,40,41],drive:[3,4],driven:3,drop:[0,1,5,6,11,13,21,29,32,33,34,35,37,38,40,41],dropna:[0,6,32,35],dropout:4,dt:[2,3,13,29,37,38,41],dtype:[0,1,2,3,4,14,21,25,32,33,38,39,40,41],dualiti:6,dub:[0,32],due:[1,2,5,6,8,10,12,13,30,32,33,35,36,37,38,39,40,41],dummi:[0,33],dure:[0,1,3,4,8,9,11,17,20,23,24,26,32,35,37,38,40,41],dwell:[0,33],dwh:[1,39,40,41],dwo:[1,39,40,41],dx:[2,3,8,29,41],dx_1:29,dx_1p:[6,35],dx_2p:[6,35],dx_mp:[6,35],dx_n:29,dxp:[6,35],dy:[1,8,29,40,41],dynam:4,dz:8,e:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,18,19,21,29,30,32,33,34,35,36,37,38,39,40,41],e_:[0,2,32,41],each:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,21,24,25,27,28,29,30,32,33,34,35,37,38,39,40,41],eager:[3,4,35],eapprox:[0,32],earli:[1,3,4,13,21,37,38,39,40,41],earlier:[0,5,7,8,9,11,12,13,20,21,32,33,36,37,38,39],earthexplor:[6,26],eas:[6,9,14,35],easi:[0,5,6,7,8,9,10,11,12,13,18,21,24,25,27,32,33,34,35,36,37,38,39],easier:[5,6,8,9,13,23,27,29,32,33,35,37,38,41],easiest:[13,36,37],easili:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,25,26,32,33,34,35,36,37,39,40,41],eastern:[30,32],ebind:[0,32],eblock:9,econometr:32,economi:5,ecosystem:[24,32],ect:28,edg:3,edgecolor:[6,35],edu:[13,27,33,36,41],educ:[0,26,27,32,33,36],eff:29,effect:[1,4,10,13,29,37,38,39,40,41],effic:[1,39,40,41],effici:[0,3,10,13,24,25,29,32,36,37,38],efron:[6,35],egrad:[13,37,38],eig:[5,11,13,21,25,29,32,33,36,37,38],eigen:29,eigenpair:[5,11,33],eigenvalu:[0,5,8,11,13,21,25,32,33,34,36,37,38],eigenvector:[5,11,13,17,33,34,37],eight:[25,32],eigval:[25,29,32],eigvalu:[11,13,21,36,37,38],eigvec:[25,29,32],eigvector:[11,13,21,36,37,38],eispack:[25,32],either:[1,5,6,7,8,9,10,11,13,15,16,23,26,27,29,32,33,34,35,36,37,39,40,41],elabor:29,elarn:3,electr:[0,3,12,32,38,39],electron:32,eleg:11,element:[1,2,3,4,5,6,7,8,11,12,13,17,18,20,21,22,24,25,26,27,28,31,33,34,35,36,39,40,41],elementari:[10,13,25,37,38],elementwis:[3,13,37,38],elementwise_grad:[2,13,37,38,41],elessar:32,elif:[3,4,14,21],elim:25,elimin:[3,8],els:[1,2,3,4,7,9,12,13,25,36,37,38,39,40,41],elu:[1,40,41],elus:[0,32],email:[28,30,32],embed:[0,11,33],embodi:[6,19,26,35],emit:29,emner:31,emphas:[0,10,24,32],emphasi:[0,24,31,32],empir:[1,11,29,40,41],emploi:[0,1,5,6,11,13,26,27,29,32,33,34,35,36,37,39,40],employ:[0,32,33],empti:[6,10,35],emul:[12,38,39],en:[24,31],enabl:[11,21],enbodi:[6,35],encod:[0,3,5,9,11,14,17,32,33,34],encompass:[0,26,29,32],encount:[0,1,5,6,7,13,21,29,32,33,35,36,37,38,39,40,41],encourag:[26,27],end:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,21,23,25,26,29,30,32,33,34,35,36,37,38,39,40,41],end_box:[13,38],end_nod:[2,13,38],end_valu:[13,38],endpoint:[3,6],energi:[0,4,6,33,35],enet_coordinate_desc:6,enforc:[12,38,39],eng:31,engin:[0,1,3,4,24,32,40,41],english:[26,27],enorm:3,enough:[0,6,13,32,35,36,37],ensembl:[1,9,40,41],ensur:[0,1,2,3,5,6,11,13,21,29,33,34,35,36,37,38,39,40,41],ensure_initi:[3,4],entail:32,enter:[5,6,17,33,34],enthought:[0,15,24,26,32],entir:[1,3,7,9,24,29,32,36,37,38,39,40,41],entiti:[9,12,25,32,39],entri:[0,5,8,11,12,25,32,33,34,35,39],entropi:[1,3,7,10,13,23,32,37,38,39,40,41],enumer:[0,1,2,3,4,6,8,32,33,34,39,40,41],env:[0,1,2,3,4,6,7,8,11,13,21,29,32,33,34,36,38,39,40,41],environ:[2,21,24,26,41],eo:[0,6,32,35],eol:[0,32],eosfit:[0,32],epoch:[0,1,3,4,12,13,21,22,27,32,37,38,39,40,41],epoch_num:[3,4],epsilon:[0,5,6,7,13,19,26,32,33,34,35,36,37,38],epsilon_0:[0,32],epsilon_1:[0,32],epsilon_2:[0,32],epsilon_:[0,32],epsilon_i:[0,32,33],eq:[3,13,14,25,29,36,37],eqnarrai:[3,5,6,34,35],equal:[0,1,2,3,4,5,6,8,9,11,12,13,14,15,25,26,27,29,32,33,34,35,36,37,38,39,40,41],equat:[1,3,4,5,6,7,8,9,10,11,13,14,16,17,18,19,21,25,26,29,35,38,40],equilibrium:[2,12,38,39,41],equiv:[3,13,25,29,36,37],equival:[0,1,5,7,8,11,13,21,24,25,32,33,34,35,37,38,39,40,41],erf:29,eriador:32,eridg:32,err:[0,10],err_:[6,35],err_sqr:[2,41],errat:[13,36,37],errno:9,erron:[2,41],error:[1,2,4,5,6,7,9,11,12,13,15,16,17,18,19,21,24,25,26,27,29,34,36,37,38,39,40,41],error_estimate_corr_tim:29,error_handl:[3,4],error_hidden:[1,39,40,41],error_output:[1,39,40,41],escap:[13,36,37,38],especi:[1,3,9,12,13,26,27,37,38,39,40,41],essenti:[0,5,6,9,10,12,14,26,27,29,33,38,39],establish:[0,6,10,11,15,26,27,32],estim:[0,1,5,6,7,10,11,13,24,29,32,33,36,37,38,39,40,41],estimated_mse_fold:[6,35,36],estimated_mse_kfold:[6,35,36],estimated_mse_sklearn:[6,35,36],et:[0,2,4,15,16,17,27,31,32,33,34,35,36,37,38,39,40,41],eta0:[8,13,36,37],eta:[0,1,3,8,12,13,21,27,32,36,37,38,39,40,41],eta_:[13,21,37,38],eta_t:[13,37,38],eta_v:[0,1,3,32,39,40,41],etc:[0,1,3,5,7,8,9,11,12,13,14,15,21,22,24,25,26,27,29,33,36,37,38,39,40,41],ethic:[24,32,33],etsim:35,euclidean:[0,14,33],evalu:[0,2,3,4,5,6,9,13,26,29,32,33,34,35,36,37,38],evaluationform:[20,26,37,38],evaluationgrad:[20,26,37,38],evalut:[13,37,38],even:[0,1,3,4,5,6,8,9,10,11,12,13,14,24,25,29,32,33,34,35,36,37,38,39,40,41],evenli:4,event:[5,7,10,29,34,35,36],eventu:[0,5,6,11,12,13,26,27,30,33,34,35,36,37,38,39],everi:[0,1,2,3,4,5,6,9,10,11,12,13,14,24,29,30,32,33,34,35,36,37,38,39,40,41],everyth:[4,12,21,22,23,39],everywher:[4,13,36,37],evolv:[0,32],exact:[0,5,11,12,13,25,29,32,33,37,39],exactli:[0,3,4,6,12,24,26,33,35,38,39],exam:32,examin:[6,35],exampl:[5,11,12,13,15,16,19,20,22,24,25,26,27,29,31],exce:[1,12,13,21,37,38,39,40,41],excel:[0,1,4,5,10,27,32,33,40,41],except:[3,4,6,8,9,25],excess:[0,32],excit:[0,32],exclud:[1,6,12,26,33,34,35,36,38,39,40,41],exclus:[0,1,3,6,29,32,35,36,40,41],execut:[2,3,4,5,13,33,37,38,41],execute_with_cancel:[3,4],executing_eagerli:[3,4],exemplifi:[13,37,38],exercic:[30,32],exercis:[5,24,26,27,28,30,34,36,37,38,39,40],exercisesweek35:17,exhaust:[6,35,36],exhibit:[0,5,6,8,32,33,35],exist:[0,1,2,3,5,6,7,8,9,13,18,25,26,27,32,33,34,35,36,37,40,41],exit:[5,25,33],exp:[0,1,2,5,6,7,8,10,11,12,13,15,16,21,26,29,32,33,34,35,36,37,38,39,40,41],exp_term:[1,39,40,41],expand:[5,7,11,13,33,36,37],expans:[0,3,5,8,10,12,13,32,33,36,37,39],expect:[0,1,5,6,7,11,12,13,15,16,19,21,24,26,27,32,33,36,37,38,39,40,41],expectation_value_of_h_wrt_p:29,expens:[6,10,13,36,37,38],experi:[0,1,6,8,13,24,26,32,33,35,36,37,38,40,41],experiment:[0,3,4,6,9,29,32,35],experimental_get_tracing_count:[3,4],expert:[1,9,40,41],explain:[0,6,9,10,11,13,19,26,32,36,37],explained_variance_ratio_:11,explan:27,explanatori:[0,32],explicit:[0,3,6,13,21,25,26,32,33,34,37,38],explicitli:[0,4,21,32],explod:[1,40,41],exploit:[0,3,12,13,32,37,38,39],explor:[1,4,6,8,13,24,26,27,36,37,38,40,41],expon:[1,39,40,41],exponenti:[0,1,5,6,10,13,26,29,32,34,35,36,37,38,40],export_graphviz:9,export_text:9,exporttext:9,expos:[24,32],express:[0,2,3,5,6,7,10,12,13,16,21,22,25,26,27,29,34,35,38,39,41],exptmean:29,exptvari:29,extend:[0,2,7,11,13,17,24,32,41],extens:[0,12,15,24,32,38,39],extent:[0,1,6,31,32,35,40,41],extern:[3,6,9],extra:[1,3,5,30,32,33,39,40,41],extract:[0,3,5,6,7,8,11,13,25,32,33,36,37],extrapol:[0,32],extrem:[0,1,4,5,6,7,8,9,13,16,25,33,34,35,36,37,38,40,41],extremum:[13,36,37],extrins:11,ey:[0,5,6,13,14,25,32,34,35,36,37],f11:[0,32],f12:[0,32],f13:[0,32],f1:[13,37,38],f1_grad:[13,37,38],f1d:[13,37],f2:[13,37,38],f2_grad_x1:[13,37,38],f2_grad_x1_analyt:[13,37,38],f2_grad_x2:[13,37,38],f2_grad_x2_analyt:[13,37,38],f3:[13,37,38],f3_grad:[13,37,38],f3_grad_analyt:[13,37,38],f4:[13,37,38],f4_grad:[13,37,38],f4_grad_analyt:[13,37,38],f5:[13,37,38],f5_grad:[13,37,38],f6:[13,37,38],f6_for:[13,37,38],f6_for_grad:[13,37,38],f6_grad_analyt:[13,37,38],f6_while:[13,37,38],f6_while_grad:[13,37,38],f7:[13,37,38],f7_grad:[13,37,38],f7_grad_analyt:[13,37,38],f8:[13,37,38],f8_grad:[13,37,38],f9:[0,13,32,37,38],f9_altern:[13,37,38],f9_alternative_grad:[13,37,38],f9_grad:[13,37,38],f:[0,1,2,3,4,5,6,7,8,10,12,13,14,16,18,19,21,22,25,29,30,32,33,34,35,36,37,38,39,40,41],f_0:[3,10],f_1:[10,13,36,37],f_2:[12,13,36,37,38,39],f_3:[12,38,39],f_:10,f_d:29,f_grad:[13,37,38],f_grad_analyt:[13,37,38],f_i:[0,6,12,16,35,38,39],f_m:[3,10],f_n:3,f_raw:2,f_vec:[2,41],f_wrap:2,face:[13,36,37,38],facecolor:[6,8,29,35],facil:[0,15,24,32,35,36,37,38,39,40,41],facilit:[12,38,39],fact:[0,1,3,5,9,11,12,13,32,33,34,35,36,37,38,39,40,41],factor:[0,1,3,5,6,9,10,11,13,25,29,32,33,34,35,37,38,39,40,41],factori:[13,37,38],fade:6,fafab0:[9,10],fahimeh:[30,32],fail:[0,3,4,6,7,8,11,13,30,32,35,36,37],failur:[7,36],fairli:[1,2,29,40,41],fake:4,fake_loss:4,fake_output:4,fale:27,fall:[8,9,28],fals:[0,1,2,3,4,5,6,7,9,10,14,25,26,32,33,34,35,36,37,38,39,40,41],famili:[0,7,8,29,36],familiar:[0,3,5,6,8,15,24,25,26,29,32,34,35],famou:[6,12,39],far:[0,3,4,5,6,8,11,12,13,14,32,33,36,37,38,39],fashion:[0,9,10,32],fast:[1,3,6,10,12,13,24,29,32,35,36,37,39,40,41],faster:[1,11,13,37,38,40,41],fastest:[13,25,36,37],favor:[7,36],favorit:29,fc:3,featur:[0,1,3,5,6,7,8,10,11,12,13,18,24,26,27,29,32,34,35,36,37,38,39,40,41],feature_nam:[0,1,7,9,33,36,40,41],feautur:9,fed:[1,39,40,41],feed:[0,2,3,11,23,24,27,32],feed_forward:[1,39,40,41],feed_forward_out:[1,39,40,41],feed_forward_train:[1,39,40,41],feedback:[4,20,32],feeddorward:4,feedforward:[1,4,12,39,40,41],feel:[0,5,6,11,13,15,16,21,22,24,26,27,30,32,34,37,38],feet:[0,33],fei:32,felt:[26,27],fetch:[6,26,33],fetch_california_h:33,fetch_openml:33,few:[1,3,4,5,9,29,32,37,39,40,41],fewer:[0,9,11,32],ffnn:[1,12,27,38,39,40,41],field:[0,3,6,12,24,32,38,39],fifth:[0,6,15,16,26,32],fig:[0,1,2,3,4,6,7,12,13,14,26,32,36,37,38,39,40,41],fig_id:[0,6,7,9,32,33,35,36],figaxi:29,figsiz:[0,1,2,3,4,6,7,8,9,10,32,33,35,36,39,40,41],figur:[0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,21,24,26,27,32,33,34,35,36,37,38,39,40,41],figure_id:[0,6,7,9,32,33,35,36],figurefil:[0,6,7,9,32,33,35,36],file:[0,2,3,4,5,6,7,9,13,26,27,32,33,34,35,36,38],file_prefix:4,filenam:[32,33],filenotfounderror:9,filepath_or_buff:[0,32],fill:[5,9,33],filter:[3,4],filter_traceback:[3,4],filtered_flat_arg:[3,4],filtered_tb:[3,4],financ:[0,32],find:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,21,24,26,27,29,32,33,34,36,39,40,41],fine:[0,14,15,32],finish:[2,41],finit:[3,5,6,12,13,17,29,33,34,35,37,38,39],first:[0,1,2,3,5,6,7,8,9,10,11,13,14,15,16,17,21,23,25,26,29,30,31,35,38,40],first_moment:[21,37,38],first_term:[21,37,38],firsteigvector:11,fit:[1,3,4,5,6,7,8,9,11,12,13,15,16,17,21,23,26,27,29,33,35,36,37,38,39,40,41],fit_beta:[6,33,34],fit_intercept:[0,5,6,33,34,35],fit_mod:9,fit_transform:[0,6,8,9,11,35,36],fiti:[0,32],five:[0,9,17,26,32,33,36],fix:[0,3,4,6,10,11,12,13,21,22,26,27,32,35,36,37,38,39],fixedformatt:6,fixedloc:6,flag:4,flat:[12,13,21,36,37,38,39],flatten:[1,3,4,5,25,39,40,41],flexibl:[1,6,8,10,12,27,32,33,35,38,39,40,41],flip:[30,32],float32:[4,9,21],float64:[4,21,25,32,33,38,39,40,41],flop:[5,25,33],flow:[1,4,12,38,39,41],fluctuat:[5,34],fly:11,fm:[0,32],fmax:3,fmesh:[13,37],fn:[3,4,7],focu:[0,3,4,5,6,15,24,27,31,32,33,34,35],focus:[1,6,7,25,33,34,36,39,40,41],fold:[6,9,26],folder:[0,1,4,6,13,26,27,32,35,37,39,40,41],follow:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],font:[0,7,29,32,36],fontdict:29,fontsiz:[1,6,8,9,10,29,40,41],fontweight:[1,40,41],footprint:3,foral:[8,33],forc:[0,5,6,10,11,32,33,34,36],forcast:4,forecast:[4,12,38,39],forest:[0,1,9,24,32,40,41],forget:11,form:[0,3,4,5,6,7,8,9,11,12,13,17,21,22,24,25,26,27,29,32,33,34,35,36,37,38,39,40],formal:[3,4,14,29],format:[0,1,3,4,6,7,8,9,10,11,24,29,31,33,34,35,36,38,39,40,41],format_data:4,formatstrformatt:[6,13,26,36,37],formul:[4,6,11,14],formula:[3,13,29,36,37,38],forth:[4,12,38,39],fortran2003:[24,32],fortran2008:[26,27],fortran90:29,fortran:[0,15,24,25,32],fortun:[0,11,33],forward:[0,3,4,6,23,24,25,27,32,35],forward_backward:[3,4],forward_funct:[3,4],found:[1,2,4,5,6,12,13,19,20,26,27,32,33,34,35,37,38,39,40,41],foundat:[24,32],four:[4,5,6,8,12,23,25,26,28,30,32,34,38,39,40,41],fourier:[0,32],fourierdef1:3,fourierdef2:3,fourierseriessign:3,fourth:[12,32,33,39],fp:7,frac:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,19,25,26,27,29,32,33,34,35,36,37,38,39,40,41],fractal:9,fraction:9,frame:[7,32,36],framework:[1,8,10,29,40,41],frank:[5,11,21,22,27],frankefunct:[5,6,11,26,33],fredli:[30,32],free:[0,6,11,13,15,16,21,22,24,25,26,27,29,30,31,32,37,38],freecodecamp:24,freedom:[5,34],freeli:[0,26,32],frequenc:[3,4,6,7,29,35,36],frequent:[0,8,9,13,32,36,37],frequentist:24,fresh:10,fridai:[16,30,32],friedman:[6,18,26,28,31,32,33],friendli:4,frodo:32,frog:3,from:[0,1,2,3,4,6,7,8,9,11,13,14,16,17,18,19,22,23,24,25,26,29,30,31,32,40,41],from_cod:9,from_logit:[3,4],from_tensor_slic:4,fromnumer:2,front:[0,4,5,15,16,32,33,34],fulfil:[2,5,12,33,38,39,41],full:[0,1,3,5,7,9,10,13,29,32,33,36,37,38],full_matric:[5,33],fulli:[3,6,12,28,29,35,36,38,39],fun:[2,13,24,32,38],fun_nam:[],func:[0,2,32,33,41],functionali:11,fundament:[0,6,24,32,35],funtion:2,further:[2,7,9,32,41],furthermor:[0,3,5,6,7,11,12,13,17,24,26,32,33,34,35,36,37,38,39],futur:[0,4,8,9,32,33],futurewarn:[0,32,33],fy:[15,26,27,28,30,31,32],fys4155:[26,27],fys5419:[31,32],fys5429:[31,32],g0:[2,41],g:[0,1,2,3,4,6,8,9,10,11,13,29,32,34,35,36,37,38,39,40,41],g_0:[2,41],g_1:[2,10,41],g_2:[2,10,41],g_:[2,9,10,41],g_analyt:[2,41],g_dnn_ag:[2,41],g_euler:[2,41],g_i:[2,41],g_m:[3,10],g_n:3,g_re:[2,41],g_t:[2,41],g_t_d2t:[2,41],g_t_d2x:[2,41],g_t_dt:[2,41],g_t_hessian:[2,41],g_t_hessian_func:[2,41],g_t_jacobian:[2,41],g_t_jacobian_func:[2,41],g_trial:[2,41],g_trial_deep:[2,41],g_vec:[2,41],gain:[1,5,7,9,10,13,33,34,35,37,38,40,41],galleri:[0,32],game:4,gamge:32,gamma1:8,gamma2:8,gamma:[0,2,8,9,10,11,13,21,32,36,37,38,41],gamma_0:10,gamma_1:10,gamma_1x:10,gamma_:[0,32],gamma_i:[0,8,29,32],gamma_j:[13,37,38],gamma_k:[13,36,37],gamma_m:10,gamma_x:[0,32],gap:[6,8],gate:[4,12],gather:[0,1,12,33,38,39,40,41],gaug:[12,38,39],gaussbacksub:25,gaussian:[4,5,6,8,14,29,34,35],gaussian_point:14,gaussian_rbf:8,gave:[13,37,38],gbc:[28,32],gca:[2,6,8,13,26,37,41],gd:[1,22,27,36,40,41],gd_clf:10,gdclassiffiercgain:10,gdclassiffierconfus:10,gdclassiffierroc:10,gdm:[13,21,37,38],gdregress:10,ge:[1,5,7,29,33,36,40,41],gen_loss:4,gen_tap:4,gender:[0,32],genener:4,gener:[0,1,2,3,5,6,8,10,11,12,13,14,15,16,17,19,20,21,25,26,29,31,33,34,35,36,37,38,39,40,41],generallay:[12,38,39],generate_and_save_imag:4,generate_imag:4,generate_latent_point:4,generate_simple_clustering_dataset:14,generated_imag:4,generator_loss:4,generator_loss_list:4,generator_model:4,generator_optim:4,genom:24,geodes:11,geometr:[0,13,32],geometri:[5,34,35],georg:31,geotif:[6,26],geq:[2,5,8,9,13,33,34,36,37,41],geron:[0,15,21,28,31,32,37,38,40,41],get:[0,1,2,3,4,5,6,7,9,10,11,13,15,20,22,23,24,25,26,27,29,30,32,33,34,35,36,37,38,39,40,41],get_dummi:9,get_paramet:[2,41],get_split:9,get_yaxi:8,get_yticklabel:6,getattr:[],gibb:[24,32],gif:4,gini:10,gini_index:9,ginvers:13,git:[0,15,24,32],giter:[13,21,37,38],github:[0,6,15,17,19,20,21,24,26,27,28,30,31,32,33,36,37,38,41],gitlab:[0,15,24,26,27,32],give:[0,1,2,3,5,6,7,8,9,10,12,13,14,17,24,26,27,29,32,33,34,35,36,37,38,39,40,41],given:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,22,25,26,27,29,32,33,34,35,36,37,38,39,40,41],global:[6,7,13,26,36,37,38],gloriou:27,glorot:[1,40,41],gnew:13,go:[0,1,3,5,6,8,9,11,12,13,26,32,33,34,35,36,37,39,40,41],goal:[0,7,9,32,36],goe:[0,1,2,5,6,13,14,18,25,32,33,34,35,36,37,38,39,40,41],golden:[13,37],gone:[5,33,34],gong:[1,39,40],good:[1,3,4,5,6,9,10,11,13,17,21,24,29,31,33,34,35,36,37,38,40,41],goodfellow:[4,22,27,28,31,32,33,34,36,37,38,39,40,41],googl:[1,4,21,24,32,40,41],got:[1,6,26,39,40,41],gotcha:21,gov:[6,26],gp:31,gpu:[1,13,21,24,32,37,38,40,41],grad:[2,13,21,37,38,41],grad_analyt:[13,37,38],grade:28,gradient:[0,3,4,7,8,9,12,22,23,24,32,33,39],gradient_desc:[3,21,37],gradientboostingclassifi:10,gradientboostingregressor:10,gradients_of_discrimin:4,gradients_of_gener:4,gradients_util:[3,4],gradienttap:4,gradual:[1,14,40,41],grai:[4,6,26],graph:[1,9,11,12,13,36,37,38,39,40,41],graph_from_dot_data:9,graph_funct:[3,4],graphic:[0,1,9,32,40,41],grasp:[0,32],gray_r:[1,3,39,40,41],grayscal:3,great:[5,13,36,37,41],greater:[1,7,29,36,39,40,41],greatli:[13,37,38],greedi:[9,36],green:[0,3,9,29],grei:4,grid:[1,3,6,7,8,12,29,33,34,35,38,39,40,41],gridsearch:36,gridsearchcv:36,grossli:[13,36,37],ground:[0,32],group:[0,6,7,9,14,24,26,27,28,30,32,35],groupbi:[0,32],grow:[1,3,9,10,39,40,41],growth:[0,32],gru:4,guarante:[0,3,4,13,29,32,33,36,37],guess:[1,4,10,13,14,21,27,36,37,38,39,40,41],guestrin:10,guid:[1,40,41],guidelin:[20,37,38],h1:[2,41],h:[0,1,5,6,8,13,16,18,21,26,29,30,31,32,33,36,37,38,39,40,41],h_1:[2,13,36,37,41],h_2:[2,13,36,37,41],h_:[0,13,32,36,37],h_m:10,ha:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,21,25,26,27,29,32,33,34,35,36,37,38,39,40,41],haa:[30,32],habit:[0,33],had:[0,1,6,7,13,32,35,36,37,39,40,41],hadamard:[1,12,13,21,37,38,39,40,41],half:[1,8,9,40,41],halv:10,hand:[0,1,2,3,5,11,12,13,15,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],handi:[3,26,27],handl:[0,1,2,5,9,11,24,34,40,41],handle_unknown:9,handsid:[12,39],handwrit:[12,38,39],handwritten:[1,5,32,39,40,41],handwrittennot:[19,32,36,37],happen:[1,2,3,4,5,6,10,13,29,33,37,38,39,40,41],hard:[1,7,8,10,13,36,37,39,40,41],hardcopi:[24,32],harder:[0,1,33,40,41],harmon:3,hasn:[1,39,40,41],hassl:[0,15,24,32],hast:[24,32],hasti:[0,6,15,16,17,18,26,28,31,32,33,34,35,36],hat:[0,1,5,6,7,9,10,11,12,13,17,18,25,26,33,34,35,37,38,39],have:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,23,24,25,26,27,29,30,33,34,35,36,37,38,39,40,41],haven:[1,39,40,41],he:[7,36],head:[0,4,10,29,33],header:[0,32,33],heads_proba:10,health:[0,33],hear:[0,13,32,37,38],heart:[0,7,32,36],heatmap:[0,1,3,7,32,33,36,39,40,41],heavili:[0,32],heavisid:[1,39,40,41],height:[1,3,6,33,34,39,40,41],hein:41,held:[13,21,37,38],help:[0,1,4,12,13,16,21,26,27,32,37,38,39,40,41],helper:[4,14],henc:[0,5,6,8,9,10,12,13,18,26,32,33,34,35,36,37,38,39],henrik:[30,32],her:[7,36],here:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,29,32,33,34,35,36,37,38,39,40,41],hereaft:[0,8,12,32,39],hermitian:25,hessenberg:25,hessian:[0,2,5,13,16,21,34,38,41],heterogen:[9,10],hi:[7,36],hidden:[1,3,4,12,23,27,38,39],hidden_bia:[1,39,40,41],hidden_bias_gradi:[1,39,40,41],hidden_layer_s:[0,1,32,39,40,41],hidden_neuron:4,hidden_weight:[1,39,40,41],hidden_weights_gradi:[1,39,40,41],hierarch:[5,33,34],high:[0,1,2,3,4,5,6,9,10,11,13,14,21,24,25,26,27,32,33,35,36,37,38,40,41],higher:[0,1,3,5,6,8,13,21,22,26,27,32,33,34,35,36,37,38,40,41],highest:[1,2,39,40,41],highli:[0,3,4,10,18,24,25,27,31,32,33,34,35],highwai:[0,33],hing:8,hint:[13,16,27,33,36,37],hip:24,hire:[0,32],hist:[4,6,7,29,35,36],histogram:[0,6,7,29,33,36],histor:[7,11,36],histori:[3,4,12,38,39],histplot:33,hitherto:[5,34],hjorth:[30,32,33,34,35,36,37,38,39,40,41],hobbi:29,hoc:[5,33],hoff:31,hold:[1,3,6,13,14,21,35,36,37,38,39,40,41],holder:[0,32],holm:41,holomorphic_grad:[2,13,38],home:[0,33],homepag:[26,27,32],homework:[6,13],homogen:[1,3,9,10,13,21,37,38,40,41],honchar:[2,41],hopefulli:[0,11,29,32],horizont:11,hors:[3,7,36],hot:[1,9,39,40,41],hour:[1,24,28,29,30,32,35,39,40,41],house_pric:33,how:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,21,24,25,26,27,29,32,33,34,35,37,38,39,40,41],howev:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,22,24,25,26,27,29,32,33,34,35,36,37,38,39,40,41],hspace:[0,4,8,10,29,32],hstack:[1,33,40,41],htf:[28,32],html:[0,7,11,17,19,24,26,28,30,31,32,33,36,39,40,41],http:[0,3,4,6,7,11,13,17,19,20,21,24,25,26,27,28,30,31,32,33,34,36,37,38,39,40,41],huang:[0,32],huber:[0,32],huge:[1,3,4,24,39,40,41],human:[0,1,3,6,9,12,32,33,34,38,39,40,41],humid:9,hundr:[1,40,41],hungri:[1,40,41],hybrid:28,hydrogen:[0,32],hyper:[21,27],hyperbol:[1,4,12,40,41],hyperparam:8,hyperparamet:[3,4,5,6,9,13,17,32,33,34,35,36,37,38],hyperplan:11,hz:[3,4],i0:[0,32],i1:[0,6,8,12,32,33,34,35,38,39],i2:[0,8,12,32,38,39],i3:[0,12,32,38,39],i5:[0,32],i:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,25,26,27,29,30,32,33,34,35,36,37,38,39],i_1:[5,6,34,35],i_2:[5,6,34,35],i_:[13,36,37],ian:31,ic:[1,27,39,40,41],id:[7,13,36,37],ida:[30,32],idea:[0,1,2,3,4,6,9,10,12,13,25,26,27,32,33,34,35,36,37,38,39,40,41],ideal:[0,2,6,8,13,29,32,33,35,38,41],idem:[6,35],ident:[5,6,12,13,17,25,26,33,37,38,39],identical:[34,35],identifi:[0,1,7,9,11,12,13,14,32,33,36,37,38,39,40,41],idx:[],ieor:29,ifi:[31,41],ifs:[24,32],ignor:[0,1,3,9,33,40,41],ii:[25,29],iii:[25,32],ij:[0,1,3,6,8,12,14,16,18,25,26,29,32,33,34,35,38,39,40,41],ik:[0,25,32,33],illustr:[5,7,10,12,13,14,24,32,35,36,37],ilsvrc:[37,38],im:6,imag:[1,3,4,6,9,11,12,14,27,31,32,38,39,40,41],image_at_epoch_:4,image_batch:4,image_height:3,image_path:[0,6,7,9,32,33,35,36],image_width:3,imageio:[6,26],imagenet:32,images_from_seed_imag:4,imagin:[1,40,41],immedi:[0,3,4,6,15,24,32],implement:[0,2,3,4,5,6,8,9,10,11,12,13,14,17,21,22,26,27,29,32,33,34,35,36,37,38],impli:[3,5,6,7,13,25,33,34,35,36,37],implicit:3,implicitli:[11,29],importantli:3,impos:[0,6,11,12,32,38,39],imposs:[0,5,32,33],impress:[0,12,32,38,39,40,41],improv:[0,4,5,9,10,11,13,21,26,27,33,38],impur:9,imread:[6,26],imshow:[1,3,4,6,26,39,40,41],in1:[],in2:[],in3050:[31,32],in3310:32,in4080:[31,32],in4300:[31,32],in4310:31,in5400:3,in5550:31,in_out_neuron:4,inaccur:[13,36,37],inact:[12,38,39],inadequ:[0,32],inch:[6,33,34],includ:[0,1,2,3,4,5,6,7,11,12,15,16,17,20,22,24,26,27,29,30,31,32,33,34,35,39,40,41],include_bia:[6,9,35],inclus:[17,40],incom:[12,38,39],incorrect:[1,39,40,41],incoveni:8,increas:[0,1,3,4,5,6,7,8,9,11,12,13,21,26,29,32,33,34,35,36,37,38,39,40,41],increasingli:29,increment:37,ind:6,inde:[0,2,4,5,6,13,32,33,41],indefinit:4,independ:[0,5,6,7,8,12,13,29,32,33,36,37,38,39],index:[0,1,3,4,10,14,24,25,27,29,31,32,33,39,40,41],index_col:[0,32],indic:[0,1,3,4,5,6,9,10,11,13,16,21,26,27,32,33,37,38,39,40,41],indispens:[6,35],individu:[1,6,7,10,12,29,32,33,35,36,38,39,40,41],indu:[0,33],indx1:[2,41],indx2:[2,41],indx3:[2,41],indx:25,ineffici:[3,13,37,38],inequ:[8,13],inequaltii:[36,37],inertia:[13,21,37,38],inf1000:[24,32],inf1100:[24,32],inf1100l:[24,32],inf1110:[24,32],inf3000:32,infeas:9,infer:[0,1,4,6,31,32,35,39,40,41],infer_nrow:[0,32],inferenc:[1,40,41],infil:[0,6,7,9,32,35,36],infin:[5,6,7,11,18,33,34,35,36],infinit:3,infinitesim:29,influenc:[6,10,35,36],influenti:[1,39,40,41],info:32,inform:[0,1,3,4,6,9,11,12,13,14,21,22,25,26,27,31,32,35,36,37,38,39,40,41],infti:[3,6,13,29,35,36,37],ingeni:[13,36,37,38],ingrad:2,ingredi:[0,9,32],inher:[6,35],inherit:[25,32],initi:[0,1,2,6,10,13,14,23,25,27,29,32,35,36,37,38,39,40,41],initial_epoch:[3,4],inject:14,inlin:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,25,26,29,32,33,34,35,36,37,38,39,40,41],inner:[0,13,33,37],inp:4,inplac:[13,37,38],input:[0,1,3,4,5,6,7,8,9,10,12,13,14,15,21,23,26,27,29,32,33,34,35,36,37,38,39,40],input_dim:[1,40,41],input_shap:[3,4],inputs:[1,40,41],inputs_shuffl:[0,1,33,39,40,41],insert:[3,5,6,8,10,29,33,34,35],insid:[0,4,7,33,36],insight:[0,1,5,21,22,24,27,32,33,34,35,40,41],insist:[6,13,33,34,37],inspect:36,inspir:[0,1,12,27,32,38,39,40,41],instabl:[2,41],instal:[0,1,5,6,9,15,40,41],instanc:[0,1,2,4,6,9,11,13,32,33,35,36,37,39,40,41],instanti:10,instead:[0,1,2,3,4,5,6,8,9,11,13,14,21,25,26,29,32,33,35,36,37,38,39,40,41],institut:[1,39,40,41],instruct:[0,1,15,16,32,40,41],int32:10,int64:33,int64index:32,int_0:29,int_:[3,6,29,35],int_a:29,intak:[0,33],integ:[1,2,13,14,25,29,32,37,38,39,40,41],integer_vector:[1,39,40,41],integr:[3,6,29,32,35],intellectu:32,intellig:[0,14,31,32],intend:[10,32],intens:[1,27,40,41],intention:14,interact:[0,6,9,12,24,26,27,32,38,39],intercept:[0,6,8,11,13,16,26,32,34,35,36,37],intercept_:[0,6,8,9,13,32,33,34,35,36,37],interceptol:35,interceptridg:35,interchang:[5,12,25,34,35,38,39],interconnect:[1,40,41],interest:[0,1,2,3,4,5,6,7,8,9,12,21,24,26,27,29,32,33,34,35,36,37,38,39,40,41],interfac:[0,1,25,33,39,40,41],interior:[0,9,32],intermedi:[25,33],intern:[1,10,12,38,39,40,41],interpol:[1,3,4,6,12,26,38,39,40,41],interpr:[5,33,34],interpret:[0,1,6,9,10,12,13,17,19,25,26,27,29,39,40,41],interv:[0,3,5,6,7,13,18,26,29,32,33,34,36,37],intial:[13,36,37],intract:[0,4,33],intrins:[3,11,25,29,32],intro:[24,31,32,41],introduc:[0,1,5,6,8,10,12,17,25,26,29,32,35,36,39,40,41],introduct:[1,2,4,13,17,20,31,33,36,37,41],introductori:[0,4,25,31,32,33],intuit:[0,5,6,8,12,13,21,26,32,34,35,37,38,39,40,41],inv:[0,5,13,21,32,33,34,36,37,38],invalid:[1,8,39,40,41],invalu:[0,13,15,24,32,36,37],invari:[1,39,40,41],invd:[5,34],inver:[8,38,39],invers:[0,3,6,13,15,16,17,21,22,26,27,32,33,36,37,38],inverse_transform:8,invert:[0,5,7,10,13,21,32,34,36,37,38],invh:[13,21,37,38],invok:[0,8,33],involv:[0,2,6,7,11,12,33,35,36,37,38,39,41],io:[0,17,19,24,26,28,30,31,32,33,41],ion:38,ip:[0,8,29,32],ipca:11,ipykernel_18986:[],ipykernel_19041:[],ipykernel_19107:[],ipykernel_19139:[],ipykernel_19152:[],ipykernel_19176:[],ipykernel_19181:[],ipykernel_19201:[],ipykernel_19294:[],ipykernel_19329:[],ipykernel_19344:[],ipykernel_19367:[],ipykernel_19394:[],ipykernel_31563:1,ipykernel_31624:6,ipykernel_31672:13,ipykernel_31707:26,ipykernel_31718:32,ipykernel_31736:35,ipykernel_31749:37,ipykernel_31761:39,ipykernel_31766:[],ipykernel_31871:40,ipykernel_74401:[],ipykernel_87501:41,ipynb:[24,32],ipython:[0,5,7,9,11,14,15,24,26,27,32,33,36],iq:[6,35],iri:[8,9],irreduc:[6,35],irrelev:[5,33],irrespect:[0,32],irvin:27,isbox:[13,38],iseffici:[37,38],isn:[5,34,35],isnul:[0,33],isomap:11,isotop:[32,35,36,37,39,40,41],issu:[1,9,25,33,34,40,41],it_arrai:[13,37],item:[0,13,32,37,38],items:[25,32],iter:[1,2,3,4,6,7,8,11,13,14,21,29,35,36,38,39,40,41],its:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18,24,25,26,27,29,32,34,35,36,37,38,39,40,41],itself:[5,6,12,19,26,27,29,33,34,35,39],j1:25,j:[0,1,2,3,4,5,6,8,9,11,12,13,14,16,17,18,19,25,26,29,31,32,33,34,35,36,37,38,39,40,41],j_:6,j_lasso_sk:6,j_ridge_sk:6,j_sk:6,jackknif:[6,24,32,35],jacobian:[2,13,36,37,38],jacobian_shap:[],jakobsen:[30,32],jason:4,jax:[22,24,27,32],jax_descend_i:21,jax_descend_x:21,jax_enable_x64:21,jax_grad:21,jensen:[30,32,33,34,35,36,37,38,39,40,41],jerom:[18,26,31],ji:[12,25,39],jit:[13,37,38],jj:[0,5,6,32,34,35],jk:[0,1,6,12,25,32,38,39,40],jl:[0,32],jm:25,jmlr:41,jnp:[13,21,37,38],job:[2,8,10,41],join:[0,4,6,7,9,32,33,35,36],joint:[4,5,34,35],judg:[13,36,37],judgement:[6,26],julia:[24,25,26],jump:[26,29],junk:4,jupit:32,jupyt:[0,15,19,24,26,31,32,35],just:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,23,24,26,27,29,32,33,34,35,36,37,38,39,40,41],justif:[0,32],justifi:[3,10],k0:[7,36],k1:[7,36],k:[0,1,3,5,6,7,8,9,10,11,12,13,14,24,25,26,29,30,32,33,34,37,38,39,40,41],kaggl:[6,26,27],kappa_d:29,karl:[30,32],karush:8,kate:32,katrin:[30,32],keep:[0,1,4,5,6,11,13,14,25,26,27,32,33,34,35,36,37,38,40,41],keepdim:[1,6,10,25,35,39,40,41],kei:[0,1,3,6,12,33,38,39,40,41],kept:[4,6,14,35],kera:[0,4,24,26,27,32],kernel:[0,1,3,24,32,33,40,41],kernel_regular:[1,3,40,41],kernel_s:4,kernelpca:11,kev:[0,32],kevin:[31,32],keyboardinterrupt:[2,3,4],keyword:[6,13,25,26,32,37],kfold:[6,35,36],kg:[1,39,40,41],ki:25,kick:[1,13,37,38,40,41],kiener:[2,41],kilomet:[6,33,34],kind:[0,2,3,4,8,12,13,14,32,33,37,38,39,41],kj:[6,12,25,33,34,35,39,40],kjm:[24,32],kkt:8,kl:29,km:[12,32,38,39],kmean:14,kmeanspoint:14,kn_k:14,know:[0,1,2,5,6,8,13,24,32,33,34,36,37,38,40,41],knowledg:[0,24,32],known:[1,3,4,5,6,7,8,9,12,25,26,27,29,31,33,34,35,36,38,39,40,41],kondev:[0,32],kp:29,kpca:11,kristin:41,kroneck:14,kuhn:8,kumar:41,kvalsund:[30,32],kwarg:[0,2,3,4,13,32,38],kwd:[0,3,4,32],kwown:[0,32],l0:[7,36],l1:[0,1,3,7,32,36,40,41],l1_l2:[1,3,40,41],l1regl:5,l2:[1,3,39,40,41],l:[0,1,2,3,5,6,7,8,10,11,12,13,19,25,26,29,32,33,35,36,37,38,40,41],l_1:[7,36],l_2:[7,13,27,36,37],l_:25,l_j:[12,39],la:[13,37],la_i:[12,39],la_k:[12,39,40],lab:[20,24,26,32,37,38],label:[0,1,2,3,4,5,6,7,8,9,10,12,13,14,21,24,25,26,27,29,32,33,34,35,36,37,38,39,40,41],label_prob:[37,38],labelencod:[7,10,36],labels:[6,8,9],labels_shuffl:[0,1,33,39,40,41],laboratori:[28,33,34],lack:[0,32],lagari:[2,41],lagrang:[8,11],lambda:[0,1,2,3,5,6,7,8,10,12,13,17,18,21,26,27,29,32,33,34,35,37,38,39,40,41],lambda_0:11,lambda_1:[5,8,11,33],lambda_2:[8,11],lambda_:11,lambda_i:[8,11],lambda_iy_i:8,lambda_jy_iy_j:8,lambda_k:8,lambda_n:[5,8,33],lamda:[1,40,41],land:[0,8,33],landmark:8,landscap:[13,21,36,37,38],langl:[0,6,11,29,32,33],languag:[0,1,4,8,15,24,25,26,27,31,32,40,41],lapack:[25,32],laplac:[5,34,35],laptop:24,larg:[0,1,2,4,5,6,8,9,10,11,13,15,24,25,26,29,31,32,33,35,36,37,38,39,40,41],larger:[0,3,5,6,8,10,11,13,17,29,32,33,34,35,36,37,38],largest:[4,8,11],lasso:[0,7,24,32],lasso_sk:6,last:[0,1,2,3,4,5,6,7,8,9,10,12,13,15,17,18,22,25,26,29,30,32,34,37,39,40,41],latent:4,latent_dim:4,latent_point:4,latent_space_value_rang:4,later:[0,1,4,6,7,8,12,13,14,15,24,26,27,32,36,37,38,39,40,41],latest:[4,24],latest_checkpoint:4,latex:32,latter:[0,3,6,7,8,11,13,16,17,25,26,29,32,33,34,35,36,37,38],lattic:[12,38,39],law:[0,32],lax_numpi:21,layer:[0,4,13,21,23,27,32,37,38],lbfg:[7,9,10,11,36],lcc:[5,6,34,35],lda:11,ldot:[0,6,11,19,26,32,35,36],le:[5,7,10,13,17,21,29,33,34,36,37,38],lead:[0,1,3,5,6,7,8,9,10,11,12,13,16,17,25,29,32,33,34,35,36,37,38,39,40,41],leaf:9,leaki:[1,27,40,41],leakyrelu:4,lear:[13,36,37],learn:[3,4,5,6,7,8,9,10,12,18,22,23,25,28,30,31],learnabl:3,learner:10,learnig:32,learning_r:[3,8,10,21],learning_rate_init:[0,1,32,39,40,41],learning_schedul:[13,21,37,38],learnt:[26,27],least:[0,7,8,10,11,15,16,17,19,21,22,24,25,27,29,35,36],leat:[13,21,37,38],leav:[0,1,3,5,6,9,11,32,34,35,36,40,41],lectur:[0,1,5,10,11,12,13,15,17,21,22,24,25,26,27,28,30,31,37,38],lecture_11_backpropag:41,lecturenot:[0,17,19,24,26,31,32],left:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,16,17,19,25,26,29,32,33,34,35,36,37,38,39,40,41],leftarrow:[8,12,39,40],legend:[0,2,3,4,5,6,7,8,9,10,13,32,33,34,35,36,37,38,41],len:[0,1,2,3,4,5,6,8,9,10,11,12,25,32,33,34,35,37,38,39,40,41],len_index:[0,32],length:[0,1,2,3,4,8,9,13,16,24,32,33,36,37,38,39,40,41],length_of_sequ:4,leq:[0,5,7,8,13,14,17,29,32,33,34,36,37],less:[0,1,3,4,5,6,8,9,13,24,29,32,33,34,35,36,37,38,40,41],lessen:[1,40,41],let:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,25,29,32,33,34,35,36,37,38,39,40,41],letter:[0,16,25,29,32,33],level:[0,1,5,6,9,24,25,26,27,28,30,32,33,35,40,41],li:[8,11,32],lib:[0,1,2,3,4,6,7,8,11,13,21,32,33,34,36,38,39,40,41],liblinear:[8,10],librari:[0,1,2,3,4,5,6,9,10,11,15,21,22,25,26,27,29,31,33,34,35,36,39,40,41],licens:[0,1,15,24,26,27,32,35,40,41],lie:[0,6,11,29,33,35],life:[0,1,8,12,32,38,39,40,41],lifetim:[13,37,38],like:[0,1,2,3,4,5,6,7,9,10,11,12,13,15,16,21,22,24,25,26,27,29,32,33,34,35,36,37,38,39,40,41],likelihood:[0,1,5,9,32,33,37,38,39,40,41],lim_:29,lima:[30,32],limit:[0,5,6,7,8,11,12,21,25,26,27,32,33,39],lin_clf:8,lin_model:[0,33],lin_reg:9,linalg:[0,2,5,6,8,11,13,21,25,29,32,33,34,35,36,37,38,39,41],line1:8,line2:8,line2d:[13,21,37],line3:8,line:[0,2,3,4,6,8,9,10,11,13,15,21,23,26,32,33,34,35,36,37,38,41],linear:[1,3,5,6,7,9,10,11,12,17,18,21,24,26,29,35,37,38,39,40,41],linear_model:[0,5,6,7,8,9,10,11,13,32,33,34,35,36,37,38,39],linear_regress:[6,35],linearli:[5,33],linearloc:[6,13,26,36,37],linearregress:[0,6,7,9,32,33,34,35,36],linearsvc:8,lineat:34,liner:[1,3,39,40,41],linerar:10,linewidth:[0,2,4,6,8,9,10,26,35,41],link:[0,4,9,12,24,26,27,30,32,39,40],linlag:[5,34],linpack:[25,32],linreg:[0,32],linspac:[0,2,3,4,6,8,9,10,13,15,16,21,25,29,32,33,34,35,37,38,41],linu:4,linux:[0,1,15,24,26,32,40,41],liquid:[0,32],list:[0,1,2,3,4,9,24,26,27,32,33,37,40,41],listcomp:[],listedcolormap:[9,10],literatur:[1,7,14,31,35,36,40,41],littl:[1,3,9,12,39,40,41],live:8,ll:[0,29,32,33],lle:[0,33],lloyd:[4,14],lmb:[0,2,5,6,34,35,36,41],lmbd:[0,1,3,32,39,40,41],lmbd_val:[0,1,3,32,39,40,41],lmbda:[13,36,37],ln:[1,13,36,37,39,40],load:[0,1,4,6,7,9,10,26,33,36,40,41],load_boston:[0,33],load_breast_canc:[1,7,9,10,11,36,40,41],load_data:[3,4],load_digit:[1,3,39,40,41],load_iri:[8,9],loc:[0,3,6,7,8,9,10,32,35,36],local:[0,1,2,3,4,7,12,13,32,33,36,37,38,39,40,41],locat:[2,3,8,41],lock:[3,4],log10:[0,5,6,34,35,36],log:[0,1,2,4,5,6,7,9,10,11,13,25,26,27,32,33,34,35,36,37,38,39,40,41],log_:[0,32],log_clf:10,logarithm:[0,5,7,25,32,34,35,36],logbook:[26,27],logic:[0,1,9,32,40,41],logist:[0,1,2,8,9,10,11,12,13,21,24,33],logistic_predict:[37,38],logisticregress:[7,9,10,11,36,38,39],logit:[7,36],logreg:[7,9,10,11,36,38,39],logspac:[0,1,3,5,6,32,34,35,36,39,40,41],longer:[2,3,8,10,14,25,27,29,32,41],loocv:[6,35,36],look:[0,1,2,3,4,5,6,7,8,9,10,11,13,18,21,25,26,27,29,32,33,34,35,36,37,38,40,41],loop:[1,4,6,10,12,14,24,25,32,35,39,40,41],lose:[1,39,40,41],loss:[0,1,3,4,5,6,7,8,10,11,13,25,26,27,32,34,35,38,39,40,41],loss_fil:4,lossfil:4,lost:4,lot:[0,1,4,6,33,35,37,38,40,41],low:[0,6,9,10,11,26,27,32,33,35],lower:[0,1,3,6,9,10,16,25,33,40,41],lowercas:[25,32],lowest:[9,13,29,37,38],lr:[1,3,4,10,40,41],lstat:[0,33],lstm:4,lstm_2layer:4,lstsq:[0,32,33],lt:[6,35],lu:[0,5,32,33],lubksb:25,luckili:[2,41],ludcmp:25,lux:25,lvert:[1,39,40,41],lw:[0,32],m1:[3,4],m:[0,1,2,3,5,6,8,9,10,11,12,13,21,25,28,29,30,31,32,33,34,35,36,37,38,39,40,41],m_1:14,m_:[9,12,39],m_h:[0,32],m_k:14,m_l:[12,39],m_n:[0,32],m_p:[0,32],m_t:[13,37,38],ma:11,machin:[1,3,4,5,6,7,9,10,11,12,15,21,22,25,28,31,33,34,35,38,39,40,41],machinelearn:[0,6,17,19,20,24,26,28,30,31,32,33,36,37,38],mackai:31,made:[0,1,3,4,5,6,7,9,11,12,18,26,27,32,33,36,38,39,40,41],mae:[0,32],magic:4,magnitud:[1,6,7,13,33,34,36,37,38,39,40,41],mai:[0,1,2,3,5,6,7,8,9,11,12,13,18,21,22,24,25,26,27,29,33,34,35,36,37,38,39,40,41],mail:[28,30],main:[0,1,3,4,5,6,7,9,25,26,27,31,32,33,36,40,41],mainli:[0,5,6,7,9,32,33,34,35,36],maintain:[6,33,35],major:[1,6,9,10,13,25,32,35,36,37,38,39,40,41],make:[1,2,3,4,5,6,7,8,11,12,13,21,23,24,25,26,27,29,31,34,35,36,37,38,39,40,41],make_axes_locat:6,make_classif:[38,39],make_moon:[8,9,10],make_pipelin:[0,6,10,33,35],make_vjp:[2,13,38],makedir:[0,6,7,9,32,33,35,36],makeplot:[0,32],malcondit:25,malign:[1,7,9,36,40,41],mammographi:[5,34,35],manag:[0,2,3,15,24,26,32,41],mandatori:[30,32],mani:[0,1,3,4,5,6,7,8,9,11,13,14,21,22,24,25,26,27,29,31,32,33,34,35,36,37,38,40,41],manifold:11,manner:3,manual:[6,33,34,36],map:[0,1,2,6,7,8,11,12,14,26,29,32,36,38,39,40,41],margin:[0,5,8,32],marit:[0,32],mariu:41,mark:32,marker:[0,7,21,25,32,33,36],markov:[24,32],marsaglia:29,mass:[0,1,5,13,33,37,38,39,40,41],massag:[0,32],masses2016:[0,32],masses2016ol:[0,32],masses2016tre:0,masseval2016:[0,32],master:[6,19,20,26,28,30,32,36,37,38,41],mat1100:[24,32],mat1110:[24,32],mat1120:[24,32],mat:[24,32],match:[0,1,4,5,13,14,32,33,36,37,38,40,41],materi:[4,5,7,13,17,25,30,37,38,39,40],math:[3,7,12,13,21,25,29,31,32,35,36,37,38,39],mathbb:[0,4,5,6,7,8,11,12,13,14,17,18,19,25,26,29,32,33,34,35,36,37,38,39],mathbf:[0,5,6,7,8,13,18,19,21,25,26,32,33,34,35,36,37,38],mathcal:[1,5,6,7,13,19,26,34,35,36,37,39,40,41],matheemat:3,mathemat:[0,6,11,12,13,17,24,25,29,31,32,34,35,36,40],mathemati:32,mathrm:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,26,29,32,33,34,35,36,37,38,39,40,41],matmul:[1,2,5,34,39,40,41],matnat:31,matplotlib:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,21,24,25,26,29,32,33,34,35,36,37,38,39,40,41],matplotlibdeprecationwarn:[6,13,26,37],matric:[0,1,3,4,6,7,8,11,13,16,17,24,33,36,37,40,41],matrix:[0,2,3,4,6,7,8,10,13,15,16,17,18,19,21,22,23,26,27,29,35],matshow:[1,40,41],matter:[2,3,13,33,36,37,38,41],max:[0,1,2,3,4,9,10,12,13,21,30,32,36,37,38,39,40,41],max_depth:[0,9,10],max_diff1:[2,41],max_diff2:[2,41],max_diff:[2,41],max_it:[0,1,7,8,11,13,32,36,37,38,39,40,41],max_iter:14,max_leaf_nod:10,max_queue_s:[3,4],max_sampl:10,maxdegre:[0,6,10,33,35],maxdepth:10,maxim:[1,4,5,7,8,11,34,35,36,39,40],maximum:[0,1,2,3,5,7,8,9,10,13,14,32,33,37,38,39,40,41],maxpolydegre:[5,6,34,35,36],maxpooling2d:3,mbox:[5,6,18,26,33,34,35],mccorduck:32,mcculloch:[12,38,39],md:[11,20,26,37,38],mdoel:4,mean:[1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,21,24,25,26,27,29,35,37,38,39,40,41],mean_absolute_error:[0,32],mean_divisor:14,mean_i:29,mean_matrix:14,mean_squared_error:[0,4,6,7,10,32,33,35,36],mean_squared_log_error:[0,32],mean_vector:14,mean_x:29,meaning:[0,4,7,32,36],meansquarederror:[0,32],meant:[2,3,7,10,13,36,37,38],measur:[0,1,2,5,6,9,11,12,14,19,26,27,29,32,33,34,35,39,40,41],mechan:[0,4,29,32,41],median:[0,32,33],medicin:[12,38,39],medium:[4,8,13,27,37,38],medv:[0,33],meet:[0,30],mehta:[0,27,32,33,34],memori:[3,4,11,12,13,21,25,32,37,38,39],mention:[0,12,13,26,27,29,32,36,37,38,39],mere:[0,15,27,32],meshgrid:[2,5,6,8,9,10,11,26,33,41],messag:[5,13,37,38],messi:[2,41],met:[0,3,8,32,33],metal:[3,4],meteorolog:9,meter:[6,33,34],method:[0,1,2,3,4,5,7,8,11,12,14,16,17,18,19,22,24,25,27,29,31,32,33,34,39,40,41],metion:[6,26],metric:[0,1,3,6,7,9,10,14,15,16,32,33,35,36,39,40,41],metropoli:[24,32],mev:[0,29,32],mgd:[13,37,38],mglearn:[24,32],mgrid:[13,37],mhjensen:[1,2,3,6,7,8,11,21,33,36,39,40,41],mi:10,mia:[30,32],michael:[27,39,40,41],michigan:[32,33,34,35,36,37,38,39,40,41],microsoft:31,mid:[1,39,40,41],midel:4,midnight:[16,17,18,19,20,21,22,23],midpoint:9,might:[0,1,2,4,6,9,13,33,34,36,37,38,40,41],mild:9,millimet:[6,33,34],million:[0,32,33,37,38],mimic:[12,38,39],min:[0,2,5,8,9,32,41],min_:[0,2,5,14,17,32,33,34,41],min_samples_leaf:9,mind:[0,6,13,26,32,33,34,35,36,37],mindboard:4,mine:[24,32],mini:[1,11,12,13,21,22,27,36,39,40,41],minibatch:[1,11,13,39,40,41],minibathc:[13,37,38],miniforge3:[0,1,2,3,4,6,7,8,11,13,21,32,33,34,36,38,39,40,41],minim:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,17,18,21,26,33,34,35,37,38,39,40],minima:[0,1,7,13,32,36,37,38,39,40,41],minimum:[0,1,2,6,8,9,11,13,33,35,36,37,38,39,40,41],minmaxscal:[0,33],minor:[6,13,26,29,37],minst:[1,40,41],minu:[7,36],mirror:9,misc:[6,26],misclassif:[8,9,10],misclassifi:[8,10],miser:0,mismatch:[1,40,41],miss:[0,7,10,33],mistak:4,mit:31,mix:[1,2,32,40,41],mixtur:[13,21,37,38],mk:[9,25],mkdir:[0,6,7,9,32,33,35,36],ml:[0,1,10,13,25,26,27,33,36,37,38,40,41],mlab:29,mle:[5,7,36],mlp:[1,38,40,41],mlpclassifi:[1,38,39,40,41],mlpregressor:[0,32],mm:25,mn:[12,29,38,39],mnist:[1,11,27,39,40,41],mod:29,mode:[28,30,32],model:[2,3,5,7,8,9,10,11,13,14,15,16,18,19,21,24,26,29,31,33,34,35,36,37],model_select:[0,1,3,5,6,7,9,10,11,32,33,34,35,36,39,40,41],moder:10,modern:[0,6,7,24,32,35,36],modif:[2,12,13,37,38,39,41],modifi:[0,1,3,5,7,8,10,12,13,32,33,34,36,37,38,39,40,41],modul:[0,7,11,25,32,34,36],modular:29,modulo:29,moe:[11,33],moment:[5,6,13,21,29,34,35],momentum:[22,27],monitor:[13,21,37,38],monoton:[5,12,29,34,35,38,39],mont:[0,6,24,29,31,32,35],moor:[5,6,34],more:[0,1,2,4,5,7,8,9,10,11,12,13,14,18,22,24,27,29,39],moreov:[0,3,32],morten:[30,32,33,34,35,36,37,38,39,40,41],most:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,21,24,26,29,32,33,34,35,36,37,38,39,40,41],mostli:[1,11,40,41],motion:[0,13,32,37,38],motiv:[1,4,40,41],move:[0,4,5,6,7,9,12,13,14,21,26,29,32,33,34,35,36,37,38,39,41],mpl:[0,7,32,36],mpl_toolkit:[2,6,13,26,36,37,41],mplot3d:[2,6,13,26,36,37,41],mplregressor:[1,39,40,41],mse:[0,4,5,6,9,10,15,16,17,19,26,27,32,33,34,35,36],mse_simpletre:10,mselassopredict:[5,34],mselassotrain:[5,34],mseownridgepredict:[6,34],msepredict:[5,34],mseridgepredict:[0,5,6,34,36],msetrain:[5,34],msg:[0,32,33],msle:[0,32],mt:[7,12,36,38,39],mu0:29,mu1:29,mu2:29,mu:[0,6,11,13,29,32,35,37,38],mu_1:33,mu_:[6,29,33,34,35],mu_i:[6,33,34,35],mu_n:11,mu_x:29,much:[0,1,2,3,4,5,6,8,9,10,11,12,13,25,26,29,32,33,34,35,37,38,39,40,41],multi:[0,1,3,7,24,32,33,36,41],multiclass:[1,7,36,39,40,41],multidimension:[11,12,32,38,39],multilay:[1,40,41],multinomi:[7,36],multipl:[2,4,5,6,7,12,13,29,33,35,36,37,38],multipli:[3,5,6,11,13,25,29,33,34,35,37],multiplum:8,multivari:[0,2,10,11,24,29,32,41],multivariate_norm:[11,14],murphi:[11,31,32,34],must:[0,1,2,5,6,8,10,12,13,14,29,32,33,35,36,37,38,39,40,41],mut_add:2,mutabl:2,mutat:[7,36],mutual:[1,3,6,13,35,36,37,40,41],mx_:29,myenv:[0,1,2,3,4,6,7,8,11,13,21,32,33,34,36,38,39,40,41],myriad:[0,15,24,32],mz1:29,mz2:29,n1:25,n2:25,n:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,17,18,19,21,25,26,27,29,32,33,34,35,36,37,38,39,40,41],n_0:[12,29,38,39],n_:[1,2,3,8,12,29,38,39,40,41],n_boostrap:[6,10,35],n_bootstrap:[6,35],n_categori:[1,3,39,40,41],n_cluster:14,n_compon:11,n_epoch:[13,21,37,38],n_estim:10,n_examples_to_gener:4,n_featur:[1,39,40,41],n_filter:3,n_hidden:[2,41],n_hidden_neuron:[0,1,32,39,40,41],n_i:29,n_input:[0,1,3,33,39,40,41],n_instanc:9,n_iter:[36,37],n_iter_i:[7,11,36],n_job:10,n_k:14,n_l:[12,29,38,39],n_layer:[1,40,41],n_m:9,n_neuron:[1,40,41],n_neurons_connect:3,n_neurons_layer1:[1,40,41],n_neurons_layer2:[1,40,41],n_point:14,n_sampl:[6,8,9,10,14,35,38,39],n_split:[6,35,36],n_step:4,n_t:[2,41],n_x:[2,41],nabla:[1,13,36,37,39,40,41],nabla_:[2,13,21,36,37,38,41],nabla_w:[13,37,38],nag:[13,37,38],naimi:[0,32],naiv:[7,36],naive_kmean:14,najafi:[30,32],nall:[0,32],name:[0,1,3,4,5,6,7,8,9,10,12,13,14,15,24,25,26,29,30,32,33,34,35,36,37,38,39,40,41],nameerror:[6,10,15,26,35,36,37],narrow:[13,37,38],nary_f:[2,13,38],nary_op_arg:[2,13,38],nary_op_kwarg:[2,13,38],nary_oper:[2,13,38],nation:[1,5,33,34,35,39,40,41],nativ:[24,32],natur:[0,1,4,8,9,12,13,26,27,29,31,32,36,37,38,39,40,41],navier:[12,38,39],nb:29,nb_:25,nbconvert:32,nd:14,ndarrai:[2,6],ndef:13,ne:[9,10,25,29,33],nearest:[1,3,6,11,39,40,41],nearli:[13,36,37],neat:32,neatli:37,neccesari:[6,35],necess:[2,41],necessari:[0,1,3,4,8,14,32,39,40,41],necessarili:[0,4,11,29,32],necesserali:[5,34,35],neck:[7,36],need:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,21,22,23,25,27,29,33,34,35,36,37,38,39,40,41],neg:[0,1,3,5,6,7,10,13,25,29,32,34,35,36,37,38,39,40,41],neg_mean_squared_error:[6,35,36],neglect:29,neglig:29,neighbor:[3,6,11],neither:[4,13,37,38],neq:[13,14,29,36,37],nervou:[12,38,39],nest:[2,9,12,38,39],nesterov:[13,37,38],net:[2,4,12,38,39,41],netlib:[25,32],network:[0,9,13,21,23,24,31,33,37],neural:[0,13,21,23,24,31,33,36,37],neural_network:[0,1,2,32,38,39,40,41],neuralnetwork:[1,39,40,41],neuralnetworksanddeeplearn:[39,40,41],neuron:[1,2,3,4,12,40,41],neutral:[0,32],neutron:[0,32],never:[1,3,4,6,9,29,35,39,40,41],new_box:[2,13,38],new_chang:[13,21,37,38],new_hobbit:32,new_root:[13,38],new_trac:[13,38],new_tracing_count:[3,4],newaxi:[0,3,6,9,35,36],newli:[0,32],newton:[1,7,8,13,29,39,40],next:[0,1,2,3,4,5,6,8,9,13,14,21,22,23,32,33,34,36,37,39,40,41],next_guess:[13,37],next_input:4,nf8_grad:13,nfrom:13,ng:[1,39,40,41],ngini:9,ni:14,nice:[0,1,5,11,32,33,34,35,39],nielsen:[27,39,40,41],nimport:13,niter:[13,21,36,37,38],nitric:[0,33],nlambda:[0,5,6,34,35,36],nlp:31,nm:29,nm_n:[0,32],nmse:[6,35],nn:[2,5,6,12,25,34,35,38,39,41],nn_model:[1,40,41],nnmin:[2,41],node:[1,2,3,9,10,12,23,27,38,39,40,41],node_constructor:[],nois:[0,4,5,6,8,9,10,13,15,16,19,26,32,33,34,35,36,37],noise_dimens:4,noisi:[1,6,19,26,35,39,40,41],non:[0,1,3,4,5,6,7,9,10,11,12,13,14,21,25,26,29,32,33,34,35,36,37,38,39,40,41],noncommerci:[27,35,41],none:[0,1,2,3,4,5,9,10,13,29,32,33,34,35,36,37,38,40,41],nonlinear:[3,6,8,9,11,12,35,38,39],nonneg:[6,9,13,35,36,37],nonparametr:6,nonsens:29,nonsingular:25,nonumb:[3,7,8,13,21,25,36,37,38],nonxla:[3,4],nor:[1,4,13,37,38,40,41],norm:[0,1,5,6,8,11,13,17,32,33,34,35,36,37,38,39,40,41],normal:[3,4,5,6,7,8,9,10,11,12,13,15,16,18,19,21,24,25,26,27,29,32,33,34,36,37,38,39],normali:[25,32],norvig:32,norwai:[6,26,27,32,38],notat:[0,2,5,6,13,14,21,29,32,33,34,35,37,41],note:[0,1,2,3,4,5,6,7,8,11,12,13,14,15,16,19,22,23,24,25,26,27,29,31,32,36,37,38,39,40,41],notebook:[0,1,3,9,15,24,26,27,32,35,39,40,41],notesexercise5week452022:32,notessep14:[19,36],notessep28:37,noth:[1,2,5,8,12,14,29,33,34,38,39,40,41],notic:[4,5,12,13,25,29,32,34,37,38,39],notimplementederror:[],notion:3,novel:[3,6,10,36],novemb:[1,23,28,30,32,40,41],now:[0,2,4,5,6,7,8,10,11,12,14,15,16,17,22,24,25,26,27,29,32,33,36,39],nowadai:[0,1,3,9,24,32,40,41],nox:[0,33],np:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,21,25,26,29,32,33,34,35,36,37,38,39,40,41],npr:[2,41],nprint:13,nsampl:[6,9,35,36],nt:[2,41],nthi:[0,32],ntrained_model:6,nu:29,nuclear:[5,33],nuclei:[0,29,32],nucleon:[0,32],nucleu:[0,32],num:4,num_allow_arg:[0,32],num_coordin:[2,41],num_hidden_neuron:[2,41],num_it:[2,41],num_iter:21,num_neuron:[2,41],num_neurons_hidden:[2,41],num_output:[3,4],num_point:[2,41],num_tre:10,num_valu:[2,41],number:[1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,22,25,26,27,28,30,32,34,35,36,39,40],numberid:[7,36],numberparamet:3,numer:[0,5,6,9,10,11,12,13,17,21,24,25,31,32,33,34,35,36,37,38,39],numpi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,24,26,29,33,34,35,36,39,40,41],numpy_vjp:[],numpy_wrapp:[],nunmpi:[5,33],nvalu:9,nx:[2,13,41],nx_test:6,nx_train:6,nx_train_mean:6,ny:29,ny_pr:6,ny_train:6,ny_train_mean:6,o:[0,6,7,8,9,11,15,21,25,30,31,32,33,36],obei:[6,11,13,33,34,35,37],object:[0,1,2,4,6,8,10,13,25,32,33,36,37,38],obliqu:[5,33],observ:[0,1,3,5,6,7,8,9,10,11,12,13,14,29,34,35,36,37,38,39,40,41],obtain:[0,1,5,6,7,8,9,10,12,13,14,17,21,22,23,25,26,27,29,32,33,34,35,36,37,38,39,40,41],obviou:[5,6,11,29,33],obviouli:32,obvious:[0,4,5,6,21,22,25,27,32,34,35],oc:33,occupi:[0,33],occur:[0,6,8,9,25,29,32],oct:[27,41],octob:[20,21,22,23,28,30,32,38],od:0,odd:[0,3,7,32,33,36],odenum:[2,41],odesi:[2,41],oen:0,off:[1,3,4,5,9,13,19,29,34,35,37,38,39,40,41],offer:[6,11,24,25,28,30,32,35],offic:[30,32],offici:[28,32],often:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,16,24,25,29,32,33,35,36,37,38,39,40,41],ofter:[25,32],ol:[0,13,15,16,17,18,22,27,32,33],old:[1,5,10,13,34,35,36,37,39,40,41],ols_fit:35,ols_fit_beta:35,ols_sk:6,ols_svd:6,olsbeta:[0,5,34],omega:[2,3,6,41],omega_0:3,omit:[0,5,32,33,34,35],on_train_batch_begin:[3,4],onc:[1,6,9,11,13,35,36,37,38,40,41],one:[0,1,3,4,5,6,7,8,9,10,11,13,14,19,21,22,23,24,25,26,27,29,30,32,33,34,35,38,40],onehot:[1,39,40,41],onehot_vector:[1,39,40,41],onehotencod:9,ones:[0,2,5,6,8,9,10,11,13,21,25,26,32,33,34,35,36,37,41],ones_lik:4,onl:3,onli:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,19,21,23,25,26,27,29,32,33,34,35,36,37,38,39,40,41],onlin:[11,28],onto:[5,11,33],op_nam:[3,4],open:[0,1,4,6,7,9,15,24,26,28,30,32,35,36,40,41],oper:[0,1,3,5,6,10,11,12,13,15,24,29,32,33,34,35,37,38,39,40,41],operation:29,oplu:29,opmiz:[13,37,38],opportun:[0,32],oppos:[6,13,37,38],opposit:[1,5,8,33,40,41],opt:[1,5,27,32,34,40,41],optim:[0,2,3,4,5,6,7,9,10,11,14,15,16,17,18,19,21,22,26,27,34,35],optimis:[1,3,40,41],optimizer_v2:3,option:[0,1,3,5,6,7,8,11,21,25,26,27,33,34,35,36,39,40,41],optionalxlacontext:[3,4],optmiz:[1,8,13,21,33,37,38,39,40,41],oral:32,orang:0,order:[0,1,2,3,5,6,7,8,9,10,11,12,15,16,22,23,25,26,27,29,32,33,34,35,36,39,40,41],ordinari:[0,2,3,7,11,13,15,16,17,19,21,22,24,27,35,36,37,38],ordinrari:35,oreilli:31,org:[0,3,4,7,11,21,24,25,31,32,36,37,38,41],organ:[6,7,10,25,35,36],orient:[1,5,29,33,34],origin:[0,3,5,6,8,11,12,13,25,32,33,35,37,38,39],orthogn:[5,33],orthogon:[0,5,6,8,11,13,17,25,32,33,34,37],orthonorm:[5,33,34],os:[0,1,4,5,6,7,8,9,30,32,33,34,35,36,40,41],oscar:[1,40,41],oscil:[3,13,37,38],oslo:[0,15,24,26,27,28,30,32,33,34,35,36,37,38,39,40,41],osx:[0,15,24,26,32],other:[0,1,2,3,5,6,7,8,10,13,14,15,19,24,26,27,28,29,30,31,34,35,37,40,41],otherwis:[0,1,4,7,13,21,25,27,32,33,36,37,38,39,40,41],ouput:[5,7,12,34,35,36,39,40],our:[1,2,3,6,7,8,9,10,12,14,15,16,17,18,19,21,22,23,24,25,26,27,29,34,35,38],ourmodel:0,ourselv:[0,5,6,8,11,13,32,33,34,35,36,37],out1:[],out2:[],out:[0,1,2,4,5,6,7,8,9,10,11,12,13,16,21,24,25,26,27,29,32,33,34,35,36,37,38,39,40,41],out_fil:9,outcom:[0,7,9,10,12,29,33,36,39],outdoor:9,outer:[6,12,13,39,40],outfil:4,outgrad:2,outlier:[0,8,32,33],outlin:[6,10,11,35],outlook:9,outperform:10,output:[0,1,3,4,5,6,7,8,9,10,12,13,16,23,25,26,27,29,32,33,34,35,36,37,38,39],output_bia:[1,39,40,41],output_bias_gradi:[1,39,40,41],output_shap:4,output_weight:[1,39,40,41],output_weights_gradi:[1,39,40,41],outputlayer1:[12,38,39],outputlayer2:[12,38,39],outsid:4,over1:[13,37,38],over:[0,1,3,4,5,6,9,10,12,13,21,25,26,32,33,34,35,36,37,38,39,40,41],overal:[1,10,39,40,41],overcast:9,overcom:[12,13,37,38,39],overdetermin:[0,32],overfit:[0,1,3,6,9,10,13,21,35,37,38,39,40,41],overflow:[1,5,34,35,39,40,41],overhead:[12,39],overlap:[3,7,8,9,36],overlin:[0,5,6,9,10,11,14,25,32,33,34,35],overst:[0,32],overtrain:4,overview:[3,36],own:[4,5,6,8,12,13,21,22,24,25,26,34,35,37,38,39,40,41],owner:[0,33],ownmsepredict:0,ownmsetrain:0,ownridgebeta:[0,6,34],ownypredictridg:0,ownytilderidg:0,oxid:[0,33],p0:[2,41],p1:[2,41],p:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,17,25,29,32,33,34,35,36,37,39,40,41],p_:[2,4,8,9,41],p_hidden:[2,41],p_i:[5,29,34,35],p_j:29,p_n:29,p_output:[2,41],p_x:29,pack:[0,32],packag:[0,1,2,3,4,5,6,7,8,11,13,15,21,22,24,26,27,29,33,34,36,37,38,39,40,41],pad:[3,4],page:[0,24,32],pai:[0,1,9,13,37,38,40,41],pair:[0,2,3,9,24,29,32,33,41],pamilla:32,panda:[0,4,5,6,7,9,11,15,24,26,34,35,36],panel:32,paper:[1,40,41],paradigm:[0,32],parallel:[3,4,10,13,21,24,25,32,37,38],param:[2,4,41],param_distribut:36,param_grid:36,paramat:[2,41],paramet:[0,1,2,3,4,5,6,7,8,9,10,12,13,16,17,18,19,21,22,26,27,29,34,35,39,40,41],parameter:[0,6,10,26,32,33],parametr:[0,6,15,16,32,33,35],paramt:[3,5,34,35],parent:2,parent_argnum:[],parser:[0,32],part:[0,1,3,5,6,10,17,18,21,22,23,25,28,29,30,32,34,35,38,40,41],partial:[0,1,5,6,7,8,10,11,12,13,16,29,32,33,34,35,36,37,39,40],particip:[24,28,30,32],particl:[0,4,13,29,32,37,38],particular:[0,1,2,3,5,6,9,10,11,12,13,16,26,29,31,32,33,34,35,36,37,38,39,40,41],particularli:[5,6,8,11,13,21,29,33,35,36,37,38],partit:[1,4,9,39,40,41],partli:[6,32],pass:[2,3,12,14,23,36],password:[26,27],past:[10,29],patch:[6,29,35],path:[0,4,6,7,9,15,24,32,33,35,36],pathcollect:21,patient:[7,36],patter:4,pattern:[0,3,4,12,28,31,32,38,39],pauli:[0,32],pc:[11,24],pca:[0,7,24,32,33,36],pcolor:6,pcolormesh:6,pd:[0,4,5,6,7,9,11,32,33,34,35,36],pde:[2,41],pdf:[0,3,4,5,6,9,19,20,26,27,31,32,34,35,36,37,41],pedagog:[0,32,33],penal:[6,33,34,35],penalti:[6,13,26,33,34,35,36,37],penros:[5,6,34],pentagon:[13,36,37],peopl:[0,1,9,13,24,33,37,38,39,40,41],per:[0,1,6,28,30,32,33,35,40,41],percentag:[0,10,11,30,33],perceptron:[0,1,7,32,36,41],peregrin:32,perfect:[0,1,13,21,32,37,38,39,40,41],perfectli:[4,6,35],perform:[0,2,3,4,5,6,8,10,11,12,13,14,15,16,17,19,21,23,24,25,26,27,29,32,33,34,35,36,37,38],performac:4,perhap:[0,5,13,32,33,34,36,37],perimet:[1,9,40,41],period:[1,4,29,39,40,41],permut:11,persist:[13,37,38],person:[5,6,7,28,30,32,33,34,35,36],perspect:31,pertin:[12,27,39,40],petal:[8,9],peter:31,phantom:29,phase:[6,12,38,39],phd:41,phenomena:29,phi:8,phi_k:8,philosophi:[13,37],phone:[30,32],photo:4,php:27,phrase:[0,32],physic:[0,1,4,7,12,13,27,29,30,31,32,33,34,35,36,37,38,39,40,41],physicist:27,pi:[2,3,5,6,7,9,12,13,29,34,35,36,37,38,39,41],pick:[1,9,10,11,13,14,37,38,39,40,41],pickl:[1,40,41],pictur:[0,32],pie:[24,32],piec:[11,14],pillow:[0,15,24,26,32],pinv:[5,6,13,21,33,34,35,37,38,39],pip3:[0,1,15,26,32,40,41],pip:[0,1,15,24,26,32,40,41],pipelin:[0,6,8,10,33,35],pippin:32,pit:4,pitfal:[6,33,34],pitt:[12,38,39],pixel:[1,3,4,39,40,41],pixel_height:[1,3,39,40,41],pixel_width:[1,3,39,40,41],place:[0,4,6,8,13,25,26,32,35,36,37],plai:[0,3,4,5,6,8,11,24,32,33,34,35,36],plain:[8,10,12,13,14,21,22,27,36,37,39],plan:[6,9,30,31,32],plane:[8,9],plateau:[5,34],platform:[3,4,24,32],plausibl:[12,38,39],pleas:[6,7,11,13,26,27,30,32,33,36,37,38],plenti:[1,40,41],plethora:[3,12,38,39],plot:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,21,24,25,26,27,29,32,33,34,37,38,39,40,41],plot_confusion_matrix:[7,10,36],plot_count:6,plot_cumulative_gain:[7,10,36],plot_data:[1,40,41],plot_dataset:8,plot_decision_boundari:[9,10],plot_import:10,plot_max:4,plot_min:4,plot_model:4,plot_numb:4,plot_predict:8,plot_regression_predict:9,plot_result:4,plot_roc:[7,10,36],plot_surfac:[2,6,13,26,37,41],plot_train:9,plot_tre:[9,10],plqvvvaa0qudcjd5baw2dxe6of2tius3v3:[],plt:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,25,26,29,32,33,34,35,36,37,38,39,40,41],plu:[0,3,5,7,32,33,34,36],pm:[8,35],pmatrix:[2,41],pml:31,pn:3,png:[0,4,6,7,9,32,33,35,36],point:[0,1,2,3,5,6,7,8,9,10,11,13,14,15,16,17,19,21,22,23,25,26,29,30,32,33,35,36,37,38,39,40,41],point_1:4,point_2:4,poisson:[24,29,32],poli:[6,8,35,36],poly100_kernel_svm_clf:8,poly3:0,poly3_plot:0,poly3dcollect:[13,37],poly_featur:[8,9],poly_features10:9,poly_fit10:9,poly_fit:9,poly_kernel_svm_clf:8,polydegre:[0,5,6,10,33,34,35],polygon:[13,36,37],polym:[12,38,39],polymi:26,polynomi:[0,5,6,7,8,9,10,11,15,16,17,19,21,22,26,27,32,33,35,36],polynomial_featur:[6,35],polynomial_svm_clf:8,polynomialfeatur:[0,6,8,9,33,35,36],polytrop:[0,6,32,35],pool:3,pool_siz:3,poor:[1,13,21,36,37,38,40,41],poorli:[0,33],pop:[],popul:[0,5,32,33,34,35],popular:[0,1,3,6,7,8,9,11,12,15,24,25,26,29,32,33,36,38,39,40,41],popularli:[0,32],portabl:10,portion:[11,13,21,37,38],pose:[0,4,5,6,11,29,32,35],posit:[0,1,2,3,5,7,8,10,11,13,14,17,25,29,32,33,34,35,36,37,38,39,40,41],possibl:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,19,21,23,24,25,26,27,29,30,32,33,34,35,36,37,38,39,40],possible_gradient_typ:[3,4],possible_gradient_types_non:[3,4],possibletapegradienttyp:[3,4],posterior:[5,34,35],postpon:[0,32,33],postscript:[26,27],postul:[5,34,35],potenti:[0,3,5,6,12,13,32,33,34,35,37,38,39],pott:[12,38,39],power:[0,1,5,6,8,9,12,13,32,33,35,37,38,39,40,41],pp:[5,6,18,34,35,36],practic:[0,5,6,7,8,26,27,29,33,34,35,36],practition:[0,1,3,32,40,41],pre:32,preced:[1,11,12,29,38,39,40,41],preceed:4,preceq:8,precis:[0,2,5,11,13,25,26,27,29,32,33,34,35,37,38,41],pred:[6,35,37,38],predicit:0,predict:[0,1,5,6,7,8,9,10,15,16,24,26,31,32,33,34,35,36,38,39,40,41],predict_prob:[1,39,40,41],predict_proba:[7,10,36,38,39],predictor:[0,5,6,7,9,10,11,32,33,34],prefer:[0,1,6,8,9,11,13,15,24,26,27,32,40,41],prepar:[0,6,25,26,27,32,33],preprocess:[0,4,6,7,8,9,10,11,34,35,36],prerequisit:0,prescript:[26,27],presenc:[13,37,38],present:[0,5,6,7,9,12,13,21,25,26,27,29,32,33,34,37,38,39],preserv:[3,11,25],press:[13,31,36,37],pretrain:[1,4,40,41],pretti:[0,4,8,9,15,24,26,32],prev_centroid:14,prev_g:2,prev_g_flag:2,prevent:[13,29,37,38],previou:[0,1,2,3,4,5,6,8,10,11,12,13,21,22,25,26,27,29,33,36,37,38,39,40,41],previous:[2,3,9,10,29,41],price:[0,4,9,13,33,37,38],primal:8,primari:[0,7,32,36],prime:29,primit:2,princip:[0,5,7,24,32,33,36],principl:[0,6,7,8,14,32,35,36],print:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,21,25,29,32,33,34,35,36,37,38,39,40,41],print_funct:[8,9],printout:[0,32],prior:[0,5,6,32,33,34,35],privat:[0,32],pro:27,prob:[1,29,40,41],probabilist:[0,31,32,33],probabl:[0,1,3,4,6,7,10,13,24,32,33,36,37,38,39,40,41],problem:[0,3,4,5,6,7,8,9,10,11,12,16,17,24,25,26,27,29,35],probml:31,proce:[0,5,6,7,8,9,10,11,13,25,32,33,34,35,37],procedur:[2,4,5,6,8,10,11,13,21,26,33,34,35,36,37,38,41],proceed:25,process:[0,2,4,6,9,10,12,13,15,21,24,25,26,29,31,32,35,36,37,38],prod:31,prod_:[1,5,7,34,35,36,39,40],produc:[0,3,4,5,6,9,10,11,12,13,24,25,26,29,32,33,34,35,37,38,39],product:[0,1,3,5,6,7,8,12,13,16,21,24,25,32,33,34,35,36,39,40,41],profess:[0,32],profil:[3,4],profile_util:[3,4],progag:27,program:[0,1,4,5,6,8,12,14,15,16,21,24,25,28,29,30,32,33,35,38,39,40],programm:25,progress:[1,4,14,37,40,41],prohibit:[6,35],project1:[6,26],project:[0,1,2,3,5,11,13,17,18,19,20,21,22,23,24,28,30,33,34,35,37,38,39,40,41],project_root_dir:[0,6,7,9,32,33,35,36],promin:[12,38,39],promis:8,promot:[30,32],prone:9,pronounc:[13,24,32,37,38],proof:[0,11,12,13,32,35,36,37,39],propag:[2,3,13,23,27,37,38],proper:[0,2,6,7,26,32,35,41],properli:[1,6,8,10,13,21,26,27,37,38,40,41],properti:[0,1,3,12,13,16,17,25,32,35,37,38,39,40],proport:[0,1,5,9,11,13,16,29,32,33,37,38,39,40,41],propos:[1,4,6,10,23,26,27,32,40,41],propto:[5,13,34,35,36,37,38],proton:[0,32],prove:[3,13,36,37,38],provid:[0,1,3,4,5,6,8,9,10,12,13,15,21,24,25,26,27,29,32,33,34,35,36,37,38,39,40,41],proxi:[1,13,21,37,38,40,41],prune:9,pseudo:[25,29,37],pseudocod:[26,27],pseudoinv:[5,34],pseudoinvers:[5,6,34],pseudorandom:[6,29,35],psycholog:[0,32],pt:[13,37],ptratio:33,punish:[0,1,32,39,40,41],pure:[3,9,29],purest:9,puriti:9,purpos:[0,3,10,12,14,32,33,38,39],put:[1,32,40,41],py:[0,1,2,3,4,5,6,7,8,11,13,21,26,32,33,34,35,36,37,38,39,40,41],pycod:32,pydata:24,pydot:9,pyhton2:32,pylab:[0,7,32,36],pylint:[3,4],pypi:24,pyplot:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,25,26,29,32,33,34,35,36,37,38,39,40,41],pythagora:[5,34,35],python2:[0,15,26,32],python3:[0,1,2,3,4,6,7,8,11,13,15,21,24,26,32,33,34,36,38,39,40,41],python:[1,2,3,4,5,6,8,11,12,13,14,16,21,22,26,27,29,33,34,37,38,39,40,41],pytorch:[0,24,26,27,32],pywrap_tf:[3,4],q:[5,6,8,11,29,33,35],qp:8,qquad:[2,11,13,25,37,38,41],qr:[5,6,25,33],quad:[1,13,25,37,39,40,41],quadrat:[0,8,9,13,15,16,32,37],qualit:[4,9,26,27,29],qualiti:[0,9,15,16,24,32,33],quantifi:[1,40,41],quantil:10,quantit:[0,6,9,26,27,32,35],quantiti:[0,2,5,6,7,9,10,11,12,14,16,25,29,32,33,34,35,36,39,41],quantum:[4,12,31,32,38,39],quartil:[0,33],quench:5,queri:9,question:[0,5,6,9,11,12,13,26,30,32,33,34,35,37,38,39],qugan:4,quick:[4,29],quick_execut:[3,4],quickli:[1,3,9,11,13,36,37,40,41],quit:[1,5,6,9,10,12,33,35,38,39,40,41],quot:[4,32],r2:[0,5,6,27,32,33,34,36],r2_score:[0,32,33],r2score:[0,32],r:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,21,24,25,26,29,33,34,35,36,37,38,39,41],r_1:9,r_2:9,r_j:9,r_m:9,rad:[0,33],radial:[0,8,12,33,38,39],radioact:29,radiu:[0,1,9,33,40,41],rag:2,rain:9,rais:[0,2,13,32,34,38],ramp:[1,40,41],ran0:29,ran1:29,ran2:29,ran3:29,rand:[0,4,5,6,9,10,13,15,16,21,25,32,33,34,35,36,37,38],randint:[6,9,13,21,35,37,38],randn:[0,1,2,5,6,9,11,13,15,16,21,32,33,34,35,36,37,38,39,40,41],random:[0,1,2,3,4,5,6,8,9,13,14,15,16,21,24,25,26,32,33,34,35,37,38,39,40,41],random_forest_model:10,random_index:[13,21,37,38],random_indic:[1,3,39,40,41],random_st:[0,7,8,9,10,11,33,36,38,39],randomforestclassifi:10,randomizedsearchcv:36,randomli:[1,6,9,13,14,21,35,36,37,38,39,40,41],randuniform:36,rang:[0,1,2,3,4,5,6,7,9,10,11,12,13,14,21,25,29,32,33,34,35,36,37,38,39,40,41],rangl:[0,6,11,29,32,33],rangle_x:29,rank:[5,33],rankdir:4,raphson:[1,8,13,39,40],rapidli:[0,32],rare:[1,13,32,35,36,37,38,39,40,41],rate:[0,1,2,3,4,8,9,10,12,13,22,27,33,36,39,40,41],rather:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,25,29,32,33,34,35,36,37,38,39,40,41],ratio:[4,7,9,10,11,36],rational:[0,32],ravel:[5,6,7,8,9,10,11,13,25,33,35,36,37],raw:3,raw_df:33,rbf:[8,11,12,38,39],rbf_kernel_svm_clf:8,rbf_pca:11,rc:[0,29,33],rcond:[0,32,33],rcparam:[0,1,3,7,8,9,10,29,32,36,39,40,41],re:[2,4,13,36,37,41],reach:[1,4,5,6,7,9,10,11,12,13,14,34,35,36,37,38,39,40,41],read:[0,2,3,4,5,6,7,8,11,12,16,21,22,23,25,26,27,28,29,31,34,36,37,38,39,40,41],read_csv:[0,6,7,9,32,33,35,36],read_fwf:[0,32],reader:[0,6,25,29,32,33,34],readi:[0,1,5,6,8,10,11,12,25,26,32,34,35,39,40],readili:[1,39,40,41],readthedoc:24,real:[0,1,2,4,7,10,11,12,13,25,33,35,36,38,39,40],real_loss:4,real_output:4,realist:8,realiti:29,realiz:[1,12,38,39,40,41],realli:[0,1,32,40,41],rearrang:[13,37,38],reason:[0,1,3,4,10,13,31,32,36,37,38,40,41],reassign:[1,40,41],recal:[5,6,9,10,11,12,25,29,32,33,34,35,36,37,39],recast:3,receiv:[1,3,10,12,29,38,39,40,41],recent:[0,2,3,4,6,9,10,13,15,21,26,31,32,34,35,36,37,38],recept:[3,12,38,39],receptive_field:3,recip:[0,6,7,25,26,27,32,33,36],reciproc:[5,34],recogn:[0,4,5,10,32,34,35],recognit:[0,1,3,12,28,31,32,38,39,40,41],recommend:[0,2,3,4,5,6,8,13,15,18,21,22,24,25,26,27,31,34,35,39,40,41],reconsid:9,reconstruct:11,record:[10,20,26,27,28,30,32,37,38],rectangl:[9,13,36,37],rectangular:[5,33],rectifi:[1,3,12,38,39,40,41],recur:[0,24,32],recurr:[0,1,24,32,40,41],recurs:[9,24,25,32],red:[0,3,4,6,8,9,21,35,37],redefin:[0,10,32,33],redefinit:34,reduc:[1,3,5,6,9,10,11,13,21,32,34,35,36,37,38,39,40,41],reduct:[0,10,11,24,29,32,33],refer:[0,1,2,3,5,6,7,11,12,13,14,20,25,26,27,31,32,33,35,36,37,38,39,40,41],referenc:[2,41],refin:[12,38,39],refit:[6,35],reflect:[0,1,4,5,26,27,29,32,40,41],refresh:[24,32],refreshprogrammingskil:32,reg:[10,11],regard:[1,9,13,37,40,41],regardless:[12,38,39],region:[3,4,6,9,12,26,38,39],regist:[6,26,29],reglasso:[5,34],regr_1:[0,9],regr_2:[0,9],regr_3:[0,9],regress:[1,8,11,12,15,16,21,22,23,24,25,40,41],regressor:[0,7,10,32,36],regridg:[0,5,6,34,35,36],regular:[0,3,4,5,6,7,9,13,17,27,30,32,33,34,35,37,38],regularis:6,reilli:[0,15,31,32],reinforc:[0,8,24,32,41],reiter:[1,40,41],reject:7,rel:[0,4,6,7,9,12,13,29,32,33,35,36,37,38,39],relat:[0,1,3,4,5,11,13,14,25,29,32,34,35,37,38,40,41],relationship:[0,4,9,32],relativeerror:[0,32,33],releas:[1,3,4,6,13,24,26,27,32,35,37,40,41],relev:[0,1,5,7,11,15,21,22,23,24,26,27,29,32,40,41],reli:[0,6,8,32],reliabilti:[26,27],reliabl:[7,29,36],relu:[3,4,27,39],remain:[1,2,4,6,12,25,29,33,34,35,36,38,39,40,41],remaind:29,reman:[2,41],remark:[1,40,41],rememb:[0,8,13,25,26,27,32,37,38],remind:[0,5,11,13,25,29,33,34,35],remov:[0,4,5,6,32,33,34,35],render:[0,32,33],reorder:[5,7,33,34,36],reorgan:[0,32],repeat:[0,1,3,4,5,6,9,10,11,13,14,21,22,25,26,27,29,32,34,35,36,37,38,39,40,41],repeated:32,repeatedli:[0,6,10,13,35,37,38],repet:3,repetit:[6,32,33,35,36,37],rephras:[13,36,37],replac:[0,1,3,4,5,6,10,12,14,15,16,21,22,24,26,27,32,33,34,35,36,39,40,41],replica:[6,35],repo:[26,27],report:[20,32,37,38],reportexampl:[20,26],reportsampl:20,repositori:[0,4,26,27,32,33],repres:[0,1,2,3,4,5,6,7,8,9,10,12,13,27,29,32,33,34,35,36,37,38],represent:[0,1,3,6,29,32,35,36,39,40,41],representd:3,reproduc:[0,5,6,9,12,15,16,24,26,29,32,33,39],repuls:[0,32],request:[0,13,21,32,37,38],requir:[0,1,3,4,5,6,8,9,11,12,13,17,25,32,33,34,35,36,37,38,39,40],res1:[2,41],res2:[2,41],res3:[2,41],res_analyt:[2,41],res_analytical1:[2,41],res_analytical2:[2,41],res_analytical3:[2,41],resaml:[6,26],resampl:[0,7,10,19,24,32,33,36,37],rescal:[0,11,12,33,38,39],rescu:[5,34,35],reseach:[6,26],research:[0,4,13,21,24,31,32,37,38],resembl:[6,29,35],reserv:[1,5,6,29,34,35,39,40,41],reshap:[0,1,2,3,4,6,8,9,10,15,16,25,32,33,35,39,40,41],residenti:[0,33],residu:[0,5,13,32,37],resiz:[5,33],resourc:32,respect:[0,1,2,3,5,6,7,8,10,11,12,13,14,16,17,21,26,29,32,33,34,35,36,37,38,39,40,41],respond:[12,38,39],respons:[0,7,9,12,32,33,36,38,39],rest:[0,5,33],restat:[0,12,32,39],restor:4,restored_discrimin:4,restored_gener:4,restrict:[0,3,9,12,32,38,39],result:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,21,22,23,24,25,26,27,29,32,35,36,37,38,39,40,41],retail:[0,33],retain:[5,6,33,35,36],rethink:35,return_data:14,return_sequ:4,return_x_i:9,reus:[1,3,6,18,19,20,26,27,40,41],reveal:[0,12,32,38,39],revers:[1,25,40,41],review:[24,25],revisit:[14,39],revolut:32,reward:[0,4,32],rewrit:[0,3,5,6,7,8,10,11,12,13,19,25,26,29,34,36,37,38,39],rewritten:[2,6,8,10,29,35,41],rewrot:[13,36,37],rf:10,rgb:3,rgoj5yh7evk:24,rh:[6,35],rho:[0,10,13,21,32,37,38],rho_1:10,rho_2:10,rho_m:10,rich:[0,32],ride:9,rideclass:9,ridedata:9,ridg:[7,11,13,21,22,24,27,32],ridge_fit:35,ridge_fit_beta:35,ridge_sk:6,ridgebeta:[5,34],ridgecv:36,right:[0,1,2,3,5,6,7,8,9,10,12,13,14,16,17,19,25,26,29,32,33,34,35,36,37,38,39,40,41],right_sid:[2,41],rightarrow:[0,1,5,6,8,11,12,13,29,32,33,35,36,37,38,39,40,41],rigor:[0,32],ring:6,rise:[0,32],risk:[0,13,15,16,32,36,37,38],rival:4,river:[0,33],rm:[0,29,33],rmse:[0,33],rmsporp:[13,21,37,38],rmsprop:[1,3,4,13,22,27,40,41],rnd_clf:10,rng:29,rnn1:4,rnn2:4,rnn:[4,12,38,39],rnn_2layer:4,rnn_input:4,rnn_output:4,rnn_train:4,rntrick1:29,rntrick2:29,rntrick3:29,rntrick4:29,ro:[0,13,21,32,36,37,38],robert:[18,26,31],robust:[0,32],robustscal:[0,33],roc:[7,10],role:[0,2,5,6,8,24,32,33,34,35,36,41],roll:6,room:[0,30,32,33],root:[0,5,9,13,29,32,33,34,36,37,38],rot:32,rotat:[1,8,9,10,40,41],rotation_matrix:9,roughli:[1,3,40,41],round:[0,7,9,13,33,36,37,38],routin:[13,25,32,36,37],row:[0,1,2,5,6,7,9,11,25,32,33,34,35,36,39,40,41],rr:[5,33],rrr:[5,33],rug:[13,36,37,38],rule:[0,1,5,6,13,26,32,33,34,35,37,38,40,41],run:[0,1,2,3,4,5,6,8,9,11,13,15,21,24,26,27,32,33,34,35,36,37,38,40,41],runtim:[1,6,14,40,41],runtimewarn:[1,6,35,39,40,41],russel:32,rust:[0,15,24,25,32],rv_frozen:36,rvert:[1,39,40,41],rvert_2:[1,39,40,41],s:[0,1,2,3,4,5,6,7,9,11,12,13,16,17,18,24,25,26,27,29,32,33,34,39,40,41],s_1:6,s_:[3,6],s_i:[6,7,36],s_j:6,s_k:6,saddl:[13,36,37,38],sai:[0,1,2,3,4,5,6,7,8,9,10,11,12,25,26,29,32,33,34,35,36,39,40,41],said:[6,9,13,36,37],sake:[0,5,7,11,32,33,34,36],sale:[0,32],sam:32,same:[0,1,2,3,4,5,6,8,9,11,12,14,17,23,25,26,29,32,33,34,36,39,40,41],samm:10,sampl:[0,1,2,3,4,5,6,7,8,9,10,13,14,15,16,19,21,24,25,26,29,32,33,34,35,36,37,38,39,40,41],sample_vari:14,sample_weight:[3,4],sampleexptvari:29,samwis:32,sastri:11,satisfactori:[0,32],satisfi:[1,2,3,6,8,13,17,25,29,35,36,37,39,40,41],satur:[1,6,35,40,41],save:[0,4,6,7,9,13,21,32,33,35,36,37,38],save_fig:[0,6,7,9,10,32,33,35,36],savefig:[0,4,6,7,9,29,32,33,35,36],savetxt:4,saw:[5,33],scalabl:10,scalar:[2,5,6,10,13,33,34,35,38,41],scale:[0,1,3,5,6,7,8,9,10,11,12,13,15,16,17,21,24,25,26,27,30,32,34,36,37,38,39,40,41],scale_mean:4,scale_std:4,scaler:[0,7,8,9,10,11,33,35],scan:[5,7,34,35,36],scari:[5,34,35],scatter:[0,1,6,7,8,9,14,21,32,33,34,35,36,40,41],scenario:[6,13,36,37,38],schedul:[13,30,37,38],scheme:[1,13,36,37,38,40],schrage:29,scienc:[0,1,10,12,13,24,28,29,30,31,33,36,37,38,39,40,41],scientif:[0,15,24,26,27,32,37,38],scientist:[0,32],scikit:[3,5,6,7,8,9,10,13,21,23,24,25,26,27,28,31,38],scikit_learn:[0,16],scikitlearn:32,scikitplot:[7,10,36],scipi:[0,3,5,6,13,15,24,25,26,32,33,34,35,36,37],scl:6,score:[0,1,3,6,7,9,10,11,15,16,22,23,26,27,30,32,33,35,36,37,38,39,40,41],scores_kfold:[6,35,36],scratch:[1,13,38,39,40,41],sdg:[13,21,37,38],seaborn:[0,1,3,6,7,21,27,32,33,36,39,40,41],seamless:[0,15,24,26,32],search:[0,1,3,5,9,13,32,34,37,38,39,40,41],sec:6,second:[0,2,3,4,5,6,7,8,9,11,12,14,15,16,24,25,26,27,29,30,32,33,35,36,39,41],second_mo:[21,37,38],second_term:[21,37,38],secondeigvector:11,secondli:[12,39,40],section:[4,11,17,25,29,33,34,36,37,38],sector:[0,32],see:[0,1,2,3,4,5,6,7,8,10,11,12,13,15,16,17,18,19,21,24,25,26,27,29,32,33,34,35,36,37,38,39,40,41],seed:[0,1,2,3,4,5,6,8,9,11,13,14,15,16,21,26,29,32,33,34,35,36,37,38,39,40,41],seed_imag:4,seek:[1,2,8,40,41],seem:[1,3,4,37,38,39,40,41],seemingli:[0,32],seen:[0,1,3,5,10,12,17,29,32,39,40,41],segment:[13,36,37],seismic:6,seldomli:[0,32],select:[1,5,6,8,9,10,11,17,26,27,28,29,30,31,32,33,34,35,39,40,41],self:[1,3,4,5,21,33,34,39,40,41],sell:4,semest:[7,28,36],semi:[8,13,36,37],semilogx:6,send:[5,12,13,30,32,37,38,39],senior:[28,30],sens:[0,4,6,8,26,32,35],sensibl:3,sensit:[0,5,6,9,13,32,33,34,35,38],sent:[2,35,41],sentdex:[],sentenc:[4,12,38,39],sep:[33,35],separ:[0,1,2,4,6,8,9,12,14,15,24,26,29,32,35,38,39,40,41],septemb:[16,17,18,19,20,26,32,33,37],sequenc:[2,3,4,7,9,10,12,13,24,25,29,32,36,37,38,39],sequenti:[1,3,4,10,12,29,38,39,40,41],seri:[0,1,2,3,4,5,6,10,11,12,13,25,32,33,34,35,36,37,38,39,40,41],serif:[0,7,29,32,36],serv:[0,1,2,3,5,7,13,21,26,31,32,33,34,35,36,37,38,40,41],servic:[26,27],session:[1,20,26,28,30,32,35,36,37,38,39,40,41],set:[1,4,5,6,7,8,10,11,13,14,16,17,21,24,25,26,27,29,30,34,35,37,38],set_major_formatt:[6,26],set_major_loc:[6,26],set_tick:[1,8,40,41],set_ticklabel:[1,40,41],set_titl:[0,1,2,3,7,12,14,32,36,38,39,40,41],set_xlabel:[0,1,2,3,7,12,32,36,38,39,40,41],set_xlim:[7,12,36,38,39],set_xticklabel:[1,40,41],set_ylabel:[0,1,2,3,7,32,36,39,40,41],set_ylim:[7,12,36,38,39],set_ytick:[7,36],set_yticklabel:[1,6,40,41],set_zlim:[6,26],seth:4,setminu:[6,36],setosa:[8,9],setosa_or_versicolor:8,setp:[6,35],setup:[1,4,6,8,21,24,27,32,33,39,40],sever:[0,3,5,6,7,8,9,11,12,13,21,24,25,27,29,32,33,34,35,36,37,38,39],sgd:[1,3,21,22,27,36,40,41],sgd_clf:8,sgdclassifi:8,sgdreg:[13,36,37],sgdregressor:[13,36,37],sgn:[5,33,34],shallow:[13,37,38],shape:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,25,32,33,34,35,36,37,39,40,41],shape_bas:[],share:[1,3,32,40,41],she:[7,36],shell:21,shift:[1,6,12,29,34,38,39,40,41],ship:3,shire:32,shortcom:[13,36,37,38],shorten:4,shorter:29,shorthand:[32,35],shortli:[25,32],should:[0,2,3,5,6,8,9,11,12,13,15,16,21,22,25,26,27,29,32,33,34,35,37,38,39],should_sync:[3,4],show:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,21,25,26,29,32,33,34,35,36,37,38,39,40,41],show_shap:4,shown:[0,4,5,7,8,11,12,13,21,25,33,36,37,38,39],shrink:[3,5,6,8,11,26,33,34],shrinkag:[5,6,33,34],shrunk:11,shuffl:[0,1,3,4,6,13,21,33,35,36,37,38,39,40,41],side:[0,2,5,8,12,13,25,27,32,34,35,36,37,38,39,41],sigh:[24,32],sigma0:29,sigma1:29,sigma2:29,sigma:[0,1,5,6,7,10,11,12,13,17,18,19,25,26,29,32,33,34,35,36,37,38,39,40,41],sigma_0:[5,33,34],sigma_1:[5,33,34],sigma_2:[5,33,34],sigma_:[5,25,32,33,34,35],sigma_fn:[7,12,36,38,39],sigma_i:[0,5,32,33,34],sigma_j:[5,17,33,34],sigma_m:[6,29,35],sigma_n:[11,29],sigma_t:[13,37,38],sigma_x:29,sigmoid:[1,2,4,7,8,10,12,23,27,36,37,38,39],sigmundson:[6,33,34],sign:[1,2,7,8,10,29,30,36,39,40,41],signal:[1,3,10,12,38,39,40,41],signatur:[3,4],signifi:4,signific:[1,40,41],significantli:[1,13,21,29,36,37,38,39,40,41],sim:[4,5,6,13,18,26,29,34,35,37,38],similar:[0,1,2,3,4,5,6,7,8,9,10,11,14,17,24,25,26,27,32,33,34,35,36,40,41],similarli:[0,1,3,5,8,10,13,20,29,32,33,34,40,41],simpl:[1,2,3,5,6,7,8,10,11,12,14,15,16,17,19,21,22,23,24,25,26,27,29,35,39,40,41],simple_rnn:4,simplepredict:10,simpler:[0,1,5,6,7,13,16,19,21,22,23,24,26,27,32,34,37,38,40,41],simplernn:4,simplest:[0,1,3,4,9,10,12,14,32,38,39,40,41],simpletre:10,simpli:[0,1,2,4,5,6,8,9,10,11,12,15,24,25,26,27,29,32,33,34,35,38,39,40,41],simplic:[2,5,6,7,8,9,10,11,12,14,33,34,35,36,38,39,41],simplicti:[5,33],simplifi:[0,6,9,15,24,26,32,33,34,35],simplist:[3,6,29,35],simul:[6,35],simultan:[6,35],sin:[0,1,2,3,4,9,12,13,21,25,32,37,38,39,40,41],sinc:[0,1,2,3,5,6,7,8,9,10,11,13,21,23,25,29,31,32,33,34,35,36,37,38,39,40,41],sine:[3,12,38,39],singl:[0,1,2,3,5,6,7,8,9,12,13,25,27,29,32,33,34,35,36,37,40,41],singular:[0,6,13,25,26,32,34,35,36,37],sinusoid:3,site:[0,1,2,3,4,6,7,8,11,13,21,26,27,28,32,33,34,36,38,39,40,41],situat:[0,4,5,7,13,21,29,32,33,36,37,38],six:[3,29],size:[0,1,2,3,4,5,6,8,9,10,11,13,21,22,25,26,27,29,32,34,35,36,37,38,39,40,41],sketch:10,ski:9,skill:[0,32],skip:[3,4,11],skiprow:33,skl:[0,6,32,33,34],sklearn:[0,1,3,5,6,7,8,9,10,11,13,14,32,33,34,35,36,37,38,39,40,41],skplt:[7,10,36],sl:[6,34,36],slack:8,slice:[2,25,32,41],slide:[0,3,15,16,26,27,29,32,33,35,37,39,40,41],slight:[6,13,35,37,38],slightli:[1,2,3,5,6,7,10,29,33,34,35,36,40,41],slope:[8,11,12,38,39],slow:[0,2,8,13,33,36,37,38,41],slower:[5,25,32,33,34],slowest:25,slowli:[12,39],slp:[1,39,40,41],small:[0,1,2,3,5,6,8,9,10,11,12,13,21,24,25,26,29,32,33,34,35,36,37,38,39,40,41],smaller:[0,1,2,5,6,8,9,11,13,29,32,33,34,35,36,37,38,40,41],smallest:[0,4,14,15,16,32,36],smallest_row_index:14,smooth:[0,3,6,9,13,26,32,36,37],sn:[0,1,3,6,7,32,33,36,39,40,41],sne:11,sneak:32,so:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19,21,23,24,25,26,27,29,30,32,33,34,35,36,37,38,39,40,41],soar:6,social:[0,32],societ:32,soft:[1,7,10,12,36,38,39,40,41],soften:8,softmax:[3,7,36,41],softwar:[0,8,15,24,25],sol:8,sole:[0,6,32],solid:[0,7,32,36],solut:[0,1,2,3,5,6,8,10,11,13,17,18,25,26,27,29,32,33,34,35,36,37,38,40],solution_ev:37,soluton:[2,41],solv:[0,1,3,5,6,8,10,11,12,13,25,26,27,32,33,38,39,40],solve_expdec:[2,41],solve_ode_deep_neural_network:[2,41],solve_ode_neural_network:[2,41],solve_pde_deep_neural_network:[2,41],solveod:[2,41],solveode_popul:[2,41],solver:[2,7,8,9,10,11,21,25,36,41],some:[0,1,2,3,4,5,6,7,8,9,10,11,12,14,29,34,35,38,39,40,41],some_model:[6,33,34],somehow:4,someth:[0,1,3,4,7,9,11,26,27,29,32,33,36,39,40,41],sometim:[0,1,11,12,13,14,32,33,37,38,39,40,41],somewhat:[38,39],soon:[25,30],sophist:[0,32],sopt:[13,37],sort:[5,6,9,11,29,33,35],sound:[3,5,34,35],sourc:[0,1,3,6,15,24,25,26,27,29,32,33,35,40,41],space:[0,1,4,5,8,9,11,12,13,14,21,29,33,34,35,36,37,38,39,40,41],span:[0,3,5,9,11,25,32,33],spare:[1,40,41],spars:[2,3,6,25,32],sparse_add:2,sparse_mtx:[25,32],sparsecategoricalcrossentropi:3,sparseobject:[],sparsiti:10,spatial:[1,2,3,12,38,39,40,41],speak:29,special:[6,7,10,12,13,25,29,32,33,34,35,36,37,39],specif:[0,1,2,3,4,5,6,7,8,9,11,12,16,24,25,26,27,29,31,32,33,34,35,36,38,39,40],specifi:[0,3,5,6,7,9,11,13,14,21,26,29,32,34,35,36,37,38],specifici:[0,10,32],spectacular:3,spectral:[1,40,41],speech:[0,1,3,4,12,32,38,39,40,41],speed:[1,2,4,13,37,38,39,40,41],spend:29,spent:[26,27],sphere:[0,33],spin:6,spite:[0,32],spline:8,split:[1,3,4,5,6,8,9,10,11,14,17,26,29,34,35,36,40,41],splite:0,splitter:[1,10,40,41],spontan:29,spot:3,spread:[0,11,29,32,33],springer:[18,26,31,32,34],spuriou:[13,21,37,38],sqquar:34,sqrsignal:3,sqrt:[0,3,4,5,6,8,10,11,13,17,21,29,33,34,35,37,38],squar:[1,2,3,4,7,8,9,11,13,14,15,16,17,19,21,22,24,25,27,29,35,36,37,38,39,40,41],squarederror:10,squaredeuclidean:14,squash:[12,38,39],srtm:[6,26],srtm_data_norway_1:[6,26],stabil:[5,26,27],stabl:[0,4,5,6,7,9,11,24,32,33,34,36],stack:[3,4],stacklevel:[0,32],stage:[5,13,21,26,27,37,38],stai:[0,2,4,5,11,17,32,33,41],stand:[0,5,9,12,32,33,34,38,39],standadscal:33,standard:[0,1,4,5,6,7,8,10,12,15,16,17,19,21,22,25,26,27,29,32,34,36,38,39,40,41],standard_basi:[],standardscal:[0,6,7,8,9,10,11,33,34,35],stanford:[13,36,41],start:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,20,22,23,25,26,27,29,30,32,33,35,36,37,39,40,41],start_box:[13,38],start_nod:[13,38],start_tim:14,starting_point:21,stat:[6,33,35,36],state:[1,2,4,5,6,7,8,10,11,12,13,24,27,29,33,34,35,36,37,38,39,40,41],statement:[0,7,25,36],stationari:[36,37],statist:[0,1,3,4,7,9,10,11,12,13,14,18,25,26,28,31,33,36,37,38,39,40,41],statu:[0,7,11,32,33,36],stavang:[6,26],std:[0,4,6,32,33,35],steep:[13,21,36,37,38],steepest:38,step:[0,1,2,3,4,6,7,9,10,11,12,13,14,21,22,25,26,32,39,40,41],step_fn:[7,12,36,38,39],step_length:[13,37,38],step_num:[3,4],step_siz:37,steps_list:9,steps_per_epoch:[3,4],stereo:3,still:[0,2,3,5,6,11,13,17,29,35,36,37,38,41],stimuli:[12,38,39],stk2100:[31,32],stk3155:[15,26,27,28,30],stk4021:[31,32],stk4051:[31,32],stk4155:[28,30],stk5000:31,stk:[31,32],stochast:[0,1,5,6,8,11,12,15,16,22,26,32,34,35,36,39,40,41],stock:4,stoke:[12,38,39],stone:[0,7,26,32,36],stop:[1,4,7,9,11,13,14,21,36,39,40,41],storag:[5,33],store:[0,1,2,3,6,11,13,26,29,32,37,38,39,40,41],storehaug:[30,32],str:[1,3,4,39,40,41],straight:[0,6,8,13,32,33,35,36,37],straightforward:[0,2,3,5,6,8,9,10,13,25,32,33,34,35,36,37,41],strategi:[0,1,9,32,39,40,41],stratifi:[6,35],strength:[0,5,14,33],stretch:11,strict:[8,13,36,37],strictli:[8,13,36,37],stride:[4,25],strike:6,string:[1,39,40,41],stroke:[7,36],strong:[3,6,9,10,12,25,29,35,38,39],strongli:[0,8,24,25,27,33],stronli:[0,33],structur:[0,1,2,3,6,9,10,12,24,32,35,36,37,38,39,40,41],stuck:[1,13,36,37,38,39,40,41],student:[0,26,27,28,30,31,32,41],studi:[0,3,4,5,6,7,8,11,12,13,17,19,21,23,24,26,27,31,32,33,34,37,38,39,41],studier:31,style:[0,7,9,25,32,36],sub:[9,12,38,39],subarg:[13,38],subdivid:[0,25,32],subfield:[0,32],subject:[6,8,29],submit:32,subplot:[0,1,3,4,6,7,8,9,10,13,14,26,32,33,35,36,37,39,40,41],subplots_adjust:[8,29],subprogram:[25,32],subract:[0,33],subroutin:[0,32],subscript:[1,39,40,41],subsequ:[1,4,5,6,12,25,29,33,35,38,39,40,41],subset:[1,6,9,12,13,24,32,35,36,37,38,39,40,41],subspac:[0,8,11,33],substanti:[9,10],substep:11,substitut:[3,6,12,25,35,38,39],subsubset:9,subtask:6,subtl:[1,40,41],subtract:[0,4,5,6,11,13,17,21,25,26,29,34,35,37,38],subtre:9,subval:[13,38],succeed:[0,4,32],success:[3,7,9,13,29,36,37],successfulli:[4,9],sudo:[0,15,24,26,32],suffer:[0,1,2,5,10,32,33,34,40,41],suffici:[1,6,8,11,13,35,36,37,39,40,41],suggest:[1,13,27,31,37,38,40,41],suit:[8,12,38,39],suitabl:[0,29,33],sum:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,25,26,29,32,33,34,36,37,38,39,40,41],sum_:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,25,26,27,29,32,33,34,35,36,37,38,39,40,41],sum_i:[0,2,5,6,8,13,17,19,26,33,34,35,37,38,41],sum_j:6,sum_ja_:0,sum_k:[6,8,12,25,39,40],sum_logist:[13,37,38],sum_m:3,sum_n:3,sum_nx_:3,summar:[5,6,9,23,27,34,35,36,37,39,40,41],summari:[1,3,4,10,21,27,28,34,39,40,41],summat:[0,3,16,33],sundai:[17,18,19,20,21,22,23],sunni:9,superconduct:[33,34],superfici:3,superscript:[1,12,38,39,40],supervis:[0,5,6,7,9,12,24,32,33,35,36,38,39],supplement:[7,36],support:[0,1,9,10,11,13,24,32,33,37,38,40,41],suppos:[0,5,6,7,8,10,11,12,13,25,32,33,34,35,36,37,38,39],suppress:[5,13,34,37,38],sure:[0,1,4,6,26,40,41],surf:[6,26],surfac:[0,6,26,32],surpass:6,surpris:[0,32],surround:[3,24],survei:[0,5,6,32,33,34,35],svc:[8,9,10],svd:[0,6,11,17,32,35],svdinv:[5,34],svm:[8,9,10,11],svm_clf:[8,10],swath:[5,33],sy:[13,36,37],symbol:[1,5,11,13,24,29,32,33,34,37,38,39,40,41],symmeteri:[1,40,41],symmetr:[0,5,8,11,12,13,25,32,33,37,38,39],symmetri:[6,9],sympi:[0,15,24,26,32],synonim:29,syntax:[1,13,40,41],syntaxerror:[1,8,40,41],system:[0,1,3,4,6,7,9,10,12,13,15,23,24,25,26,32,36,37,38,39,40,41],systemat:[4,6,35],t0:[3,6,13,21,37,38],t1:[2,13,21,37,38,41],t2:[2,41],t3:[2,41],t:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,23,24,25,26,27,29,30,32,35,36,37,38,39,40,41],t_0:[2,9,13,37,38,41],t_1:[13,37,38],t_:[2,41],t_b:10,t_i:[1,2,5,12,27,33,39,40,41],t_j:[12,39],t_k:9,tabl:[9,23,26,27,29,30,32,38,39,40,41],tabul:[0,32],tabular:32,tackl:4,tag:[2,3,4,5,6,7,12,13,14,21,25,29,33,36,37,38,39,41],taht:[0,32],tail:29,tailor:[2,8,11,32,41],taiwan:[0,32],take:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,21,24,25,26,29,32,33,34,35,36,37,38,39,40,41],taken:[0,1,3,6,10,13,25,32,35,37,38,39,40,41],tan:3,tangent:[1,4,12,13,36,37,38,39,40,41],tanh:[1,4,7,8,12,36,37,38,39,40,41],tape:[3,4],target:[0,1,3,4,5,6,7,8,9,10,11,12,23,27,32,33,34,35,36,37,38,39,40,41],target_nam:9,task:[0,1,3,6,9,11,12,14,20,23,26,32,35,38,39,40,41],tau:[3,5,29,34,35],taught:32,tax:[0,33],taylor:[2,13,36,37,41],taylornr:[13,36,37],tba:37,tc:8,td:[1,6,13,26,32,35,37,39,40,41],teach:32,team:[1,40,41],teaser:0,technic:[0,5,6,13,15,32,33,37,38],techniqu:[0,1,8,10,13,24,29,31,32,33,35,36,37,38,40,41],technolog:[0,1,32,39,40,41],tell:[0,4,6,10,11,13,29,35,37,38],temp1:[1,40,41],temp2:[1,40,41],temp:[1,40,41],temperatur:[0,9,32],temporarili:[1,40,41],ten:[3,17,32],tend:[3,5,6,8,9,10,12,13,14,21,33,34,35,37,38,39],tendenc:[0,32],tension:[6,35],tensor:[3,4],tensorflow:[0,2,4,8,14,15,23,24,25,26,27,28,31,32,33],term1:[5,6,11,26,33],term2:[5,6,11,26,33],term3:[5,6,11,26,33],term4:[5,6,11,26,33],term:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,21,26,29,32,33,34,36,37,38,40,41],termin:[0,4,5,9,10,13,15,21,32,33,37,38],terrain1:[6,26],terrain:[6,21,22,26,27],test:[3,4,5,6,7,8,9,10,13,17,19,21,22,25,26,29,35,36,37,38],test_acc:3,test_accuraci:[1,3,39,40,41],test_error:6,test_imag:[3,4],test_ind:[6,35,36],test_input:4,test_label:[3,4],test_loss:3,test_pr:[1,39,40,41],test_predict:[1,39,40,41],test_rnn:4,test_scor:[7,10,36],test_siz:[0,1,3,5,6,10,32,33,34,35,36,39,40,41],test_split:9,tester:34,testerror:[0,6,33,35],testi:4,testpredict:4,testx:4,text:[0,1,2,4,5,8,9,11,13,15,21,25,27,29,31,32,33,35,36,37,38,39,40,41],textbook:[17,21,22,26,27,33,35],textual:9,textur:[1,9,40,41],tf:[1,3,4,13,14,36,37,40,41],tfe_py_execut:[3,4],th:[0,1,2,5,6,7,9,12,13,14,15,16,25,26,29,32,33,34,35,36,37,38,39,40,41],than:[0,1,2,3,4,5,6,7,9,10,11,12,13,17,24,27,29,32,33,34,35,38,39,40,41],thank:[4,6,33,34,41],theano:[1,24,32,40,41],thei:[0,1,2,3,4,5,6,7,8,9,11,12,13,25,26,29,33,34,35,36,37,38,39,40,41],them:[0,1,3,4,6,8,9,10,11,12,13,25,26,27,32,33,34,35,37,38,39,40,41],theme:[0,32],themselv:[0,29,32],thenc:[6,35],theorem:[2,6,7,33,36,38,40,41],theoret:[0,4,10,32],theori:[0,1,3,8,9,12,13,18,24,26,31,32,34,37,38,39,40,41],thereaft:[0,5,6,11,12,15,16,17,25,26,27,32,35,39,40],therebi:[0,5,7,11,32,33,34,36],therefor:[0,1,2,3,4,6,7,8,11,13,29,32,33,35,36,37,38,39,40,41],therein:11,thereof:[0,6,13,32,35,37,38],thesi:41,theta:[1,4,13,21,29,37,38,39,40,41],theta_:[1,13,37,38,39,40,41],theta_i:[1,39,40,41],theta_linreg:[13,21,37,38],theta_t:[13,37,38],thetaand:[38,39],thetaor:[38,39],thetaxor:[38,39],thi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,23,24,25,26,27,28,29,31,33,34,35,36,37,38,39,40,41],thing:[0,1,2,4,5,7,9,29,32,34,35,36,40,41],think:[0,1,3,4,6,9,12,13,14,23,29,32,35,36,37,38,39,40,41],third:[0,3,6,13,21,30,32,35,36,37,38],thirti:[7,36],thorughout:32,those:[0,3,5,6,8,9,10,11,21,25,26,27,28,32,33,35],though:[1,2,3,4,13,25,29,37,38,39,40,41],thought:[6,14,26,27,29,35],thousand:[0,1,26,32,33,37,38,40,41],thread:[3,4],three:[0,1,3,5,6,8,9,12,15,23,25,26,28,29,30,32,33,34,35,36,38,39,40,41],threshold:[1,3,9,10,11,12,13,37,38,39,40,41],through:[0,1,2,3,4,5,6,8,11,12,13,14,24,25,29,32,33,34,35,36,37,38,39,40,41],throughout:[0,4,5,14,24,25,29,32],thu:[0,1,2,5,6,7,8,10,11,12,13,21,26,30,32,33,34,35,36,37,38,39,40,41],thumb:[0,6,26,32,33],thursdai:[30,32,37,38],tibshirani:[6,18,26,28,31,32,33,35],tick_param:6,ticker:[6,13,26,29,36,37],tif:[6,26],tight_layout:[1,7,36,40,41],tightli:11,tild:[0,5,6,7,11,15,16,17,18,19,26,29,32,33,34,35,39,40,41],till:[0,4,7,8,9,10,12,25,32,33,36,37,39,40],time:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,21,24,25,26,27,29,32,33,34,35,36,39,40,41],timeit:4,timer:4,tini:[1,40,41],tip:3,titl:[0,1,2,3,4,6,7,8,9,10,13,21,26,29,32,33,35,36,37,38,39,40,41],tmp:[13,37,38],tmp_log:[3,4],tn:[2,3,7,41],to_categor:[1,3,4,39,40,41],to_categorical_numpi:[1,39,40,41],to_numer:[0,6,32,35],todai:3,togeth:[0,3,6,8,11,13,21,24,32,33,37,38],toi:[14,37,38],told:[13,37,38],toler:[2,6,14,41],tolist:4,tomographi:[12,38,39],too:[0,2,4,5,6,9,11,13,15,29,31,32,33,35,36,37,38,41],took:[8,32],tool:[0,1,3,6,13,24,33,35,37,38,40,41],toolbox:8,top:[0,3,5,6,9,10,18,24,32,34,35],topic:[0,5,6,7,8,24,26,27,33,34,36,41],topograph:26,topolog:[1,3,12,38,39,40,41],toposort:[],torkjellsdatt:[30,32],toss:[10,29],total:[0,1,2,3,4,6,7,8,10,11,12,13,14,15,16,22,23,25,27,29,30,32,33,35,36,37,39,40,41],total_loss:4,totalclustervari:14,totalscatt:14,toward:[1,2,7,12,13,26,36,37,39,40,41],towardsdatasci:[37,38],town:[0,33],tp:[4,7],tpng:9,tpu:[13,21,24,32,37,38],tqdm:6,tr:33,trace:[2,3,4,13,38],trace_stack:[13,38],traceback:[0,2,3,4,6,9,10,13,15,26,32,34,35,36,37,38],traceback_util:[3,4],tracer:[2,13,38],tracing_count:[3,4],track:[3,13,14,25,36,37,38],tract:[0,33],tractabl:[0,32,33],trade:[5,9,19,34,35],tradeoff:[0,5,19,26,32,33,34,36],tradit:[0,1,4,6,32,35,39,40,41],train:[2,3,5,6,8,9,10,11,12,13,17,19,21,23,26,27,34,35,36,37,38],train_accuraci:[0,1,3,32,39,40,41],train_dataset:4,train_end:[0,1,33,39,40,41],train_error:6,train_funct:[3,4],train_imag:[3,4],train_ind:[6,35,36],train_label:[3,4],train_pr:[1,39,40,41],train_siz:[0,1,3,33,39,40,41],train_step:4,train_test_split:[0,1,3,5,6,7,9,10,11,32,33,34,35,36,39,40,41],train_test_split_numpi:[0,1,33,39,40,41],trainabl:4,trainable_vari:4,trained_model:[6,33,34],trainerror:[0,33],traini:4,training_checkpoint:4,training_dataset:4,training_gradi:[13,21,37,38],training_gradient_fun:[37,38],training_loss:[37,38],trainingerror:[6,35],trainpredict:4,trainscor:4,trainx:4,trait:[0,32],trajectori:4,trajectory_i:21,trajectory_x:21,transfer:9,transform:[0,5,6,7,8,9,10,11,12,13,21,24,25,32,33,34,35,36,37,38,39],transit:[6,12,38,39],translat:[1,4,6,10,33,34,39,40,41],translate_vjp:[],transpos:[1,5,11,25,33,34,39,40,41],travers:[0,5],treat:[0,1,3,6,12,13,29,32,33,34,35,36,37,38,39,40,41],tree:[0,1,6,24,26,32,39,40,41],tree_clf:[9,10],tree_clf_:9,tree_clf_sr:9,tree_reg1:9,tree_reg2:9,tree_reg:9,trend:29,treue:7,trevor:[18,26,31],tri:[2,3,4,9,13,36,37,38,41],triain:0,trial:[0,2,4,6,13,29,32,35,36,37],triangl:[13,36,37],triangular:25,trick:[3,4,8,11,13,21,29,37,38],trickier:29,tridiagon:25,trillion:24,trivial:[0,1,5,11,29,32,34,40,41],troubl:[0,8,12,33,39],truck:3,true_beta:[6,33,34],true_divid:[1,39,40,41],true_fun:[6,35],truli:32,truncat:21,tucker:8,tuesdai:[30,32,35,36,37,38,39,40,41],tumor:[7,9,27,36],tumour:[7,36],tunabl:[1,21,22,27,40,41],tune:[4,9,13,21,22,25,27,32,36,37,38],tupl:[2,13,38],turn:[0,1,5,6,7,8,9,10,11,12,13,19,25,26,29,32,33,35,36,37,38,39,40,41],tutori:[1,4,40,41],tv:[2,41],tveito:[2,41],tweak:[1,4,10,29,40,41],twice:[13,36,37],twist:11,two:[0,1,2,4,5,6,7,9,10,11,12,13,15,16,22,23,25,28,29,31,32,34,35,37,38,39,40,41],tx:[13,36,37,38,39],tx_1:[13,36,37],txt:4,ty:[13,36,37],type:[0,1,3,6,8,10,13,16,23,25,26,29,33,34,35,36,37,40],typeerror:[2,13,38],typic:[0,1,2,3,4,5,7,9,10,12,13,21,27,29,32,33,34,35,36,37,38,39,40,41],typo:[26,27],u:[0,2,5,6,8,10,11,12,17,25,32,33,34,38,39,41],u_:25,u_i:[12,38,39],u_m:10,ua:[0,32],ubuntu:[0,15,24,26,32],uci:[0,27,33],uio:[26,27,30,31],un:14,unari:[25,32],unary_f:[2,13,38],unary_oper:[2,13,38],unary_to_nari:[2,13,38],unbalanc:[6,9,35,36],unbias:[0,5,6,32,34,35],uncent:[6,34],uncertainti:[0,5,32,34,35],uncertitud:29,unchang:[1,3,40,41],uncorrel:[10,29],undefin:[5,33],under:[0,1,5,6,10,13,15,16,24,26,27,32,33,34,35,36,37,40,41],underdetermin:[0,32],underfit:[1,6,35,40,41],underflowproblem:[5,34,35],undergo:[5,34,35],undergradu:[28,30],underli:[0,1,9,13,29,32,37,38,40,41],underset:[4,14],understand:[0,1,3,5,6,10,13,14,21,24,32,33,34,36,37,38,40,41],understood:[8,13,37,38],undesir:8,undetermin:[5,8,34,35],undo:4,unexpect:[6,35],unexpected:29,unfair:[6,33,34],unfortun:[1,8,9,10,40,41],unicode_liter:[8,9],uniform:[0,1,5,6,11,13,15,16,26,29,32,33,36,37,39,40,41],uniformli:[13,29,36,37,38],unifrompdf:29,unimport:[13,36,37],union:[5,6,34,35,36],uniqu:[0,2,6,13,14,25,32,35,36,37,41],unique_cluster_label:14,unit:[0,1,3,4,5,10,12,29,32,33,34,38,39,40,41],unitari:[5,6,25,33],unitarili:[25,32],uniti:29,univari:29,univers:[0,1,2,13,15,24,26,27,28,30,32,33,34,35,36,37,38,40,41],unix:[1,40,41],unknow:[0,25,32],unknown:[0,1,3,4,5,6,8,10,13,16,21,25,32,33,34,35,37,38,39,40],unknowwn:[12,39],unlabel:[1,40,41],unless:[0,3,6,11,13,26,27,32,33,35,36,37],unlik:[1,3,8,13,36,37,38,40,41],unnecessarili:9,unord:3,unravel:[1,39,40,41],unrol:[3,11],unseen:[0,7,9,36],unstabl:[1,40,41],unsupervis:[0,1,4,12,24,32,38,39,40,41],unsymmetr:[25,32],untak:[],until:[1,2,4,9,12,13,14,36,37,38,39,40,41],untouch:0,unusu:[12,38,39],up:[1,3,4,5,6,8,10,11,13,14,16,18,23,24,25,26,27,29,30,34,37,38],updat:[1,2,10,12,13,14,21,37,38,39,40,41],uploa:32,upload:[24,26,27,31],upon:[0,1,6,7,11,25,26,40,41],upper:[0,8,9,16,25,33],uppercas:[25,32],upsampl:4,upscal:4,url:41,us:[4,5,6,8,9,10,11,12,14,15,16,17,18,19,22,23,25,26,28,29,31,34,35],usa:[32,38],usag:[0,8,24,32,33,41],usd10000:[0,33],usd:[0,33],use_bia:4,use_multiprocess:[3,4],usecol:[0,32],useless:[1,39,40,41],user:[0,1,2,3,4,6,7,8,11,15,21,24,25,26,32,33,34,36,39,40,41],usernam:[26,27],userwarn:[3,6,21],usetex:29,usg:[6,26],usr:29,usual:[0,3,4,7,12,13,14,32,36,37,38,39],ut:[5,34],util:[0,1,3,4,6,7,10,14,27,32,33,35,36,40,41],ux:25,v0:29,v1:29,v2:29,v:[2,4,5,6,11,13,17,21,24,33,34,37,38,41],v_0:11,va:[1,40,41],val:[13,37,38],val_accuraci:3,val_loss:4,vale:[2,41],valid:[0,1,4,7,9,10,13,21,24,27,29,32,33,37,38,40,41],validation_batch_s:[3,4],validation_data:[3,4],validation_freq:[3,4],validation_split:[3,4],validation_step:[3,4],valu:[0,1,2,3,4,6,7,8,9,10,12,13,14,15,16,19,21,23,24,25,26,32,37,38,39,40,41],valuat:9,valueerror:[0,32],valy:4,van:[0,18,26,32,33,34,35],vandenbergh:[8,13,36,37],vandermond:[0,32],vanilla:[0,6,11,14,33,34],vanish:[1,4,13,29,36,37,40,41],var_x:29,varabl:8,varepsilon:[5,6,18,26,34,35],varepsilon_:[5,6,34,35],varepsilon_i:[5,6,34,35],vari:[0,1,3,5,6,10,15,16,32,35,39,40,41],variabl:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,21,25,32,33,34,35,38,39,40,41],varianc:[0,1,5,7,9,10,11,13,14,18,19,21,24,25,27,29,32,33,36,37,38,40,41],variance_i:[5,11,33],variance_x:[5,11,33],variant:[0,1,6,8,12,13,32,33,36,37,38,39,40,41],variat:[3,4,11,32],varieti:[0,3,12,15,24,26,32,38,39],variou:[1,3,5,6,7,8,9,11,12,13,16,18,21,22,24,25,26,29,33,34,37,38,39,40,41],varydimens:4,vastli:3,vaue:[1,40,41],vault:0,vdot:[2,13,36,37,41],ve:[26,27],vec:[6,35],vector:[0,1,2,3,4,5,6,7,9,10,11,13,14,16,17,21,23,24,34,35,36,37,40,41],vector_mean:14,ventur:[0,8,15,24,32],verbos:[1,3,4,40,41],veri:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,26,27,29,31,32,33,34,35,36,37,38,39],verifi:[3,11,25,32],versatil:[8,32],versicolor:[8,9],version:[0,3,4,10,13,14,15,24,25,26,27,29,32,33,37,38],versu:[1,40,41],vert:[0,1,5,6,7,8,9,11,13,17,32,33,34,35,36,37,39,40],vert_1:[5,6,33,34,35],vert_2:[5,6,11,17,33,34,35],via:[0,5,6,7,8,9,10,11,12,15,19,24,25,26,28,29,30,32,33,34,35,36,38,39],vidal:11,video:[0,1,12,24,28,30,32,33,34,35,36,39,40,41],view:[1,3,5,6,12,13,21,29,31,32,34,35,37,38,39,40,41],violat:8,virginica:9,viridi:[0,1,2,3,32,39,40,41],virtual:[1,40,41],viscos:[13,37,38],viscou:[13,37,38],visibledeprecationwarn:2,vision:[0,3,32],visual:[0,3,11,12,15,24,32,33,38],visualis:[1,40,41],viz:[6,8,29],vjp:[2,13,38],vjp_argnum:[],vjpfun:[],vjpmaker:[],vjpnode:[13,38],vjps_dict:[],vmap:[13,37,38],vmax:[1,6,40,41],vmin:[1,6,40,41],voic:3,volum:[0,3,32],volume18:41,vote:10,voting_clf:10,votingclassifi:10,votingsimpl:10,vs:[0,2,4,6,33,35,37],vspace:[2,13,38],vstack:[5,11,25,29,32,33],vt:[5,33,34],w1:8,w2:[8,11],w3:8,w:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,25,29,32,33,35,36,37,38,39,40,41],w_1:[8,25],w_1x_1:8,w_1x_:8,w_2:[8,25],w_2x_2:8,w_2x_:8,w_3:25,w_4:25,w_:[1,12,38,39,40,41],w_hidden:[2,41],w_i:[1,2,10,39,40,41],w_ix_i:[12,38,39],w_j:25,w_m:25,w_output:[2,41],w_px_:8,w_px_p:8,wa:[0,1,3,4,5,6,7,10,11,12,13,14,17,25,26,32,33,34,35,36,37,38,39,40,41],wai:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,17,25,27,29,32,33,34,36,37,38,39,40,41],walk:9,walker:29,wang:[0,32],want:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,24,26,27,29,32,33,34,35,36,37,38,39,40,41],warn:[0,1,4,8,32,33,39,40,41],warrant:[6,35,36],wast:[3,37,38],watch:[3,4,24],wave:3,wavelet:8,we:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,22,23,24,25,26,27,28,29,30,31,33,34,35,36,39],weak:[9,10,14],weather:[1,12,38,39,40,41],web:[24,28,30,32,33],weblink:27,webpag:32,websit:[6,25,26,28,32],wedg:[8,29],wednesdai:[30,32,35,36,37,38,39,40,41],wee:11,week:[0,5,6,7,26,27,28,30],weekli:[24,26,30,31,32,38],weight:[0,1,2,3,6,7,9,10,12,13,23,26,27,29,33,36,37,38],weigth:[2,41],welcom:[8,24],well:[0,1,2,3,4,5,6,7,8,9,10,12,13,15,16,19,20,21,24,25,26,27,29,31,32,33,34,35,36,37,38,39,40,41],went:8,were:[0,1,3,4,5,6,7,8,10,11,12,14,29,32,33,35,36,38,39,40,41],wessel:[0,18,26,32,33,34,35],what:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,19,24,25,26,27,29,36,37,38,39,40,41],whatev:3,when:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,21,25,26,27,29,32,33,34,35,36,39,40,41],whenev:[13,21,29,37,38],where:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,21,24,25,26,27,29,30,32,33,34,35,36,37,38,39,40,41],wherea:[6,29,35],wherein:[1,12,38,39,40,41],whether:[0,3,5,7,9,26,27,29,32,34,36],which:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,24,25,26,27,28,29,30,32,33,34,35,36,39],whichev:[1,3,40,41],white:9,whiteboard:[19,33,34,35,36,37],who:[0,28,32],whole:[1,3,4,5,9,11,13,34,35,37,38,39,40,41],whose:[0,6,10,29,33,35],whow:[11,33],whrn:35,why:[0,1,3,6,13,21,26,34,36,37,40],wide:[0,1,3,6,7,12,15,24,25,26,32,35,36,38,39,40,41],widehat:[6,35],width:[0,3,8,9,32],wieringen:[0,18,26,32,33,34,35],win:10,wind:9,wing:[30,32],winther:[2,41],wiothout:[6,33,34],wiscons:[7,36],wisconsin:[10,27],wisdom:[6,34],wise:[0,1,5,12,13,33,37,38,39,40,41],wish:[0,2,5,7,8,11,13,14,25,26,27,32,33,36,37,41],with_std:[0,33,35],wither:6,within:[0,2,3,4,7,9,12,13,14,29,31,32,36,37,39,41],withinclust:14,without:[0,1,5,6,8,9,11,12,13,21,22,27,32,33,34,35,37,38,39,40,41],without_trac:[3,4],wo5dmep_bbi:[],won:[0,32],wonder:8,woodi:32,word:[0,1,3,4,5,6,7,14,29,32,33,34,35,40,41],work:[0,1,4,6,7,8,9,13,15,21,24,26,27,28,29,30,32,33,35,36,37,38,39,40,41],worker:[3,4],workshop:32,world:[0,8,32,33],worldwid:[0,32],wors:[0,1,3,4,6,32,35,40,41],worst:9,worth:9,worthi:[26,27],would:[0,1,3,5,6,7,8,9,10,11,12,13,25,26,27,29,32,33,34,35,36,37,38,39,40,41],wrap:[6,25,32],wrap_util:[2,13,38],wrapper:[0,32],write:[0,1,2,3,5,6,7,8,12,13,15,16,17,20,21,23,25,26,32,33,35,36,37,38,39,40],written:[0,2,3,5,11,12,13,16,24,25,26,27,29,32,33,34,35,36,37,38,39,41],wrong:[1,8,39,40,41],wrongli:10,wrote:[5,11,33],wrt:[10,13,21,37,38],wth:[10,13,21,37,38],www:[24,25,26,27,31,32,41],wx_1:8,x0:8,x1:[4,8,9,10,13,37,38],x1_exampl:8,x1d:8,x2:[8,9,10,13,37,38],x2d:[8,11],x2d_train:11,x2dsl:11,x3:8,x:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,22,23,25,26,27,29,32,35,36,37,38,39,40,41],x_0:[0,5,11,25,32,33,34,35],x_1:[0,2,5,6,7,8,9,10,11,13,23,25,29,32,33,34,35,36,37,38,39,40,41],x_2:[0,2,5,6,7,8,9,10,11,13,23,25,29,32,33,35,36,37,38,39,40,41],x_3:[8,25,29],x_4:25,x_:[0,2,3,5,6,8,10,11,13,14,18,25,26,29,32,33,34,35,36,37,41],x_center:11,x_data:[1,39,40,41],x_data_ful:[1,39,40,41],x_hidden:[2,41],x_i:[0,1,2,5,6,7,8,9,10,11,12,13,14,17,25,29,32,33,34,35,36,37,38,39,40,41],x_input:[2,41],x_ix_:[0,32],x_iy_i:8,x_j:[0,2,8,9,12,16,29,33,38,39,41],x_jy_j:8,x_k:[12,14,25,29,33,38,39],x_l:29,x_m:[6,12,25,29,35,38,39],x_n:[0,2,3,6,8,11,12,13,25,29,32,35,36,37,38,39,41],x_new:[2,9,10],x_offset:[6,33,34],x_output:[2,41],x_p:[3,7,9,36],x_poli:9,x_poly10:9,x_pred:4,x_prev:[2,41],x_reduc:11,x_scale:8,x_small:[13,37,38],x_test:[0,1,3,5,6,7,9,10,11,32,33,34,35,36,39,40,41],x_test_own:6,x_test_scal:[0,6,7,9,10,11,33,34,35],x_tot:4,x_train:[0,1,3,4,5,6,7,9,10,11,32,33,34,35,36,39,40,41],x_train_mean:[6,33,34,35],x_train_own:6,x_train_scal:[0,6,7,9,10,11,33,34,35],x_val:[1,40,41],xarrai:[24,32],xavier:[1,40,41],xbnew:[13,36,37],xcode:[0,15,24,26,32],xdclassiffierconfus:10,xdclassiffierroc:10,xg_clf:10,xgb:10,xgbclassifi:10,xgboost:9,xgboot:10,xgbregressor:10,xgparam:10,xgtree:10,xi:[8,13,21,37,38],xi_1:8,xi_:8,xi_i:8,xinv:[34,38,39],xk:8,xla:[3,4,13,21,24,32,37,38],xlabel:[0,1,2,3,4,5,6,7,8,9,10,13,21,26,29,32,33,34,35,36,37,38,40,41],xlim:[6,10,35],xm:9,xmesh:[13,37],xnew:[0,13,21,32,36,37,38],xp:29,xpanda:[0,33],xpd:[5,11,33],xplot:0,xs:9,xscale:[0,33],xsr:9,xt_x:[13,21,36,37,38],xtest:[6,35,36],xtick:[3,6,8,9,35],xtrain:[6,35,36],xu:[0,32],xx:[0,25,32],xy:[0,6,8,25,26,32],xytext:8,xz:[25,32],y1:4,y2:4,y3:4,y:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,23,25,26,29,32,33,34,35,36,37,38,39,40,41],y_0:[0,5,11,25,32,33,34,35],y_1:[0,5,8,9,11,13,25,32,33,34,35,36,37],y_1y_1:8,y_1y_1k:8,y_1y_2:8,y_1y_2k:8,y_1y_n:8,y_1y_nk:8,y_2:[0,5,8,9,11,25,32,33],y_2y_1:8,y_2y_1k:8,y_2y_2:8,y_2y_2k:8,y_3:[0,9,25],y_4:25,y_:[0,1,5,6,10,11,25,32,33,34,35,39,40,41],y_data:[0,1,5,6,32,33,34,35,36,39,40,41],y_data_ful:[1,39,40,41],y_decis:8,y_fit:[0,33],y_i:[0,1,5,6,7,8,9,10,11,12,13,15,16,17,18,19,25,26,27,32,33,34,35,36,37,38,39,40,41],y_if_:10,y_ix_:[0,32],y_ix_i:[7,8,13,33,36,37],y_iy_jk:8,y_j:[6,8,12,19,26,35,38,39],y_k:[12,38,39],y_m:25,y_model:[0,4,5,6,32,33,34,35,36],y_n:[8,13,36,37],y_ny_1:8,y_ny_1k:8,y_ny_2:8,y_ny_2k:8,y_ny_n:8,y_ny_nk:8,y_offset:[6,33,34],y_plot:9,y_pred1:9,y_pred2:9,y_pred:[0,1,4,6,7,8,9,10,33,34,35,36,39,40,41],y_pred_rf:10,y_pred_tre:10,y_proba:[7,10,36],y_scaler:[6,34,35],y_test:[0,1,3,4,5,6,7,9,10,11,32,33,34,35,36,39,40,41],y_test_onehot:[1,39,40,41],y_test_predict:[0,33],y_test_scal:35,y_tot:4,y_train:[0,1,3,4,5,6,7,9,10,11,32,33,34,35,36,39,40,41],y_train_mean:[6,33,34],y_train_onehot:[1,39,40,41],y_train_predict:[0,33],y_train_scal:[6,34,35],y_val:[1,40,41],yadav:41,yand:[38,39,40,41],ye:[3,6,7,35,36],year:[0,24,32,40],yet:[0,1,6,8,11,13,32,36,37,38,39,40,41],yi:[13,21,37,38],yield:[0,2,5,6,8,10,12,13,14,25,29,32,34,35,36,37,38,39,41],yk:8,ylabel:[0,1,2,3,4,5,6,7,8,9,10,13,21,26,29,32,33,34,35,36,37,38,40,41],ylim:[3,6,35],ym:9,ymesh:[13,37],yn:0,yo:[8,9,10],yor:[38,39,40,41],yoshua:[1,31,40,41],you:[0,1,2,3,4,5,6,8,9,10,11,13,15,16,17,19,20,21,22,23,24,25,26,27,29,30,31,33,34,35,36,37,38,39,40,41],young:[0,32],your:[1,2,4,5,6,8,11,13,17,19,20,21,22,23,24,25,26,34,35,36,37,38,39,40,41],yourself:[11,13,32,37],youtub:24,ypred:[6,35,36],ypredict2:[13,21,36,37,38],ypredict:[0,13,21,32,33,36,37,38],ypredictlasso:[5,34],ypredictol:[0,5,34,35],ypredictown:[6,33,34],ypredictownridg:[6,34],ypredictridg:[0,5,6,34,35,36],ypredictskl:[6,33,34],yridg:32,ys:9,ytest:[6,35,36],ytick:[3,6,8,9,35],ytild:[0,6,32,33,35],ytilde_test_ol:35,ytilde_test_ridg:35,ytildelasso:[5,34],ytildenp:[0,32,33],ytildeol:[0,5,34],ytildeownridg:[6,34],ytilderidg:[5,6,34],ytrain:[6,35,36],yx:[25,32],yxor:[38,39,40,41],yy:[25,32],yz:[25,32],z:[0,1,2,3,4,5,6,7,8,9,11,12,13,25,26,29,32,33,35,36,37,38,39,40,41],z_0:[25,32],z_1:[25,32],z_2:[25,32],z_:[1,2,12,25,32,39,40,41],z_c:[1,39,40,41],z_h:[1,39,40,41],z_hidden:[2,41],z_i:[1,12,38,39,40],z_j:[1,12,40,41],z_k:[12,33,39],z_m:[1,39,40],z_mod:9,z_o:[1,39,40,41],z_output:[2,41],zaman:29,zaxi:[6,26],zero:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,21,25,26,29,32,33,34,35,36,37,38,39,40,41],zeros_lik:4,zeroth:33,zfill:4,zip:[2,4,6,13,38],zm_h:[0,32],zn:[0,33],zone:[0,33],zoom:32,zx:[25,32],zy:[25,32],zz:[25,32]},titles:["3. Linear Regression","14. Building a Feed Forward Neural Network","15. Solving Differential Equations with Deep Learning","16. Convolutional Neural Networks","17. Recurrent neural networks: Overarching view","4. Ridge and Lasso Regression","5. Resampling Methods","6. Logistic Regression","8. Support Vector Machines, overarching aims","9. Decision trees, overarching aims","10. Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods","11. Basic ideas of the Principal Component Analysis (PCA)","13. Neural networks","7. Optimization, the central part of any Machine Learning algortithm","12. Clustering and Unsupervised Learning","Exercises week 34","Exercises week 35","Exercises week 36","Exercises week 37","Exercises week 38","Exercises week 39","Exercises week 41","Exercises week 42","Exercises weeks 43 and 44","Applied Data Analysis and Machine Learning","2. Linear Algebra, Handling of Arrays and more Python Features","Project 1 on Machine Learning, deadline October 9 (midnight), 2023","Project 2 on Machine Learning, deadline November 13 (Midnight)","Teaching schedule with links to material","1. Elements of Probability Theory and Statistical Data Analysis","Teachers and Grading","Textbooks","Week 34: Introduction to the course, Logistics and Practicalities","Week 35: From Ordinary Linear Regression to Ridge and Lasso Regression","Week 36: Statistical interpretation of Linear Regression and Resampling techniques","Week 37: Statistical interpretations and Resampling Methods","Week 38: Logistic Regression and Optimization","Week 39: Optimization and Gradient Methods","Week 40: Gradient descent methods (continued) and start Neural networks","Week 41 Neural networks and constructing a neural network code","Week 42 Constructing a Neural Network code with introduction to Tensor flow","Week 43: Deep Learning: Constructing a Neural Network code and solving differential equations"],titleterms:{"1":[0,15,16,17,18,26,32,33],"12":39,"13":27,"14":35,"19":40,"2":[0,15,16,17,18,27,32,33],"2023":[26,30],"21":36,"23":36,"26":41,"3":[0,15,16,32,33],"31":33,"34":[15,32],"35":[16,33],"36":[17,34],"37":[18,35],"38":[19,36],"39":[20,21,37],"4":[0,33],"40":[21,38],"41":[21,39],"42":[22,40],"43":[23,41],"44":[23,41],"5":0,"7":34,"9":26,"case":[8,10,29,33,34,36,37],"class":36,"do":[1,32,34,35,37,38,39,40,41],"final":[12,21,27,33,34,37,38,39,41],"function":[0,1,6,7,8,10,11,12,13,21,26,27,29,32,33,34,35,36,37,38,39,40,41],"import":[5,21,25,32,33,34],"new":[4,34,35],A:[0,1,4,8,9,21,32,34,35,36,40,41],AND:[23,38,39,40,41],And:[21,32,33,34,36,37,38],But:[21,37,38],In:30,Is:[40,41],Ising:6,OR:[38,39,40,41],The:[0,1,2,3,5,6,7,8,9,11,12,17,23,24,32,33,34,35,36,37,38,39,40,41],To:[32,33],With:[4,34],about:[32,33],abov:34,activ:[1,12,27,34,38,39,40,41],ad:[0,6,17,26,32,33,38,39],adaboost:10,adagrad:[13,21,37,38],adam:[13,21,37,38],adapt:[10,21,37,38],adjust:[1,39,40,41],advanc:21,adversari:4,again:[3,9,36],ai:32,aim:[8,9,17,18,19,20,21,22,23,32],aka:[32,33],al:21,algebra:[25,32],algorithm:[9,10,11,12,21,27,33,37,38,39,40],algortithm:[13,36,37],all:8,an:[0,4,10,32],analys:[5,33],analysi:[0,5,6,11,24,26,27,29,32,33,34,35],analyt:[0,16,17,21,41],ani:[13,36,37],anoth:[9,34,35],appli:24,approach:[0,8,14,32,35,37,38],approxim:[12,39],architectur:[1,39,40,41],argument:[37,38],arrai:[25,32],artifici:[38,39],assist:30,assumpt:[34,35],august:33,autocorrel:29,autograd:[2,13,21,37,38,41],automat:[13,21,37,38,41],avoid:[37,38],b:[17,26,27,37,38],back:[1,11,12,39,40,41],background:[24,26,27,35],bag:10,base:[13,21,35,37,38],basic:[0,5,7,9,10,11,25,33,34,35,36],batch:[1,37,38,40,41],bay:[5,34,35],befor:11,beta:[34,35],better:[8,38,39],bia:[6,26,35],bias:[39,40,41],binari:[1,39,40],bind:32,bird:10,boldsymbol:[33,34,35],boost:10,bootstrap:[6,10,35],boston:[0,33],breast:[1,40,41],brief:[32,35,36,37],bring:[12,39],build:[1,3,9,40,41],c:[26,27,32],calcul:33,can:[21,32,35,37,38],cancer:[1,7,9,11,36,40,41],cart:9,center:33,central:[13,24,29,35,36,37],chain:[12,39],challeng:36,chang:10,channel:32,chi:[0,32],choic:[40,41],choos:[1,39,40,41],cifar01:3,classic:11,classif:[1,9,10,27,36,39,40],classifi:[8,36],clip:[1,40,41],cluster:14,cnn:3,code:[0,1,2,5,9,11,12,13,14,21,27,32,33,34,35,36,37,38,39,40,41],collect:[1,3,39,40,41],come:36,commun:32,compact:36,compar:[2,10,41],comparison:34,compet:[21,37,38],complet:33,complex:[0,6,26,33],complic:[6,37,38],compon:11,comput:[9,37,38],computation:35,computerlab:32,con:9,concept:29,condit:[34,35,36,37],confid:35,conjug:[13,37],construct:[39,40,41],continu:38,contn:32,convex:[8,13,36,37],convolut:[3,12,38,39],correctli:[34,35],correl:[11,33,36],correspond:[36,37],cost:[1,10,33,34,35,36,37,39,40,41],cours:[24,31,32],covari:[5,11,29,33],cover:32,critic:27,cross:[6,26,35,36],cython:32,d:[26,27],data:[0,1,3,6,7,9,11,15,16,23,24,26,29,32,33,34,36,39,40,41],dataset:[1,3,39,40,41],deadlin:[26,27,32],decai:[2,37,38,41],decis:[9,10],decomposit:[5,11,17,25,33],deep:[1,2,36,40,41],defin:[1,32,39,40,41],definit:39,degre:[0,33],deliveri:[26,27],delta:35,dens:[0,32],deriv:[5,12,33,34,35,36,37,39,40,41],descent:[2,10,13,21,27,36,37,38,41],descript:26,design:33,detail:[3,32,41],develop:[1,39,40,41],diagon:11,differ:[8,27,37,38],different:21,differenti:[2,13,37,38,41],diffus:[2,41],dimension:[2,3,8,26,33,41],directli:[37,38],disadvantag:9,discret:29,discuss:36,distribut:[5,29,34,35],distrubut:[34,35],doe:[33,34,38,39],domain:29,dot:[37,38],down:[1,40,41],dropout:[1,40,41],e:[26,27],each:36,economi:33,electron:[26,27],element:[0,29,32,37,38],elimin:25,energi:32,ensembl:10,entropi:[9,36],environ:[0,15,32],equat:[0,2,12,32,33,34,36,37,39,41],error:[0,10,32,33,35],essenti:32,estim:[34,35],et:21,etc:32,euler:[2,41],evalu:[1,27,39,40,41],exampl:[0,1,2,3,4,6,7,8,9,10,21,32,33,34,35,36,37,38,39,40,41],exercis:[0,6,15,16,17,18,19,20,21,22,23,32,33,35,41],expect:[18,29,34,35],expens:35,experi:29,explor:[0,15,16,32],exponenti:[2,41],express:[17,18,32,33,36,37],extend:[36,37],extrapol:4,extrem:[10,32],ey:10,f:[26,27],fall:30,famili:[1,32,33,40,41],famou:25,fantast:33,featur:[9,25,33],feed:[1,12,38,39,40,41],find:[35,37,38],fine:[1,40,41],first:[4,12,27,32,33,34,36,37,39,41],fit:[0,10,32,34],fix:33,flow:40,fold:[35,36],forc:3,forest:10,format:[26,27,32],forward:[1,2,12,38,39,40,41],fourier:3,frank:[6,26,33],freedom:[0,33],frequent:33,frequentist:[0,32],fridai:36,from:[5,10,12,21,27,33,34,35,36,37,38,39],full:[2,39,40,41],funtion:[40,41],further:[3,5,33],g:26,gan:4,gate:[23,38,39,40,41],gaussian:25,gd:[13,21,37,38],gener:[4,9,32],geometr:[11,36,37],get:21,gini:9,good:[0,32],goodfellow:21,grade:[30,32],gradient:[1,2,10,13,21,27,36,37,38,40,41],grid:36,group:36,growth:[2,41],ha:24,handl:[25,32,33],happen:[34,35],have:32,heard:32,hessian:[33,36,37],hidden:[2,40,41],histogram:35,homework:[36,37],hous:[0,33],how:36,hyperbol:[38,39],hyperparamet:[1,39,40,41],hyperplan:8,i:[1,40,41],id3:9,idea:11,ideal:[36,37],ident:[34,35],identifi:35,ii:[32,41],iid:[34,35],iii:41,illustr:[34,38,39],implement:[1,39,40,41],implic:[5,33],improv:[1,37,39,40,41],includ:[13,21,36,37,38],increment:11,independ:[34,35],index:9,inform:30,input:[2,41],instal:[24,26,32],instructor:30,intercept:33,interpret:[5,11,32,33,34,35,36,37],interv:35,introduc:[11,13,21,33,37,38],introduct:[0,6,24,25,26,27,32,38,39,40],invers:[5,25,34],invert:33,iter:[10,37],its:33,iv:41,jacobian:[33,41],jax:[13,21,37,38],job:[38,39],julia:32,jungl:10,k:[35,36],kera:[1,3,40,41],kernel:[8,11],l:39,lagrangian:8,lambda:36,lasso:[5,6,26,33,34,35,36],last:[33,35,36,38],later:[5,33],layer:[1,2,3,12,39,40,41],learn:[0,1,2,11,13,14,15,16,21,24,26,27,32,33,34,35,36,37,38,39,40,41],least:[5,6,18,26,32,33,34],lectur:[32,33,34,35,36,39,40,41],level:10,librari:[24,32],likelihood:[7,34,35,36],limit:[1,13,29,35,36,37,38,40,41],linear:[0,8,13,25,27,32,33,34,36],link:[5,11,28,31,33,34,35],literatur:[26,27],logist:[7,27,32,36,37,38,39,40,41],loop:[37,38],loss:[33,36,37],lu:25,machin:[0,8,13,24,26,27,32,36,37],made:[34,35],mai:32,main:29,make:[0,9,10,15,16,32,33],mani:[10,12,39],manipul:33,margin:[34,35],mass:32,materi:[28,32,33,34,35,36,41],math:[5,33],mathemat:[3,5,8,33,37,38,39],matric:[5,25,32,34],matrix:[1,5,11,12,25,32,33,34,36,37,38,39,40,41],matter:[0,32],max:33,maximum:[34,35,36],mean:[0,32,33,34,36],measur:36,meet:[5,10,29,32,33],mercer:8,method:[6,9,10,13,21,26,35,36,37,38],midnight:[26,27],min:33,mini:[37,38],minibatch:[21,37,38],minim:[32,36,41],ml:32,mle:[34,35],mlp:[12,39],mnist:[3,4],model:[0,1,4,6,12,32,38,39,40,41],moment:[37,38],momentum:[13,21,37,38],moon:[8,9],more:[3,6,21,25,26,32,33,34,35,36,37,38,40,41],multi:[38,39,40],multilay:[12,38,39],multipl:[1,3,39,40,41],multipli:8,need:[26,32],network:[1,2,3,4,7,12,27,32,36,38,39,40,41],neural:[1,2,3,4,7,12,27,32,38,39,40,41],neuron:[38,39],newton:[21,36,37,38],nice:[40,41],noen:[21,37,38],non:8,normal:[0,1,35,40,41],notat:[12,38,39],note:[21,33,34,35],novemb:27,now:[1,9,13,21,34,35,37,38,40,41],nuclear:[0,32],nueral:36,numba:32,number:[0,2,21,29,33,37,38,41],numer:[2,26,27,29,41],numpi:[21,25,32,37,38],object:[3,39,40,41],obtain:11,octob:[26,39,40,41],od:[2,41],off:[6,26],ol:[5,6,21,26,34,35,37,38],one:[2,12,36,37,39,41],ones:[38,39],oper:25,optim:[1,8,13,24,32,33,36,37,38,39,40,41],order:[13,21,37,38],ordinari:[5,6,18,26,32,33,34,41],organ:[0,32],orient:[39,40,41],oslo:31,other:[4,9,11,12,25,32,33,36,38,39],our:[0,4,5,11,13,32,33,36,37,39,40,41],outcom:[24,32],output:[2,40,41],overarch:[0,4,8,9,17,18,19,20,21,22,23,32,33],overview:[10,32,37,38],own:[0,10,11,15,16,27,32,33],packag:[25,32],panda:[32,33],paper:26,paramet:[32,33,36,37,38],part:[13,24,26,27,33,36,37],partial:[2,41],pass:[1,39,40,41],pca:11,pdf:29,pencil:26,perceptron:[12,38,39,40],perform:[1,9,39,40,41],period:3,perspect:[1,40,41],plan:[33,34,35,36,37,38,39,40,41],plot:[35,36],point:4,poisson:[2,41],polynomi:[3,34],popul:[2,41],possibl:41,practic:[13,21,30,32,37,38],pre:[1,3,39,40,41],predict:4,predictor:36,preprocess:33,prerequisit:[3,24,32],princip:11,principl:3,pro:9,probabl:[5,29,34,35],problem:[1,2,13,21,32,33,34,36,37,38,39,40,41],procedur:[9,32],process:[1,3,39,40,41],product:[37,38],program:[2,13,26,27,36,37,41],project:[6,26,27,32,36],prop:[13,37,38],propag:[1,12,39,40,41],properti:[5,29,33,36],python:[0,9,15,24,25,32],quick:8,r:32,random:[10,11,29,36],raphson:[36,37],rate:[21,37,38],read:[9,32,33,35],real:[6,26,32],recommend:[32,33,37,38],rectangular:34,recurr:[4,12,38,39],recurs:[37,38],reduc:[0,33],reduct:3,reformul:[2,41],regress:[0,5,6,7,9,10,13,17,18,26,27,32,33,34,35,36,37,38,39],regular:[1,36,39,40,41],relat:33,relev:[31,33,35,36,38,39],relu:[1,40,41],remark:3,remind:[6,8,32,36,37],repeat:33,replac:[13,37,38],report:[26,27],repositori:35,repres:[23,39,40,41],requir:[2,24,41],resampl:[6,26,34,35],rescal:[6,34],residu:33,resourc:[2,41],result:[33,34],review:40,revisit:[13,36,37],rewrit:[32,33,35],rewritten:36,ridg:[0,5,6,17,18,26,33,34,35,36,37],rm:[13,37,38],rmsprop:[21,37,38],rule:[12,39],s:[8,10,21,35,36,37,38],same:[13,21,35,37,38],sampl:11,scale:[33,35],schedul:[28,32],schemat:9,scheme:[2,41],scienc:32,scikit:[0,1,11,15,16,32,33,34,35,36,37,39,40,41],search:36,second:[13,21,37,38],select:36,semest:30,sensit:[36,37],septemb:[34,35,36],session:34,set:[0,2,3,9,12,15,23,32,33,36,39,40,41],setup:41,sgd:[13,37,38],should:[1,40,41],sigmoid:[40,41],similar:[13,21,37,38],simpl:[0,4,9,13,32,33,34,36,37,38],singl:[10,38,39],singular:[5,11,17,33],size:33,slightli:[37,38],soft:8,softmax:[1,39,40],softwar:[26,32],solut:41,solv:[2,34,36,37,41],solver:13,some:[13,25,32,33,36,37],specif:41,specifi:[2,41],split:[0,15,16,32,33],squar:[0,5,6,10,18,26,32,33,34],standard:[13,33,35,37],start:[21,38],state:[0,32],statement:32,statist:[5,6,24,29,32,34,35],steepest:[10,13,36,37],step:[27,35,36,37,38],still:33,stochast:[13,21,27,29,37,38],stop:[37,38],strongli:32,studi:36,subtract:33,suggest:32,sum:35,summari:[30,32,38],superposit:3,supervis:[1,40,41],support:8,svd:[5,33,34],syntax:[37,38],systemat:3,t:[33,34],taken:21,teach:[28,30],teacher:[30,32],technic:[34,41],techniqu:[6,11,26,34],technolog:24,tensor:40,tensorflow:[1,3,40,41],tent:32,term:[35,39],test:[0,1,15,16,27,32,33,34,39,40,41],textbook:[31,32],than:[36,37],thei:32,theorem:[5,8,11,12,29,34,35,39],theori:29,thi:[17,18,19,20,21,22,32],think:33,thursdai:[33,34,35,36,39,40,41],time:[37,38],tip:[13,21,37,38],togeth:[12,39],tool:32,top:[1,40,41],topic:32,toward:11,trade:[6,26],tradeoff:[6,35],train:[0,1,4,15,16,32,33,39,40,41],transform:3,tree:[9,10],trial:41,tuesdai:34,tune:[1,40,41],two:[3,8,24,26,33,36],type:[2,4,12,32,38,39,41],uio:32,understand:35,univers:[12,31,39],unsupervis:14,unsupport:[37,38],up:[0,2,9,12,15,21,32,33,35,36,39,40,41],us:[0,1,2,3,7,13,21,24,27,32,33,36,37,38,39,40,41],usag:[34,35],valid:[6,26,35,36],valu:[5,11,17,18,29,33,34,35,36],vari:[21,37,38],variabl:[29,36,37],varianc:[6,26,34,35],variou:[0,15,27,32,35,36],vector:[8,12,25,32,33,38,39],veri:[40,41],video:[37,38],view:[0,4,10,33],visual:[1,9,39,40,41],vs:3,wai:[9,21,35],warm:21,wave:[2,41],we:[21,32,37,38,40,41],websit:[40,41],wednesdai:34,week:[15,16,17,18,19,20,21,22,23,32,33,34,35,36,37,38,39,40,41],weekend:36,weekli:[28,35],weight:[39,40,41],what:[0,32,33,34,35],when:[37,38],which:[1,21,37,38,40,41],why:[32,33,35,38,39,41],wisconsin:[7,36],wrap:[33,35],write:[4,11,27,34,41],x:[33,34],xgboost:10,xor:[23,38,39,40,41],yet:34,you:32,your:[0,10,15,16,27,32,33],yourself:36,z_j:39}}) \ No newline at end of file diff --git a/doc/LectureNotes/_build/html/week43.html b/doc/LectureNotes/_build/html/week43.html new file mode 100644 index 000000000..836f39cdf --- /dev/null +++ b/doc/LectureNotes/_build/html/week43.html @@ -0,0 +1,6476 @@ + + + + + + + + Week 43: Deep Learning: Constructing a Neural Network code and solving differential equations — Applied Data Analysis and Machine Learning + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    +
    + + + + + + + + +
    + +
    +
    + +
    + + + + + + + + + + + + + + +
    + + +
    + +
    + Contents +
    + +
    +
    +
    +
    +
    + +
    +

    Week 43: Deep Learning: Constructing a Neural Network code and solving differential equations

    + +
    +
    + +
    +

    Contents

    +
    + +
    +
    +
    + +
    + + +
    +

    Week 43: Deep Learning: Constructing a Neural Network code and solving differential equations

    +

    Morten Hjorth-Jensen, Department of Physics, University of Oslo and Department of Physics and Astronomy and Facility for Rare Isotope Beams, Michigan State University

    +

    Date: Oct 23, 2023

    +

    Copyright 1999-2023, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license

    +
    +

    Plans for week 43

    +

    Material for the active learning sessions on Tuesday and Wednesday.

    +
      +
    • Exercise on writing your own neural network code, application to the OR and XOR gates

    • +
    • The exercises this week will be continued next week as well

    • +
    • Discussion of project 2

    • +
    +

    Material for the lecture on Thursday October 26, 2023.

    + +

    I also recommend Michael Nielsen’s intuitive approach to the neural networks and the universal approximation theorem, see the slides at http://neuralnetworksanddeeplearning.com/chap4.html.

    +
    +
    +

    Using Automatic differentiation

    +

    a +In our discussions of ordinary differential equations +we will also study the usage of Autograd in computing gradients for deep learning. For the documentation of Autograd and examples see the lectures slides from week 39 and the Autograd documentation. +t

    +
    +
    +

    Back propagation and automatic differentiation

    +

    For more details on the back propagation algorithm and automatic differentiation see

    +
      +
    1. https://www.jmlr.org/papers/volume18/17-468/17-468.pdf

    2. +
    3. https://deepimaging.github.io/lectures/lecture_11_Backpropagation.pdf

    4. +
    5. Slides 12-44 at URL”:http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture4.pdf

    6. +
    +
    +
    +

    Material for exercises week 43 and week 44

    +
    +
    +

    Writing our first neural network code, testing it for the OR and XOR gates

    +

    During week 41 we discussed three different types of gates, the +so-called XOR, the OR and the AND gates. In order to develop a code +for neural networks, it can be useful to set up a simpler system with +only two inputs and one output. This can make it easier to debug and +study the feed forward pass and the back propagation part. In the +exercise this and next week, we propose to study this system with just +one hidden layer and two hidden nodes. There is only one output node +and we can choose to use either a simple regression case (fitting a +line) or just a binary classification case with the corss-entropy as +cost function.

    +

    Their inputs and outputs can be +summarized using the following tables, first for the OR gate with +inputs \(x_1\) and \(x_2\) and outputs \(y\):

    + + + + + + + + + + +
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 1
    1 0 1
    1 1 1
    +
    +

    The AND and XOR Gates

    +

    The AND gate is defined as

    + + + + + + + + + + +
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 0
    1 0 0
    1 1 1
    +

    And finally we have the XOR gate

    + + + + + + + + + + +
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 1
    1 0 1
    1 1 0
    +
    +

    Representing the Data Sets

    +

    Our design matrix is defined by the input values \(x_1\) and \(x_2\). Since we have four possible outputs, our design matrix reads

    +
    +\[\begin{split} +\boldsymbol{X}=\begin{bmatrix} 0 & 0 \\ + 0 & 1 \\ + 1 & 0 \\ + 1 & 1 \end{bmatrix}, +\end{split}\]
    +

    while the vector of outputs is \(\boldsymbol{y}^T=[0,1,1,0]\) for the XOR gate, \(\boldsymbol{y}^T=[0,0,0,1]\) for the AND gate and \(\boldsymbol{y}^T=[0,1,1,1]\) for the OR gate.

    +
    +
    +

    Setting up the Neural Network

    +

    We define first our design matrix and the various output vectors for the different gates.

    +
    +
    +
    %matplotlib inline
    +
    +"""
    +Simple code that tests XOR, OR and AND gates with linear regression
    +"""
    +
    +# import necessary packages
    +import numpy as np
    +import matplotlib.pyplot as plt
    +from sklearn import datasets
    +
    +def sigmoid(x):
    +    return 1/(1 + np.exp(-x))
    +
    +def feed_forward(X):
    +    # weighted sum of inputs to the hidden layer
    +    z_h = np.matmul(X, hidden_weights) + hidden_bias
    +    # activation in the hidden layer
    +    a_h = sigmoid(z_h)
    +    
    +    # weighted sum of inputs to the output layer
    +    z_o = np.matmul(a_h, output_weights) + output_bias
    +    # softmax output
    +    # axis 0 holds each input and axis 1 the probabilities of each category
    +    probabilities = sigmoid(z_o)
    +    return probabilities
    +
    +# we obtain a prediction by taking the class with the highest likelihood
    +def predict(X):
    +    probabilities = feed_forward(X)
    +    return np.argmax(probabilities, axis=1)
    +
    +# ensure the same random numbers appear every time
    +np.random.seed(0)
    +
    +# Design matrix
    +X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64)
    +
    +# The XOR gate
    +yXOR = np.array( [ 0, 1 ,1, 0])
    +# The OR gate
    +yOR = np.array( [ 0, 1 ,1, 1])
    +# The AND gate
    +yAND = np.array( [ 0, 0 ,0, 1])
    +
    +# Defining the neural network
    +n_inputs, n_features = X.shape
    +n_hidden_neurons = 2
    +n_categories = 2
    +n_features = 2
    +
    +# we make the weights normally distributed using numpy.random.randn
    +
    +# weights and bias in the hidden layer
    +hidden_weights = np.random.randn(n_features, n_hidden_neurons)
    +hidden_bias = np.zeros(n_hidden_neurons) + 0.01
    +
    +# weights and bias in the output layer
    +output_weights = np.random.randn(n_hidden_neurons, n_categories)
    +output_bias = np.zeros(n_categories) + 0.01
    +
    +probabilities = feed_forward(X)
    +print(probabilities)
    +
    +
    +predictions = predict(X)
    +print(predictions)
    +
    +
    +
    +
    +
    [[0.80625657 0.36420967]
    + [0.90297441 0.30170017]
    + [0.89823921 0.28566769]
    + [0.93420126 0.25920793]]
    +[0 0 0 0]
    +
    +
    +
    +
    +

    Not an impressive result, but this was our first forward pass with randomly assigned weights. Let us now add the full network with the back-propagation algorithm discussed above.

    +
    +
    +

    The Code using Scikit-Learn

    +
    +
    +
    # import necessary packages
    +import numpy as np
    +import matplotlib.pyplot as plt
    +from sklearn.neural_network import MLPClassifier
    +from sklearn.metrics import accuracy_score
    +import seaborn as sns
    +
    +# ensure the same random numbers appear every time
    +np.random.seed(0)
    +
    +# Design matrix
    +X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64)
    +
    +# The XOR gate
    +yXOR = np.array( [ 0, 1 ,1, 0])
    +# The OR gate
    +yOR = np.array( [ 0, 1 ,1, 1])
    +# The AND gate
    +yAND = np.array( [ 0, 0 ,0, 1])
    +
    +# Defining the neural network
    +n_inputs, n_features = X.shape
    +n_hidden_neurons = 2
    +n_categories = 2
    +n_features = 2
    +
    +eta_vals = np.logspace(-5, 1, 7)
    +lmbd_vals = np.logspace(-5, 1, 7)
    +# store models for later use
    +DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
    +epochs = 100
    +
    +for i, eta in enumerate(eta_vals):
    +    for j, lmbd in enumerate(lmbd_vals):
    +        dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',
    +                            alpha=lmbd, learning_rate_init=eta, max_iter=epochs)
    +        dnn.fit(X, yXOR)
    +        DNN_scikit[i][j] = dnn
    +        print("Learning rate  = ", eta)
    +        print("Lambda = ", lmbd)
    +        print("Accuracy score on data set: ", dnn.score(X, yXOR))
    +        print()
    +
    +sns.set()
    +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    +for i in range(len(eta_vals)):
    +    for j in range(len(lmbd_vals)):
    +        dnn = DNN_scikit[i][j]
    +        test_pred = dnn.predict(X)
    +        test_accuracy[i][j] = accuracy_score(yXOR, test_pred)
    +
    +fig, ax = plt.subplots(figsize = (10, 10))
    +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
    +ax.set_title("Test Accuracy")
    +ax.set_ylabel("$\eta$")
    +ax.set_xlabel("$\lambda$")
    +plt.show()
    +
    +
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  1e-05
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  1e-05
    +Lambda =  0.0001
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  1e-05
    +Lambda =  0.001
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  1e-05
    +Lambda =  0.01
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  1e-05
    +Lambda =  0.1
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  1e-05
    +Lambda =  1.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  1e-05
    +Lambda =  10.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.0001
    +Lambda =  1e-05
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.0001
    +Lambda =  0.0001
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.0001
    +Lambda =  0.001
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.0001
    +Lambda =  0.01
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.0001
    +Lambda =  0.1
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.0001
    +Lambda =  1.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.0001
    +Lambda =  10.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.001
    +Lambda =  1e-05
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.001
    +Lambda =  0.0001
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.001
    +Lambda =  0.001
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.001
    +Lambda =  0.01
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.001
    +Lambda =  0.1
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.001
    +Lambda =  1.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.001
    +Lambda =  10.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.01
    +Lambda =  1e-05
    +Accuracy score on data set:  0.25
    +
    +Learning rate  =  0.01
    +Lambda =  0.0001
    +Accuracy score on data set:  0.75
    +
    +Learning rate  =  0.01
    +Lambda =  0.001
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.01
    +Lambda =  0.01
    +Accuracy score on data set:  0.75
    +
    +Learning rate  =  0.01
    +Lambda =  0.1
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.01
    +Lambda =  1.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.01
    +Lambda =  10.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.1
    +Lambda =  1e-05
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.1
    +Lambda =  0.0001
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.1
    +Lambda =  0.001
    +Accuracy score on data set:  1.0
    +
    +Learning rate  =  0.1
    +Lambda =  0.01
    +Accuracy score on data set:  1.0
    +
    +Learning rate  =  0.1
    +Lambda =  0.1
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.1
    +Lambda =  1.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  0.1
    +Lambda =  10.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  1.0
    +Lambda =  1e-05
    +Accuracy score on data set:  0.75
    +
    +Learning rate  =  1.0
    +Lambda =  0.0001
    +Accuracy score on data set:  0.75
    +
    +Learning rate  =  1.0
    +Lambda =  0.001
    +Accuracy score on data set:  0.75
    +
    +Learning rate  =  1.0
    +Lambda =  0.01
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  1.0
    +Lambda =  0.1
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  1.0
    +Lambda =  1.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  1.0
    +Lambda =  10.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  10.0
    +Lambda =  1e-05
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  10.0
    +Lambda =  0.0001
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  10.0
    +Lambda =  0.001
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  10.0
    +Lambda =  0.01
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  10.0
    +Lambda =  0.1
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  10.0
    +Lambda =  1.0
    +Accuracy score on data set:  0.5
    +
    +Learning rate  =  10.0
    +Lambda =  10.0
    +Accuracy score on data set:  0.5
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +_images/week43_15_2.png +
    +
    +

    How do we interpret these results?

    +
    +
    +

    Lecture Thursday October 26

    +
    +
    +

    Developing a code for doing neural networks with back propagation

    +

    We repeat some of the elements discussed last week. The first part of +the material for Thursday was contained in the slides for last +week as well. We will repeat some of the topics here before we move into +applications to differential equations and other examples.

    +

    One can identify a set of key steps when using neural networks to solve supervised learning problems:

    +
      +
    1. Collect and pre-process data

    2. +
    3. Define model and architecture

    4. +
    5. Choose cost function and optimizer

    6. +
    7. Train the model

    8. +
    9. Evaluate model performance on test data

    10. +
    11. Adjust hyperparameters (if necessary, network architecture)

    12. +
    +
    +
    +

    Collect and pre-process data

    +

    Here we will be using the MNIST dataset, which is readily available through the scikit-learn +package. You may also find it for example here.
    +The MNIST (Modified National Institute of Standards and Technology) database is a large database +of handwritten digits that is commonly used for training various image processing systems.
    +The MNIST dataset consists of 70 000 images of size \(28\times 28\) pixels, each labeled from 0 to 9.
    +The scikit-learn dataset we will use consists of a selection of 1797 images of size \(8\times 8\) collected and processed from this database.

    +

    To feed data into a feed-forward neural network we need to represent +the inputs as a design/feature matrix \(X = (n_{inputs}, n_{features})\). Each +row represents an input, in this case a handwritten digit, and +each column represents a feature, in this case a pixel. The +correct answers, also known as labels or targets are +represented as a 1D array of integers +\(Y = (n_{inputs}) = (5, 3, 1, 8,...)\).

    +

    As an example, say we want to build a neural network using supervised learning to predict Body-Mass Index (BMI) from +measurements of height (in m)
    +and weight (in kg). If we have measurements of 5 people the design/feature matrix could be for example:

    +
    +\[\begin{split} X = \begin{bmatrix} +1.85 & 81\\ +1.71 & 65\\ +1.95 & 103\\ +1.55 & 42\\ +1.63 & 56 +\end{bmatrix} ,\end{split}\]
    +

    and the targets would be:

    +
    +\[ Y = (23.7, 22.2, 27.1, 17.5, 21.1) \]
    +

    Since each input image is a 2D matrix, we need to flatten the image +(i.e. “unravel” the 2D matrix into a 1D array) to turn the data into a +design/feature matrix. This means we lose all spatial information in the +image, such as locality and translational invariance. More complicated +architectures such as Convolutional Neural Networks can take advantage +of such information, and are most commonly applied when analyzing +images.

    +
    +
    +
    # import necessary packages
    +import numpy as np
    +import matplotlib.pyplot as plt
    +from sklearn import datasets
    +
    +
    +# ensure the same random numbers appear every time
    +np.random.seed(0)
    +
    +# display images in notebook
    +%matplotlib inline
    +plt.rcParams['figure.figsize'] = (12,12)
    +
    +
    +# download MNIST dataset
    +digits = datasets.load_digits()
    +
    +# define inputs and labels
    +inputs = digits.images
    +labels = digits.target
    +
    +print("inputs = (n_inputs, pixel_width, pixel_height) = " + str(inputs.shape))
    +print("labels = (n_inputs) = " + str(labels.shape))
    +
    +
    +# flatten the image
    +# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64
    +n_inputs = len(inputs)
    +inputs = inputs.reshape(n_inputs, -1)
    +print("X = (n_inputs, n_features) = " + str(inputs.shape))
    +
    +
    +# choose some random images to display
    +indices = np.arange(n_inputs)
    +random_indices = np.random.choice(indices, size=5)
    +
    +for i, image in enumerate(digits.images[random_indices]):
    +    plt.subplot(1, 5, i+1)
    +    plt.axis('off')
    +    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    +    plt.title("Label: %d" % digits.target[random_indices[i]])
    +plt.show()
    +
    +
    +
    +
    +
    inputs = (n_inputs, pixel_width, pixel_height) = (1797, 8, 8)
    +labels = (n_inputs) = (1797,)
    +X = (n_inputs, n_features) = (1797, 64)
    +
    +
    +_images/week43_20_1.png +
    +
    +
    +
    +

    Train and test datasets

    +

    Performing analysis before partitioning the dataset is a major error, that can lead to incorrect conclusions.

    +

    We will reserve \(80 \%\) of our dataset for training and \(20 \%\) for testing.

    +

    It is important that the train and test datasets are drawn randomly from our dataset, to ensure +no bias in the sampling.
    +Say you are taking measurements of weather data to predict the weather in the coming 5 days. +You don’t want to train your model on measurements taken from the hours 00.00 to 12.00, and then test it on data +collected from 12.00 to 24.00.

    +
    +
    +
    from sklearn.model_selection import train_test_split
    +
    +# one-liner from scikit-learn library
    +train_size = 0.8
    +test_size = 1 - train_size
    +X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,
    +                                                    test_size=test_size)
    +
    +# equivalently in numpy
    +def train_test_split_numpy(inputs, labels, train_size, test_size):
    +    n_inputs = len(inputs)
    +    inputs_shuffled = inputs.copy()
    +    labels_shuffled = labels.copy()
    +    
    +    np.random.shuffle(inputs_shuffled)
    +    np.random.shuffle(labels_shuffled)
    +    
    +    train_end = int(n_inputs*train_size)
    +    X_train, X_test = inputs_shuffled[:train_end], inputs_shuffled[train_end:]
    +    Y_train, Y_test = labels_shuffled[:train_end], labels_shuffled[train_end:]
    +    
    +    return X_train, X_test, Y_train, Y_test
    +
    +#X_train, X_test, Y_train, Y_test = train_test_split_numpy(inputs, labels, train_size, test_size)
    +
    +print("Number of training images: " + str(len(X_train)))
    +print("Number of test images: " + str(len(X_test)))
    +
    +
    +
    +
    +
    Number of training images: 1437
    +Number of test images: 360
    +
    +
    +
    +
    +
    +
    +

    Define model and architecture

    +

    Our simple feed-forward neural network will consist of an input layer, a single hidden layer and an output layer. The activation \(y\) of each neuron is a weighted sum of inputs, passed through an activation function. In case of the simple perceptron model we have

    +
    +\[ z = \sum_{i=1}^n w_i a_i ,\]
    +
    +\[ y = f(z) ,\]
    +

    where \(f\) is the activation function, \(a_i\) represents input from neuron \(i\) in the preceding layer +and \(w_i\) is the weight to input \(i\).
    +The activation of the neurons in the input layer is just the features (e.g. a pixel value).

    +

    The simplest activation function for a neuron is the Heaviside function:

    +
    +\[\begin{split} f(z) = +\begin{cases} +1, & z > 0\\ +0, & \text{otherwise} +\end{cases} +\end{split}\]
    +

    A feed-forward neural network with this activation is known as a perceptron.
    +For a binary classifier (i.e. two classes, 0 or 1, dog or not-dog) we can also use this in our output layer.
    +This activation can be generalized to \(k\) classes (using e.g. the one-against-all strategy), +and we call these architectures multiclass perceptrons.

    +

    However, it is now common to use the terms Single Layer Perceptron (SLP) (1 hidden layer) and
    +Multilayer Perceptron (MLP) (2 or more hidden layers) to refer to feed-forward neural networks with any activation function.

    +

    Typical choices for activation functions include the sigmoid function, hyperbolic tangent, and Rectified Linear Unit (ReLU).
    +We will be using the sigmoid function \(\sigma(x)\):

    +
    +\[ f(x) = \sigma(x) = \frac{1}{1 + e^{-x}} ,\]
    +

    which is inspired by probability theory (see logistic regression) and was most commonly used until about 2011. See the discussion below concerning other activation functions.

    +
    +
    +

    Layers

    +
      +
    • Input

    • +
    +

    Since each input image has 8x8 = 64 pixels or features, we have an input layer of 64 neurons.

    +
      +
    • Hidden layer

    • +
    +

    We will use 50 neurons in the hidden layer receiving input from the neurons in the input layer.
    +Since each neuron in the hidden layer is connected to the 64 inputs we have 64x50 = 3200 weights to the hidden layer.

    +
      +
    • Output

    • +
    +

    If we were building a binary classifier, it would be sufficient with a single neuron in the output layer, +which could output 0 or 1 according to the Heaviside function. This would be an example of a hard classifier, meaning it outputs the class of the input directly. However, if we are dealing with noisy data it is often beneficial to use a soft classifier, which outputs the probability of being in class 0 or 1.

    +

    For a soft binary classifier, we could use a single neuron and interpret the output as either being the probability of being in class 0 or the probability of being in class 1. Alternatively we could use 2 neurons, and interpret each neuron as the probability of being in each class.

    +

    Since we are doing multiclass classification, with 10 categories, it is natural to use 10 neurons in the output layer. We number the neurons \(j = 0,1,...,9\). The activation of each output neuron \(j\) will be according to the softmax function:

    +
    +\[ P(\text{class $j$} \mid \text{input $\boldsymbol{a}$}) = \frac{\exp{(\boldsymbol{a}^T \boldsymbol{w}_j)}} +{\sum_{c=0}^{9} \exp{(\boldsymbol{a}^T \boldsymbol{w}_c)}} ,\]
    +

    i.e. each neuron \(j\) outputs the probability of being in class \(j\) given an input from the hidden layer \(\boldsymbol{a}\), with \(\boldsymbol{w}_j\) the weights of neuron \(j\) to the inputs.
    +The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1.
    +The exponent is just the weighted sum of inputs as before:

    +
    +\[ z_j = \sum_{i=1}^n w_ {ij} a_i+b_j.\]
    +

    Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500 +weights to the output layer.

    +
    +
    +

    Weights and biases

    +

    Typically weights are initialized with small values distributed around zero, drawn from a uniform +or normal distribution. Setting all weights to zero means all neurons give the same output, making the network useless.

    +

    Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range +of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron \(j\), \(b_j\):

    +
    +\[ z_j = \sum_{i=1}^n w_ {ij} a_i + b_j.\]
    +

    The bias weights \(\boldsymbol{b}\) are often initialized to zero, but a small value like \(0.01\) ensures all neurons have some output which can be backpropagated in the first training cycle.

    +
    +
    +
    # building our neural network
    +
    +n_inputs, n_features = X_train.shape
    +n_hidden_neurons = 50
    +n_categories = 10
    +
    +# we make the weights normally distributed using numpy.random.randn
    +
    +# weights and bias in the hidden layer
    +hidden_weights = np.random.randn(n_features, n_hidden_neurons)
    +hidden_bias = np.zeros(n_hidden_neurons) + 0.01
    +
    +# weights and bias in the output layer
    +output_weights = np.random.randn(n_hidden_neurons, n_categories)
    +output_bias = np.zeros(n_categories) + 0.01
    +
    +
    +
    +
    +
    +
    +

    Feed-forward pass

    +

    Denote \(F\) the number of features, \(H\) the number of hidden neurons and \(C\) the number of categories.
    +For each input image we calculate a weighted sum of input features (pixel values) to each neuron \(j\) in the hidden layer \(l\):

    +
    +\[ z_{j}^{l} = \sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},\]
    +

    this is then passed through our activation function

    +
    +\[ a_{j}^{l} = f(z_{j}^{l}) .\]
    +

    We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron \(j\) in the output layer:

    +
    +\[ z_{j}^{L} = \sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.\]
    +

    Finally we calculate the output of neuron \(j\) in the output layer using the softmax function:

    +
    +\[ a_{j}^{L} = \frac{\exp{(z_j^{L})}} +{\sum_{c=0}^{C-1} \exp{(z_c^{L})}} .\]
    +
    +
    +

    Matrix multiplications

    +

    Since our data has the dimensions \(X = (n_{inputs}, n_{features})\) and our weights to the hidden +layer have the dimensions
    +\(W_{hidden} = (n_{features}, n_{hidden})\), +we can easily feed the network all our training data in one go by taking the matrix product

    +
    +\[ X W^{h} = (n_{inputs}, n_{hidden}),\]
    +

    and obtain a matrix that holds the weighted sum of inputs to the hidden layer +for each input image and each hidden neuron.
    +We also add the bias to obtain a matrix of weighted sums to the hidden layer \(Z^{h}\):

    +
    +\[ \boldsymbol{z}^{l} = \boldsymbol{X} \boldsymbol{W}^{l} + \boldsymbol{b}^{l} ,\]
    +

    meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image.
    +This is then passed through the activation:

    +
    +\[ \boldsymbol{a}^{l} = f(\boldsymbol{z}^l) .\]
    +

    This is fed to the output layer:

    +
    +\[ \boldsymbol{z}^{L} = \boldsymbol{a}^{L} \boldsymbol{W}^{L} + \boldsymbol{b}^{L} .\]
    +

    Finally we receive our output values for each image and each category by passing it through the softmax function:

    +
    +\[ output = softmax (\boldsymbol{z}^{L}) = (n_{inputs}, n_{categories}) .\]
    +
    +
    +
    # setup the feed-forward pass, subscript h = hidden layer
    +
    +def sigmoid(x):
    +    return 1/(1 + np.exp(-x))
    +
    +def feed_forward(X):
    +    # weighted sum of inputs to the hidden layer
    +    z_h = np.matmul(X, hidden_weights) + hidden_bias
    +    # activation in the hidden layer
    +    a_h = sigmoid(z_h)
    +    
    +    # weighted sum of inputs to the output layer
    +    z_o = np.matmul(a_h, output_weights) + output_bias
    +    # softmax output
    +    # axis 0 holds each input and axis 1 the probabilities of each category
    +    exp_term = np.exp(z_o)
    +    probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +    
    +    return probabilities
    +
    +probabilities = feed_forward(X_train)
    +print("probabilities = (n_inputs, n_categories) = " + str(probabilities.shape))
    +print("probability that image 0 is in category 0,1,2,...,9 = \n" + str(probabilities[0]))
    +print("probabilities sum up to: " + str(probabilities[0].sum()))
    +print()
    +
    +# we obtain a prediction by taking the class with the highest likelihood
    +def predict(X):
    +    probabilities = feed_forward(X)
    +    return np.argmax(probabilities, axis=1)
    +
    +predictions = predict(X_train)
    +print("predictions = (n_inputs) = " + str(predictions.shape))
    +print("prediction for image 0: " + str(predictions[0]))
    +print("correct label for image 0: " + str(Y_train[0]))
    +
    +
    +
    +
    +
    probabilities = (n_inputs, n_categories) = (1437, 10)
    +probability that image 0 is in category 0,1,2,...,9 = 
    +[5.41511965e-04 2.17174962e-03 8.84355903e-03 1.44970586e-03
    + 1.10378326e-04 5.08318298e-09 2.03256632e-04 1.92507116e-03
    + 9.84443254e-01 3.11507992e-04]
    +probabilities sum up to: 1.0
    +
    +predictions = (n_inputs) = (1437,)
    +prediction for image 0: 8
    +correct label for image 0: 6
    +
    +
    +
    +
    +
    +
    +

    Choose cost function and optimizer

    +

    To measure how well our neural network is doing we need to introduce a cost function.
    +We will call the function that gives the error of a single sample output the loss function, and the function +that gives the total error of our network across all samples the cost function. +A typical choice for multiclass classification is the cross-entropy loss, also known as the negative log likelihood.

    +

    In multiclass classification it is common to treat each integer label as a so called one-hot vector:

    +
    +\[ y = 5 \quad \rightarrow \quad \boldsymbol{y} = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ,\]
    +
    +\[ y = 1 \quad \rightarrow \quad \boldsymbol{y} = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ,\]
    +

    i.e. a binary bit string of length \(C\), where \(C = 10\) is the number of classes in the MNIST dataset.

    +

    Let \(y_{ic}\) denote the \(c\)-th component of the \(i\)-th one-hot vector.
    +We define the cost function \(\mathcal{C}\) as a sum over the cross-entropy loss for each point \(\boldsymbol{x}_i\) in the dataset.

    +

    In the one-hot representation only one of the terms in the loss function is non-zero, namely the +probability of the correct category \(c'\)
    +(i.e. the category \(c'\) such that \(y_{ic'} = 1\)). This means that the cross entropy loss only punishes you for how wrong +you got the correct label. The probability of category \(c\) is given by the softmax function. The vector \(\boldsymbol{\theta}\) represents the parameters of our network, i.e. all the weights and biases.

    +
    +
    +

    Optimizing the cost function

    +

    The network is trained by finding the weights and biases that minimize the cost function. One of the most widely used classes of methods is gradient descent and its generalizations. The idea behind gradient descent +is simply to adjust the weights in the direction where the gradient of the cost function is large and negative. This ensures we flow toward a local minimum of the cost function.
    +Each parameter \(\theta\) is iteratively adjusted according to the rule

    +
    +\[ \theta_{i+1} = \theta_i - \eta \nabla \mathcal{C}(\theta_i) ,\]
    +

    where \(\eta\) is known as the learning rate, which controls how big a step we take towards the minimum.
    +This update can be repeated for any number of iterations, or until we are satisfied with the result.

    +

    A simple and effective improvement is a variant called Batch Gradient Descent.
    +Instead of calculating the gradient on the whole dataset, we calculate an approximation of the gradient +on a subset of the data called a minibatch.
    +If there are \(N\) data points and we have a minibatch size of \(M\), the total number of batches +is \(N/M\).
    +We denote each minibatch \(B_k\), with \(k = 1, 2,...,N/M\). The gradient then becomes:

    +
    +\[ \nabla \mathcal{C}(\theta) = \frac{1}{N} \sum_{i=1}^N \nabla \mathcal{L}_i(\theta) \quad \rightarrow \quad +\frac{1}{M} \sum_{i \in B_k} \nabla \mathcal{L}_i(\theta) ,\]
    +

    i.e. instead of averaging the loss over the entire dataset, we average over a minibatch.

    +

    This has two important benefits:

    +
      +
    1. Introducing stochasticity decreases the chance that the algorithm becomes stuck in a local minima.

    2. +
    3. It significantly speeds up the calculation, since we do not have to use the entire dataset to calculate the gradient.

    4. +
    +

    The various optmization methods, with codes and algorithms, are discussed in our lectures on Gradient descent approaches.

    +
    +
    +

    Regularization

    +

    It is common to add an extra term to the cost function, proportional +to the size of the weights. This is equivalent to constraining the +size of the weights, so that they do not grow out of control. +Constraining the size of the weights means that the weights cannot +grow arbitrarily large to fit the training data, and in this way +reduces overfitting.

    +

    We will measure the size of the weights using the so called L2-norm, meaning our cost function becomes:

    +
    +\[ \mathcal{C}(\theta) = \frac{1}{N} \sum_{i=1}^N \mathcal{L}_i(\theta) \quad \rightarrow \quad +\frac{1}{N} \sum_{i=1}^N \mathcal{L}_i(\theta) + \lambda \lvert \lvert \boldsymbol{w} \rvert \rvert_2^2 += \frac{1}{N} \sum_{i=1}^N \mathcal{L}(\theta) + \lambda \sum_{ij} w_{ij}^2,\]
    +

    i.e. we sum up all the weights squared. The factor \(\lambda\) is known as a regularization parameter.

    +

    In order to train the model, we need to calculate the derivative of +the cost function with respect to every bias and weight in the +network. In total our network has \((64 + 1)\times 50=3250\) weights in +the hidden layer and \((50 + 1)\times 10=510\) weights to the output +layer (\(+1\) for the bias), and the gradient must be calculated for +every parameter. We use the backpropagation algorithm discussed +above. This is a clever use of the chain rule that allows us to +calculate the gradient efficently.

    +
    +
    +

    Matrix multiplication

    +

    To more efficently train our network these equations are implemented using matrix operations.
    +The error in the output layer is calculated simply as, with \(\boldsymbol{t}\) being our targets,

    +
    +\[ \delta_L = \boldsymbol{t} - \boldsymbol{y} = (n_{inputs}, n_{categories}) .\]
    +

    The gradient for the output weights is calculated as

    +
    +\[ \nabla W_{L} = \boldsymbol{a}^T \delta_L = (n_{hidden}, n_{categories}) ,\]
    +

    where \(\boldsymbol{a} = (n_{inputs}, n_{hidden})\). This simply means that we are summing up the gradients for each input.
    +Since we are going backwards we have to transpose the activation matrix.

    +

    The gradient with respect to the output bias is then

    +
    +\[ \nabla \boldsymbol{b}_{L} = \sum_{i=1}^{n_{inputs}} \delta_L = (n_{categories}) .\]
    +

    The error in the hidden layer is

    +
    +\[ \Delta_h = \delta_L W_{L}^T \circ f'(z_{h}) = \delta_L W_{L}^T \circ a_{h} \circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,\]
    +

    where \(f'(a_{h})\) is the derivative of the activation in the hidden layer. The matrix products mean +that we are summing up the products for each neuron in the output layer. The symbol \(\circ\) denotes +the Hadamard product, meaning element-wise multiplication.

    +

    This again gives us the gradients in the hidden layer:

    +
    +\[ \nabla W_{h} = X^T \delta_h = (n_{features}, n_{hidden}) ,\]
    +
    +\[ \nabla b_{h} = \sum_{i=1}^{n_{inputs}} \delta_h = (n_{hidden}) .\]
    +
    +
    +
    # to categorical turns our integer vector into a onehot representation
    +from sklearn.metrics import accuracy_score
    +
    +# one-hot in numpy
    +def to_categorical_numpy(integer_vector):
    +    n_inputs = len(integer_vector)
    +    n_categories = np.max(integer_vector) + 1
    +    onehot_vector = np.zeros((n_inputs, n_categories))
    +    onehot_vector[range(n_inputs), integer_vector] = 1
    +    
    +    return onehot_vector
    +
    +#Y_train_onehot, Y_test_onehot = to_categorical(Y_train), to_categorical(Y_test)
    +Y_train_onehot, Y_test_onehot = to_categorical_numpy(Y_train), to_categorical_numpy(Y_test)
    +
    +def feed_forward_train(X):
    +    # weighted sum of inputs to the hidden layer
    +    z_h = np.matmul(X, hidden_weights) + hidden_bias
    +    # activation in the hidden layer
    +    a_h = sigmoid(z_h)
    +    
    +    # weighted sum of inputs to the output layer
    +    z_o = np.matmul(a_h, output_weights) + output_bias
    +    # softmax output
    +    # axis 0 holds each input and axis 1 the probabilities of each category
    +    exp_term = np.exp(z_o)
    +    probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +    
    +    # for backpropagation need activations in hidden and output layers
    +    return a_h, probabilities
    +
    +def backpropagation(X, Y):
    +    a_h, probabilities = feed_forward_train(X)
    +    
    +    # error in the output layer
    +    error_output = probabilities - Y
    +    # error in the hidden layer
    +    error_hidden = np.matmul(error_output, output_weights.T) * a_h * (1 - a_h)
    +    
    +    # gradients for the output layer
    +    output_weights_gradient = np.matmul(a_h.T, error_output)
    +    output_bias_gradient = np.sum(error_output, axis=0)
    +    
    +    # gradient for the hidden layer
    +    hidden_weights_gradient = np.matmul(X.T, error_hidden)
    +    hidden_bias_gradient = np.sum(error_hidden, axis=0)
    +
    +    return output_weights_gradient, output_bias_gradient, hidden_weights_gradient, hidden_bias_gradient
    +
    +print("Old accuracy on training data: " + str(accuracy_score(predict(X_train), Y_train)))
    +
    +eta = 0.01
    +lmbd = 0.01
    +for i in range(1000):
    +    # calculate gradients
    +    dWo, dBo, dWh, dBh = backpropagation(X_train, Y_train_onehot)
    +    
    +    # regularization term gradients
    +    dWo += lmbd * output_weights
    +    dWh += lmbd * hidden_weights
    +    
    +    # update weights and biases
    +    output_weights -= eta * dWo
    +    output_bias -= eta * dBo
    +    hidden_weights -= eta * dWh
    +    hidden_bias -= eta * dBh
    +
    +print("New accuracy on training data: " + str(accuracy_score(predict(X_train), Y_train)))
    +
    +
    +
    +
    +
    Old accuracy on training data: 0.1440501043841336
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +
    +
    +
    New accuracy on training data: 0.09951287404314545
    +
    +
    +
    +
    +
    +
    +

    Improving performance

    +

    As we can see the network does not seem to be learning at all. It seems to be just guessing the label for each image.
    +In order to obtain a network that does something useful, we will have to do a bit more work.

    +

    The choice of hyperparameters such as learning rate and regularization parameter is hugely influential for the performance of the network. Typically a grid-search is performed, wherein we test different hyperparameters separated by orders of magnitude. For example we could test the learning rates \(\eta = 10^{-6}, 10^{-5},...,10^{-1}\) with different regularization parameters \(\lambda = 10^{-6},...,10^{-0}\).

    +

    Next, we haven’t implemented minibatching yet, which introduces stochasticity and is though to act as an important regularizer on the weights. We call a feed-forward + backward pass with a minibatch an iteration, and a full training period +going through the entire dataset (\(n/M\) batches) an epoch.

    +

    If this does not improve network performance, you may want to consider altering the network architecture, adding more neurons or hidden layers.
    +Andrew Ng goes through some of these considerations in this video. You can find a summary of the video here.

    +
    +
    +

    Full object-oriented implementation

    +

    It is very natural to think of the network as an object, with specific instances of the network +being realizations of this object with different hyperparameters. An implementation using Python classes provides a clean structure and interface, and the full implementation of our neural network is given below.

    +
    +
    +
    class NeuralNetwork:
    +    def __init__(
    +            self,
    +            X_data,
    +            Y_data,
    +            n_hidden_neurons=50,
    +            n_categories=10,
    +            epochs=10,
    +            batch_size=100,
    +            eta=0.1,
    +            lmbd=0.0):
    +
    +        self.X_data_full = X_data
    +        self.Y_data_full = Y_data
    +
    +        self.n_inputs = X_data.shape[0]
    +        self.n_features = X_data.shape[1]
    +        self.n_hidden_neurons = n_hidden_neurons
    +        self.n_categories = n_categories
    +
    +        self.epochs = epochs
    +        self.batch_size = batch_size
    +        self.iterations = self.n_inputs // self.batch_size
    +        self.eta = eta
    +        self.lmbd = lmbd
    +
    +        self.create_biases_and_weights()
    +
    +    def create_biases_and_weights(self):
    +        self.hidden_weights = np.random.randn(self.n_features, self.n_hidden_neurons)
    +        self.hidden_bias = np.zeros(self.n_hidden_neurons) + 0.01
    +
    +        self.output_weights = np.random.randn(self.n_hidden_neurons, self.n_categories)
    +        self.output_bias = np.zeros(self.n_categories) + 0.01
    +
    +    def feed_forward(self):
    +        # feed-forward for training
    +        self.z_h = np.matmul(self.X_data, self.hidden_weights) + self.hidden_bias
    +        self.a_h = sigmoid(self.z_h)
    +
    +        self.z_o = np.matmul(self.a_h, self.output_weights) + self.output_bias
    +
    +        exp_term = np.exp(self.z_o)
    +        self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +    def feed_forward_out(self, X):
    +        # feed-forward for output
    +        z_h = np.matmul(X, self.hidden_weights) + self.hidden_bias
    +        a_h = sigmoid(z_h)
    +
    +        z_o = np.matmul(a_h, self.output_weights) + self.output_bias
    +        
    +        exp_term = np.exp(z_o)
    +        probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +        return probabilities
    +
    +    def backpropagation(self):
    +        error_output = self.probabilities - self.Y_data
    +        error_hidden = np.matmul(error_output, self.output_weights.T) * self.a_h * (1 - self.a_h)
    +
    +        self.output_weights_gradient = np.matmul(self.a_h.T, error_output)
    +        self.output_bias_gradient = np.sum(error_output, axis=0)
    +
    +        self.hidden_weights_gradient = np.matmul(self.X_data.T, error_hidden)
    +        self.hidden_bias_gradient = np.sum(error_hidden, axis=0)
    +
    +        if self.lmbd > 0.0:
    +            self.output_weights_gradient += self.lmbd * self.output_weights
    +            self.hidden_weights_gradient += self.lmbd * self.hidden_weights
    +
    +        self.output_weights -= self.eta * self.output_weights_gradient
    +        self.output_bias -= self.eta * self.output_bias_gradient
    +        self.hidden_weights -= self.eta * self.hidden_weights_gradient
    +        self.hidden_bias -= self.eta * self.hidden_bias_gradient
    +
    +    def predict(self, X):
    +        probabilities = self.feed_forward_out(X)
    +        return np.argmax(probabilities, axis=1)
    +
    +    def predict_probabilities(self, X):
    +        probabilities = self.feed_forward_out(X)
    +        return probabilities
    +
    +    def train(self):
    +        data_indices = np.arange(self.n_inputs)
    +
    +        for i in range(self.epochs):
    +            for j in range(self.iterations):
    +                # pick datapoints with replacement
    +                chosen_datapoints = np.random.choice(
    +                    data_indices, size=self.batch_size, replace=False
    +                )
    +
    +                # minibatch training data
    +                self.X_data = self.X_data_full[chosen_datapoints]
    +                self.Y_data = self.Y_data_full[chosen_datapoints]
    +
    +                self.feed_forward()
    +                self.backpropagation()
    +
    +
    +
    +
    +
    +
    +

    Evaluate model performance on test data

    +

    To measure the performance of our network we evaluate how well it does it data it has never seen before, i.e. the test data.
    +We measure the performance of the network using the accuracy score.
    +The accuracy is as you would expect just the number of images correctly labeled divided by the total number of images. A perfect classifier will have an accuracy score of \(1\).

    +
    +\[ \text{Accuracy} = \frac{\sum_{i=1}^n I(\tilde{y}_i = y_i)}{n} ,\]
    +

    where \(I\) is the indicator function, \(1\) if \(\tilde{y}_i = y_i\) and \(0\) otherwise.

    +
    +
    +
    epochs = 100
    +batch_size = 100
    +
    +dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,
    +                    n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)
    +dnn.train()
    +test_predict = dnn.predict(X_test)
    +
    +# accuracy score from scikit library
    +print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict))
    +
    +# equivalent in numpy
    +def accuracy_score_numpy(Y_test, Y_pred):
    +    return np.sum(Y_test == Y_pred) / len(Y_test)
    +
    +#print("Accuracy score on test set: ", accuracy_score_numpy(Y_test, test_predict))
    +
    +
    +
    +
    +
    Accuracy score on test set:  0.9444444444444444
    +
    +
    +
    +
    +
    +
    +

    Adjust hyperparameters

    +

    We now perform a grid search to find the optimal hyperparameters for the network.
    +Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around \(98\%\) (\(2\%\) error rate).

    +
    +
    +
    eta_vals = np.logspace(-5, 1, 7)
    +lmbd_vals = np.logspace(-5, 1, 7)
    +# store the models for later use
    +DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
    +
    +# grid search
    +for i, eta in enumerate(eta_vals):
    +    for j, lmbd in enumerate(lmbd_vals):
    +        dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,
    +                            n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)
    +        dnn.train()
    +        
    +        DNN_numpy[i][j] = dnn
    +        
    +        test_predict = dnn.predict(X_test)
    +        
    +        print("Learning rate  = ", eta)
    +        print("Lambda = ", lmbd)
    +        print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict))
    +        print()
    +
    +
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  1e-05
    +Accuracy score on test set:  0.11666666666666667
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  0.0001
    +Accuracy score on test set:  0.20833333333333334
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  0.001
    +Accuracy score on test set:  0.12222222222222222
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  0.01
    +Accuracy score on test set:  0.14722222222222223
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  0.1
    +Accuracy score on test set:  0.17777777777777778
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  1.0
    +Accuracy score on test set:  0.16111111111111112
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  10.0
    +Accuracy score on test set:  0.20277777777777778
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  1e-05
    +Accuracy score on test set:  0.5305555555555556
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  0.0001
    +Accuracy score on test set:  0.5944444444444444
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  0.001
    +Accuracy score on test set:  0.5888888888888889
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  0.01
    +Accuracy score on test set:  0.6111111111111112
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  0.1
    +Accuracy score on test set:  0.5222222222222223
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  1.0
    +Accuracy score on test set:  0.5555555555555556
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  10.0
    +Accuracy score on test set:  0.8055555555555556
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  1e-05
    +Accuracy score on test set:  0.85
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  0.0001
    +Accuracy score on test set:  0.85
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  0.001
    +Accuracy score on test set:  0.875
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  0.01
    +Accuracy score on test set:  0.8666666666666667
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  0.1
    +Accuracy score on test set:  0.8638888888888889
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  1.0
    +Accuracy score on test set:  0.9555555555555556
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  10.0
    +Accuracy score on test set:  0.925
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  1e-05
    +Accuracy score on test set:  0.9472222222222222
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  0.0001
    +Accuracy score on test set:  0.9277777777777778
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  0.001
    +Accuracy score on test set:  0.9472222222222222
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  0.01
    +Accuracy score on test set:  0.9305555555555556
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  0.1
    +Accuracy score on test set:  0.9555555555555556
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  1.0
    +Accuracy score on test set:  0.7694444444444445
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  10.0
    +Accuracy score on test set:  0.19166666666666668
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +
    +
    +
    Learning rate  =  0.1
    +Lambda =  1e-05
    +Accuracy score on test set:  0.10555555555555556
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +
    +
    +
    Learning rate  =  0.1
    +Lambda =  0.0001
    +Accuracy score on test set:  0.08611111111111111
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +
    +
    +
    Learning rate  =  0.1
    +Lambda =  0.001
    +Accuracy score on test set:  0.10555555555555556
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +
    +
    +
    Learning rate  =  0.1
    +Lambda =  0.01
    +Accuracy score on test set:  0.08888888888888889
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +
    +
    +
    Learning rate  =  0.1
    +Lambda =  0.1
    +Accuracy score on test set:  0.08611111111111111
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +
    +
    +
    Learning rate  =  0.1
    +Lambda =  1.0
    +Accuracy score on test set:  0.08888888888888889
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +
    +
    +
    Learning rate  =  0.1
    +Lambda =  10.0
    +Accuracy score on test set:  0.09166666666666666
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  1.0
    +Lambda =  1e-05
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  1.0
    +Lambda =  0.0001
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  1.0
    +Lambda =  0.001
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  1.0
    +Lambda =  0.01
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  1.0
    +Lambda =  0.1
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +
    +
    +
    Learning rate  =  1.0
    +Lambda =  1.0
    +Accuracy score on test set:  0.10555555555555556
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  1.0
    +Lambda =  10.0
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  10.0
    +Lambda =  1e-05
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  10.0
    +Lambda =  0.0001
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  10.0
    +Lambda =  0.001
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  10.0
    +Lambda =  0.01
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  10.0
    +Lambda =  0.1
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  10.0
    +Lambda =  1.0
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp
    +  exp_term = np.exp(self.z_o)
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
    +  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
    +
    +
    +
    Learning rate  =  10.0
    +Lambda =  10.0
    +Accuracy score on test set:  0.07777777777777778
    +
    +
    +
    +
    +
    +
    +

    Visualization

    +
    +
    +
    # visual representation of grid search
    +# uses seaborn heatmap, you can also do this with matplotlib imshow
    +import seaborn as sns
    +
    +sns.set()
    +
    +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    +
    +for i in range(len(eta_vals)):
    +    for j in range(len(lmbd_vals)):
    +        dnn = DNN_numpy[i][j]
    +        
    +        train_pred = dnn.predict(X_train) 
    +        test_pred = dnn.predict(X_test)
    +
    +        train_accuracy[i][j] = accuracy_score(Y_train, train_pred)
    +        test_accuracy[i][j] = accuracy_score(Y_test, test_pred)
    +
    +        
    +fig, ax = plt.subplots(figsize = (10, 10))
    +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
    +ax.set_title("Training Accuracy")
    +ax.set_ylabel("$\eta$")
    +ax.set_xlabel("$\lambda$")
    +plt.show()
    +
    +fig, ax = plt.subplots(figsize = (10, 10))
    +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
    +ax.set_title("Test Accuracy")
    +ax.set_ylabel("$\eta$")
    +ax.set_xlabel("$\lambda$")
    +plt.show()
    +
    +
    +
    +
    +
    /var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp
    +  return 1/(1 + np.exp(-x))
    +
    +
    +_images/week43_43_1.png +_images/week43_43_2.png +
    +
    +
    +
    +

    scikit-learn implementation

    +

    scikit-learn focuses more +on traditional machine learning methods, such as regression, +clustering, decision trees, etc. As such, it has only two types of +neural networks: Multi Layer Perceptron outputting continuous values, +MPLRegressor, and Multi Layer Perceptron outputting labels, +MLPClassifier. We will see how simple it is to use these classes.

    +

    scikit-learn implements a few improvements from our neural network, +such as early stopping, a varying learning rate, different +optimization methods, etc. We would therefore expect a better +performance overall.

    +
    +
    +
    from sklearn.neural_network import MLPClassifier
    +# store models for later use
    +DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
    +
    +for i, eta in enumerate(eta_vals):
    +    for j, lmbd in enumerate(lmbd_vals):
    +        dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',
    +                            alpha=lmbd, learning_rate_init=eta, max_iter=epochs)
    +        dnn.fit(X_train, Y_train)
    +        
    +        DNN_scikit[i][j] = dnn
    +        
    +        print("Learning rate  = ", eta)
    +        print("Lambda = ", lmbd)
    +        print("Accuracy score on test set: ", dnn.score(X_test, Y_test))
    +        print()
    +
    +
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  1e-05
    +Accuracy score on test set:  0.18333333333333332
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  0.0001
    +Accuracy score on test set:  0.18611111111111112
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  0.001
    +Accuracy score on test set:  0.13055555555555556
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  0.01
    +Accuracy score on test set:  0.24444444444444444
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  0.1
    +Accuracy score on test set:  0.23333333333333334
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  1.0
    +Accuracy score on test set:  0.12777777777777777
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  1e-05
    +Lambda =  10.0
    +Accuracy score on test set:  0.1527777777777778
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  1e-05
    +Accuracy score on test set:  0.9111111111111111
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  0.0001
    +Accuracy score on test set:  0.8888888888888888
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  0.001
    +Accuracy score on test set:  0.8722222222222222
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  0.01
    +Accuracy score on test set:  0.8305555555555556
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  0.1
    +Accuracy score on test set:  0.8888888888888888
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  1.0
    +Accuracy score on test set:  0.8805555555555555
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.0001
    +Lambda =  10.0
    +Accuracy score on test set:  0.8944444444444445
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  1e-05
    +Accuracy score on test set:  0.975
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  0.0001
    +Accuracy score on test set:  0.9777777777777777
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  0.001
    +Accuracy score on test set:  0.9805555555555555
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  0.01
    +Accuracy score on test set:  0.9861111111111112
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  0.1
    +Accuracy score on test set:  0.9805555555555555
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  1.0
    +Accuracy score on test set:  0.9777777777777777
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.001
    +Lambda =  10.0
    +Accuracy score on test set:  0.9444444444444444
    +
    +
    +
    /Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.
    +  warnings.warn(
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  1e-05
    +Accuracy score on test set:  0.9861111111111112
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  0.0001
    +Accuracy score on test set:  0.9888888888888889
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  0.001
    +Accuracy score on test set:  0.9888888888888889
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  0.01
    +Accuracy score on test set:  0.9861111111111112
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  0.1
    +Accuracy score on test set:  0.9888888888888889
    +
    +
    +
    Learning rate  =  0.01
    +Lambda =  1.0
    +Accuracy score on test set:  0.9722222222222222
    +
    +Learning rate  =  0.01
    +Lambda =  10.0
    +Accuracy score on test set:  0.9527777777777777
    +
    +
    +
    Learning rate  =  0.1
    +Lambda =  1e-05
    +Accuracy score on test set:  0.9027777777777778
    +
    +Learning rate  =  0.1
    +Lambda =  0.0001
    +Accuracy score on test set:  0.8583333333333333
    +
    +
    +
    Learning rate  =  0.1
    +Lambda =  0.001
    +Accuracy score on test set:  0.8722222222222222
    +
    +Learning rate  =  0.1
    +Lambda =  0.01
    +Accuracy score on test set:  0.9055555555555556
    +
    +
    +
    Learning rate  =  0.1
    +Lambda =  0.1
    +Accuracy score on test set:  0.8805555555555555
    +
    +Learning rate  =  0.1
    +Lambda =  1.0
    +Accuracy score on test set:  0.8722222222222222
    +
    +
    +
    Learning rate  =  0.1
    +Lambda =  10.0
    +Accuracy score on test set:  0.8666666666666667
    +
    +Learning rate  =  1.0
    +Lambda =  1e-05
    +Accuracy score on test set:  0.08611111111111111
    +
    +Learning rate  =  1.0
    +Lambda =  0.0001
    +Accuracy score on test set:  0.10555555555555556
    +
    +
    +
    Learning rate  =  1.0
    +Lambda =  0.001
    +Accuracy score on test set:  0.10555555555555556
    +
    +Learning rate  =  1.0
    +Lambda =  0.01
    +Accuracy score on test set:  0.17777777777777778
    +
    +Learning rate  =  1.0
    +Lambda =  0.1
    +Accuracy score on test set:  0.08333333333333333
    +
    +
    +
    Learning rate  =  1.0
    +Lambda =  1.0
    +Accuracy score on test set:  0.08888888888888889
    +
    +Learning rate  =  1.0
    +Lambda =  10.0
    +Accuracy score on test set:  0.09444444444444444
    +
    +Learning rate  =  10.0
    +Lambda =  1e-05
    +Accuracy score on test set:  0.17222222222222222
    +
    +
    +
    Learning rate  =  10.0
    +Lambda =  0.0001
    +Accuracy score on test set:  0.11666666666666667
    +
    +Learning rate  =  10.0
    +Lambda =  0.001
    +Accuracy score on test set:  0.10555555555555556
    +
    +Learning rate  =  10.0
    +Lambda =  0.01
    +Accuracy score on test set:  0.1388888888888889
    +
    +Learning rate  =  10.0
    +Lambda =  0.1
    +Accuracy score on test set:  0.11388888888888889
    +
    +
    +
    Learning rate  =  10.0
    +Lambda =  1.0
    +Accuracy score on test set:  0.10555555555555556
    +
    +Learning rate  =  10.0
    +Lambda =  10.0
    +Accuracy score on test set:  0.09444444444444444
    +
    +
    +
    +
    +
    +
    +

    Visualization

    +
    +
    +
    # optional
    +# visual representation of grid search
    +# uses seaborn heatmap, could probably do this in matplotlib
    +import seaborn as sns
    +
    +sns.set()
    +
    +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    +
    +for i in range(len(eta_vals)):
    +    for j in range(len(lmbd_vals)):
    +        dnn = DNN_scikit[i][j]
    +        
    +        train_pred = dnn.predict(X_train) 
    +        test_pred = dnn.predict(X_test)
    +
    +        train_accuracy[i][j] = accuracy_score(Y_train, train_pred)
    +        test_accuracy[i][j] = accuracy_score(Y_test, test_pred)
    +
    +        
    +fig, ax = plt.subplots(figsize = (10, 10))
    +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
    +ax.set_title("Training Accuracy")
    +ax.set_ylabel("$\eta$")
    +ax.set_xlabel("$\lambda$")
    +plt.show()
    +
    +fig, ax = plt.subplots(figsize = (10, 10))
    +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
    +ax.set_title("Test Accuracy")
    +ax.set_ylabel("$\eta$")
    +ax.set_xlabel("$\lambda$")
    +plt.show()
    +
    +
    +
    +
    +_images/week43_47_0.png +_images/week43_47_1.png +
    +
    +
    +
    +

    Building neural networks in Tensorflow and Keras

    +

    Now we want to build on the experience gained from our neural network implementation in NumPy and scikit-learn +and use it to construct a neural network in Tensorflow. Once we have constructed a neural network in NumPy +and Tensorflow, building one in Keras is really quite trivial, though the performance may suffer.

    +

    In our previous example we used only one hidden layer, and in this we will use two. From this it should be quite +clear how to build one using an arbitrary number of hidden layers, using data structures such as Python lists or +NumPy arrays.

    +
    +
    +

    Tensorflow

    +

    Tensorflow is an open source library machine learning library +developed by the Google Brain team for internal use. It was released +under the Apache 2.0 open source license in November 9, 2015.

    +

    Tensorflow is a computational framework that allows you to construct +machine learning models at different levels of abstraction, from +high-level, object-oriented APIs like Keras, down to the C++ kernels +that Tensorflow is built upon. The higher levels of abstraction are +simpler to use, but less flexible, and our choice of implementation +should reflect the problems we are trying to solve.

    +

    Tensorflow uses so-called graphs to represent your computation +in terms of the dependencies between individual operations, such that you first build a Tensorflow graph +to represent your model, and then create a Tensorflow session to run the graph.

    +

    In this guide we will analyze the same data as we did in our NumPy and +scikit-learn tutorial, gathered from the MNIST database of images. We +will give an introduction to the lower level Python Application +Program Interfaces (APIs), and see how we use them to build our graph. +Then we will build (effectively) the same graph in Keras, to see just +how simple solving a machine learning problem can be.

    +

    To install tensorflow on Unix/Linux systems, use pip as

    +
    +
    +
    pip3 install tensorflow
    +
    +
    +
    +
    +
      Input In [14]
    +    pip3 install tensorflow
    +         ^
    +SyntaxError: invalid syntax
    +
    +
    +
    +
    +

    and/or if you use anaconda, just write (or install from the graphical user interface) +(current release of CPU-only TensorFlow)

    +
    +
    +
    conda create -n tf tensorflow
    +conda activate tf
    +
    +
    +
    +
    +

    To install the current release of GPU TensorFlow

    +
    +
    +
    conda create -n tf-gpu tensorflow-gpu
    +conda activate tf-gpu
    +
    +
    +
    +
    +
    +
    +

    Using Keras

    +

    Keras is a high level neural network +that supports Tensorflow, CTNK and Theano as backends.
    +If you have Anaconda installed you may run the following command

    +
    +
    +
    conda install keras
    +
    +
    +
    +
    +

    You can look up the instructions here for more information.

    +

    We will to a large extent use keras in our examples..

    +
    +
    +

    Collect and pre-process data

    +

    Let us look again at the MINST data set.

    +
    +
    +
    # import necessary packages
    +import numpy as np
    +import matplotlib.pyplot as plt
    +import tensorflow as tf
    +from sklearn import datasets
    +
    +
    +# ensure the same random numbers appear every time
    +np.random.seed(0)
    +
    +# display images in notebook
    +%matplotlib inline
    +plt.rcParams['figure.figsize'] = (12,12)
    +
    +
    +# download MNIST dataset
    +digits = datasets.load_digits()
    +
    +# define inputs and labels
    +inputs = digits.images
    +labels = digits.target
    +
    +print("inputs = (n_inputs, pixel_width, pixel_height) = " + str(inputs.shape))
    +print("labels = (n_inputs) = " + str(labels.shape))
    +
    +
    +# flatten the image
    +# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64
    +n_inputs = len(inputs)
    +inputs = inputs.reshape(n_inputs, -1)
    +print("X = (n_inputs, n_features) = " + str(inputs.shape))
    +
    +
    +# choose some random images to display
    +indices = np.arange(n_inputs)
    +random_indices = np.random.choice(indices, size=5)
    +
    +for i, image in enumerate(digits.images[random_indices]):
    +    plt.subplot(1, 5, i+1)
    +    plt.axis('off')
    +    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    +    plt.title("Label: %d" % digits.target[random_indices[i]])
    +plt.show()
    +
    +
    +
    +
    +
    +
    +
    from tensorflow.keras.layers import Input
    +from tensorflow.keras.models import Sequential      #This allows appending layers to existing models
    +from tensorflow.keras.layers import Dense           #This allows defining the characteristics of a particular layer
    +from tensorflow.keras import optimizers             #This allows using whichever optimiser we want (sgd,adam,RMSprop)
    +from tensorflow.keras import regularizers           #This allows using whichever regularizer we want (l1,l2,l1_l2)
    +from tensorflow.keras.utils import to_categorical   #This allows using categorical cross entropy as the cost function
    +
    +from sklearn.model_selection import train_test_split
    +
    +# one-hot representation of labels
    +labels = to_categorical(labels)
    +
    +# split into train and test data
    +train_size = 0.8
    +test_size = 1 - train_size
    +X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,
    +                                                    test_size=test_size)
    +
    +
    +
    +
    +
    +
    +
    epochs = 100
    +batch_size = 100
    +n_neurons_layer1 = 100
    +n_neurons_layer2 = 50
    +n_categories = 10
    +eta_vals = np.logspace(-5, 1, 7)
    +lmbd_vals = np.logspace(-5, 1, 7)
    +def create_neural_network_keras(n_neurons_layer1, n_neurons_layer2, n_categories, eta, lmbd):
    +    model = Sequential()
    +    model.add(Dense(n_neurons_layer1, activation='sigmoid', kernel_regularizer=regularizers.l2(lmbd)))
    +    model.add(Dense(n_neurons_layer2, activation='sigmoid', kernel_regularizer=regularizers.l2(lmbd)))
    +    model.add(Dense(n_categories, activation='softmax'))
    +    
    +    sgd = optimizers.SGD(lr=eta)
    +    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
    +    
    +    return model
    +
    +
    +
    +
    +
    +
    +
    DNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
    +        
    +for i, eta in enumerate(eta_vals):
    +    for j, lmbd in enumerate(lmbd_vals):
    +        DNN = create_neural_network_keras(n_neurons_layer1, n_neurons_layer2, n_categories,
    +                                         eta=eta, lmbd=lmbd)
    +        DNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0)
    +        scores = DNN.evaluate(X_test, Y_test)
    +        
    +        DNN_keras[i][j] = DNN
    +        
    +        print("Learning rate = ", eta)
    +        print("Lambda = ", lmbd)
    +        print("Test accuracy: %.3f" % scores[1])
    +        print()
    +
    +
    +
    +
    +
    +
    +
    # optional
    +# visual representation of grid search
    +# uses seaborn heatmap, could probably do this in matplotlib
    +import seaborn as sns
    +
    +sns.set()
    +
    +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
    +
    +for i in range(len(eta_vals)):
    +    for j in range(len(lmbd_vals)):
    +        DNN = DNN_keras[i][j]
    +
    +        train_accuracy[i][j] = DNN.evaluate(X_train, Y_train)[1]
    +        test_accuracy[i][j] = DNN.evaluate(X_test, Y_test)[1]
    +
    +        
    +fig, ax = plt.subplots(figsize = (10, 10))
    +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
    +ax.set_title("Training Accuracy")
    +ax.set_ylabel("$\eta$")
    +ax.set_xlabel("$\lambda$")
    +plt.show()
    +
    +fig, ax = plt.subplots(figsize = (10, 10))
    +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
    +ax.set_title("Test Accuracy")
    +ax.set_ylabel("$\eta$")
    +ax.set_xlabel("$\lambda$")
    +plt.show()
    +
    +
    +
    +
    +
    +
    +

    The Breast Cancer Data, now with Keras

    +
    +
    +
    import tensorflow as tf
    +from tensorflow.keras.layers import Input
    +from tensorflow.keras.models import Sequential      #This allows appending layers to existing models
    +from tensorflow.keras.layers import Dense           #This allows defining the characteristics of a particular layer
    +from tensorflow.keras import optimizers             #This allows using whichever optimiser we want (sgd,adam,RMSprop)
    +from tensorflow.keras import regularizers           #This allows using whichever regularizer we want (l1,l2,l1_l2)
    +from tensorflow.keras.utils import to_categorical   #This allows using categorical cross entropy as the cost function
    +import numpy as np
    +import matplotlib.pyplot as plt
    +import seaborn as sns
    +from sklearn.model_selection import train_test_split as splitter
    +from sklearn.datasets import load_breast_cancer
    +import pickle
    +import os 
    +
    +
    +"""Load breast cancer dataset"""
    +
    +np.random.seed(0)        #create same seed for random number every time
    +
    +cancer=load_breast_cancer()      #Download breast cancer dataset
    +
    +inputs=cancer.data                     #Feature matrix of 569 rows (samples) and 30 columns (parameters)
    +outputs=cancer.target                  #Label array of 569 rows (0 for benign and 1 for malignant)
    +labels=cancer.feature_names[0:30]
    +
    +print('The content of the breast cancer dataset is:')      #Print information about the datasets
    +print(labels)
    +print('-------------------------')
    +print("inputs =  " + str(inputs.shape))
    +print("outputs =  " + str(outputs.shape))
    +print("labels =  "+ str(labels.shape))
    +
    +x=inputs      #Reassign the Feature and Label matrices to other variables
    +y=outputs
    +
    +#%% 
    +
    +# Visualisation of dataset (for correlation analysis)
    +
    +plt.figure()
    +plt.scatter(x[:,0],x[:,2],s=40,c=y,cmap=plt.cm.Spectral)
    +plt.xlabel('Mean radius',fontweight='bold')
    +plt.ylabel('Mean perimeter',fontweight='bold')
    +plt.show()
    +
    +plt.figure()
    +plt.scatter(x[:,5],x[:,6],s=40,c=y, cmap=plt.cm.Spectral)
    +plt.xlabel('Mean compactness',fontweight='bold')
    +plt.ylabel('Mean concavity',fontweight='bold')
    +plt.show()
    +
    +
    +plt.figure()
    +plt.scatter(x[:,0],x[:,1],s=40,c=y,cmap=plt.cm.Spectral)
    +plt.xlabel('Mean radius',fontweight='bold')
    +plt.ylabel('Mean texture',fontweight='bold')
    +plt.show()
    +
    +plt.figure()
    +plt.scatter(x[:,2],x[:,1],s=40,c=y,cmap=plt.cm.Spectral)
    +plt.xlabel('Mean perimeter',fontweight='bold')
    +plt.ylabel('Mean compactness',fontweight='bold')
    +plt.show()
    +
    +
    +# Generate training and testing datasets
    +
    +#Select features relevant to classification (texture,perimeter,compactness and symmetery) 
    +#and add to input matrix
    +
    +temp1=np.reshape(x[:,1],(len(x[:,1]),1))
    +temp2=np.reshape(x[:,2],(len(x[:,2]),1))
    +X=np.hstack((temp1,temp2))      
    +temp=np.reshape(x[:,5],(len(x[:,5]),1))
    +X=np.hstack((X,temp))       
    +temp=np.reshape(x[:,8],(len(x[:,8]),1))
    +X=np.hstack((X,temp))       
    +
    +X_train,X_test,y_train,y_test=splitter(X,y,test_size=0.1)   #Split datasets into training and testing
    +
    +y_train=to_categorical(y_train)     #Convert labels to categorical when using categorical cross entropy
    +y_test=to_categorical(y_test)
    +
    +del temp1,temp2,temp
    +
    +# %%
    +
    +# Define tunable parameters"
    +
    +eta=np.logspace(-3,-1,3)                    #Define vector of learning rates (parameter to SGD optimiser)
    +lamda=0.01                                  #Define hyperparameter
    +n_layers=2                                  #Define number of hidden layers in the model
    +n_neuron=np.logspace(0,3,4,dtype=int)       #Define number of neurons per layer
    +epochs=100                                   #Number of reiterations over the input data
    +batch_size=100                              #Number of samples per gradient update
    +
    +# %%
    +
    +"""Define function to return Deep Neural Network model"""
    +
    +def NN_model(inputsize,n_layers,n_neuron,eta,lamda):
    +    model=Sequential()      
    +    for i in range(n_layers):       #Run loop to add hidden layers to the model
    +        if (i==0):                  #First layer requires input dimensions
    +            model.add(Dense(n_neuron,activation='relu',kernel_regularizer=regularizers.l2(lamda),input_dim=inputsize))
    +        else:                       #Subsequent layers are capable of automatic shape inferencing
    +            model.add(Dense(n_neuron,activation='relu',kernel_regularizer=regularizers.l2(lamda)))
    +    model.add(Dense(2,activation='softmax'))  #2 outputs - ordered and disordered (softmax for prob)
    +    sgd=optimizers.SGD(lr=eta)
    +    model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])
    +    return model
    +
    +    
    +Train_accuracy=np.zeros((len(n_neuron),len(eta)))      #Define matrices to store accuracy scores as a function
    +Test_accuracy=np.zeros((len(n_neuron),len(eta)))       #of learning rate and number of hidden neurons for 
    +
    +for i in range(len(n_neuron)):     #run loops over hidden neurons and learning rates to calculate 
    +    for j in range(len(eta)):      #accuracy scores 
    +        DNN_model=NN_model(X_train.shape[1],n_layers,n_neuron[i],eta[j],lamda)
    +        DNN_model.fit(X_train,y_train,epochs=epochs,batch_size=batch_size,verbose=1)
    +        Train_accuracy[i,j]=DNN_model.evaluate(X_train,y_train)[1]
    +        Test_accuracy[i,j]=DNN_model.evaluate(X_test,y_test)[1]
    +               
    +
    +def plot_data(x,y,data,title=None):
    +
    +    # plot results
    +    fontsize=16
    +
    +
    +    fig = plt.figure()
    +    ax = fig.add_subplot(111)
    +    cax = ax.matshow(data, interpolation='nearest', vmin=0, vmax=1)
    +    
    +    cbar=fig.colorbar(cax)
    +    cbar.ax.set_ylabel('accuracy (%)',rotation=90,fontsize=fontsize)
    +    cbar.set_ticks([0,.2,.4,0.6,0.8,1.0])
    +    cbar.set_ticklabels(['0%','20%','40%','60%','80%','100%'])
    +
    +    # put text on matrix elements
    +    for i, x_val in enumerate(np.arange(len(x))):
    +        for j, y_val in enumerate(np.arange(len(y))):
    +            c = "${0:.1f}\\%$".format( 100*data[j,i])  
    +            ax.text(x_val, y_val, c, va='center', ha='center')
    +
    +    # convert axis vaues to to string labels
    +    x=[str(i) for i in x]
    +    y=[str(i) for i in y]
    +
    +
    +    ax.set_xticklabels(['']+x)
    +    ax.set_yticklabels(['']+y)
    +
    +    ax.set_xlabel('$\\mathrm{learning\\ rate}$',fontsize=fontsize)
    +    ax.set_ylabel('$\\mathrm{hidden\\ neurons}$',fontsize=fontsize)
    +    if title is not None:
    +        ax.set_title(title)
    +
    +    plt.tight_layout()
    +
    +    plt.show()
    +    
    +plot_data(eta,n_neuron,Train_accuracy, 'training')
    +plot_data(eta,n_neuron,Test_accuracy, 'testing')
    +
    +
    +
    +
    +
    +
    +

    Fine-tuning neural network hyperparameters

    +

    The flexibility of neural networks is also one of their main +drawbacks: there are many hyperparameters to tweak. Not only can you +use any imaginable network topology (how neurons/nodes are interconnected), +but even in a simple FFNN you can change the number of layers, the +number of neurons per layer, the type of activation function to use in +each layer, the weight initialization logic, the stochastic gradient optmized and much more. How do you +know what combination of hyperparameters is the best for your task?

    +
      +
    • You can use grid search with cross-validation to find the right hyperparameters.

    • +
    +

    However,since there are many hyperparameters to tune, and since +training a neural network on a large dataset takes a lot of time, you +will only be able to explore a tiny part of the hyperparameter space.

    +
      +
    • You can use randomized search.

    • +
    • Or use tools like Oscar, which implements more complex algorithms to help you find a good set of hyperparameters quickly.

    • +
    +
    +
    +

    Hidden layers

    +

    For many problems you can start with just one or two hidden layers and it will work just fine. +For the MNIST data set you ca easily get a high accuracy using just one hidden layer with a +few hundred neurons. +You can reach for this data set above 98% accuracy using two hidden layers with the same total amount of +neurons, in roughly the same amount of training time.

    +

    For more complex problems, you can gradually +ramp up the number of hidden layers, until you start overfitting the training set. Very complex tasks, such +as large image classification or speech recognition, typically require networks with dozens of layers +and they need a huge amount +of training data. However, you will rarely have to train such networks from scratch: it is much more +common to reuse parts of a pretrained state-of-the-art network that performs a similar task.

    +
    +
    +

    Which activation function should I use?

    +

    The Back propagation algorithm we derived above works by going from +the output layer to the input layer, propagating the error gradient on +the way. Once the algorithm has computed the gradient of the cost +function with regards to each parameter in the network, it uses these +gradients to update each parameter with a Gradient Descent (GD) step.

    +

    Unfortunately for us, the gradients often get smaller and smaller as the +algorithm progresses down to the first hidden layers. As a result, the +GD update leaves the lower layer connection weights +virtually unchanged, and training never converges to a good +solution. This is known in the literature as +the vanishing gradients problem.

    +

    In other cases, the opposite can happen, namely the the gradients can grow bigger and +bigger. The result is that many of the layers get large updates of the +weights the +algorithm diverges. This is the exploding gradients problem, which is +mostly encountered in recurrent neural networks. More generally, deep +neural networks suffer from unstable gradients, different layers may +learn at widely different speeds

    +
    +
    +

    Is the Logistic activation function (Sigmoid) our choice?

    +

    Although this unfortunate behavior has been empirically observed for +quite a while (it was one of the reasons why deep neural networks were +mostly abandoned for a long time), it is only around 2010 that +significant progress was made in understanding it.

    +

    A paper titled Understanding the Difficulty of Training Deep +Feedforward Neural Networks by Xavier Glorot and Yoshua Bengio found that +the problems with the popular logistic +sigmoid activation function and the weight initialization technique +that was most popular at the time, namely random initialization using +a normal distribution with a mean of 0 and a standard deviation of +1.

    +

    They showed that with this activation function and this +initialization scheme, the variance of the outputs of each layer is +much greater than the variance of its inputs. Going forward in the +network, the variance keeps increasing after each layer until the +activation function saturates at the top layers. This is actually made +worse by the fact that the logistic function has a mean of 0.5, not 0 +(the hyperbolic tangent function has a mean of 0 and behaves slightly +better than the logistic function in deep networks).

    +
    +
    +

    The derivative of the Logistic funtion

    +

    Looking at the logistic activation function, when inputs become large +(negative or positive), the function saturates at 0 or 1, with a +derivative extremely close to 0. Thus when backpropagation kicks in, +it has virtually no gradient to propagate back through the network, +and what little gradient exists keeps getting diluted as +backpropagation progresses down through the top layers, so there is +really nothing left for the lower layers.

    +

    In their paper, Glorot and Bengio propose a way to significantly +alleviate this problem. We need the signal to flow properly in both +directions: in the forward direction when making predictions, and in +the reverse direction when backpropagating gradients. We don’t want +the signal to die out, nor do we want it to explode and saturate. For +the signal to flow properly, the authors argue that we need the +variance of the outputs of each layer to be equal to the variance of +its inputs, and we also need the gradients to have equal variance +before and after flowing through a layer in the reverse direction.

    +

    One of the insights in the 2010 paper by Glorot and Bengio was that +the vanishing/exploding gradients problems were in part due to a poor +choice of activation function. Until then most people had assumed that +if Nature had chosen to use roughly sigmoid activation functions in +biological neurons, they must be an excellent choice. But it turns out +that other activation functions behave much better in deep neural +networks, in particular the ReLU activation function, mostly because +it does not saturate for positive values (and also because it is quite +fast to compute).

    +
    +
    +

    The RELU function family

    +

    The ReLU activation function suffers from a problem known as the dying +ReLUs: during training, some neurons effectively die, meaning they +stop outputting anything other than 0.

    +

    In some cases, you may find that half of your network’s neurons are +dead, especially if you used a large learning rate. During training, +if a neuron’s weights get updated such that the weighted sum of the +neuron’s inputs is negative, it will start outputting 0. When this +happen, the neuron is unlikely to come back to life since the gradient +of the ReLU function is 0 when its input is negative.

    +

    To solve this problem, nowadays practitioners use a variant of the ReLU +function, such as the leaky ReLU discussed above or the so-called +exponential linear unit (ELU) function

    +
    +\[\begin{split} +ELU(z) = \left\{\begin{array}{cc} \alpha\left( \exp{(z)}-1\right) & z < 0,\\ z & z \ge 0.\end{array}\right. +\end{split}\]
    +
    +
    +

    Which activation function should we use?

    +

    In general it seems that the ELU activation function is better than +the leaky ReLU function (and its variants), which is better than +ReLU. ReLU performs better than \(\tanh\) which in turn performs better +than the logistic function.

    +

    If runtime +performance is an issue, then you may opt for the leaky ReLU function over the +ELU function If you don’t +want to tweak yet another hyperparameter, you may just use the default +\(\alpha\) of \(0.01\) for the leaky ReLU, and \(1\) for ELU. If you have +spare time and computing power, you can use cross-validation or +bootstrap to evaluate other activation functions.

    +
    +
    +

    More on activation functions, output layers

    +

    In most cases you can use the ReLU activation function in the hidden layers (or one of its variants).

    +

    It is a bit faster to compute than other activation functions, and the gradient descent optimization does in general not get stuck.

    +

    For the output layer:

    +
      +
    • For classification the softmax activation function is generally a good choice for classification tasks (when the classes are mutually exclusive).

    • +
    • For regression tasks, you can simply use no activation function at all.

    • +
    +
    +
    +

    Batch Normalization

    +

    Batch Normalization +aims to address the vanishing/exploding gradients problems, and more generally the problem that the +distribution of each layer’s inputs changes during training, as the parameters of the previous layers change.

    +

    The technique consists of adding an operation in the model just before the activation function of each +layer, simply zero-centering and normalizing the inputs, then scaling and shifting the result using two new +parameters per layer (one for scaling, the other for shifting). In other words, this operation lets the model +learn the optimal scale and mean of the inputs for each layer. +In order to zero-center and normalize the inputs, the algorithm needs to estimate the inputs’ mean and +standard deviation. It does so by evaluating the mean and standard deviation of the inputs over the current +mini-batch, from this the name batch normalization.

    +
    +
    +

    Dropout

    +

    It is a fairly simple algorithm: at every training step, every neuron (including the input neurons but +excluding the output neurons) has a probability \(p\) of being temporarily dropped out, meaning it will be +entirely ignored during this training step, but it may be active during the next step.

    +

    The +hyperparameter \(p\) is called the dropout rate, and it is typically set to 50%. After training, the neurons are not dropped anymore. +It is viewed as one of the most popular regularization techniques.

    +
    +
    +

    Gradient Clipping

    +

    A popular technique to lessen the exploding gradients problem is to simply clip the gradients during +backpropagation so that they never exceed some threshold (this is mostly useful for recurrent neural +networks).

    +

    This technique is called Gradient Clipping.

    +

    In general however, Batch +Normalization is preferred.

    +
    +
    +

    A very nice website on Neural Networks

    +

    You may find this website very useful.

    +
    +
    +

    A top-down perspective on Neural networks

    +

    The first thing we would like to do is divide the data into two or three +parts. A training set, a validation or dev (development) set, and a +test set. The test set is the data on which we want to make +predictions. The dev set is a subset of the training data we use to +check how well we are doing out-of-sample, after training the model on +the training dataset. We use the validation error as a proxy for the +test error in order to make tweaks to our model. It is crucial that we +do not use any of the test data to train the algorithm. This is a +cardinal sin in ML. Then:

    +
      +
    • Estimate optimal error rate

    • +
    • Minimize underfitting (bias) on training data set.

    • +
    • Make sure you are not overfitting.

    • +
    +

    If the validation and test sets are drawn from the same distributions, +then a good performance on the validation set should lead to similarly +good performance on the test set.

    +

    However, sometimes +the training data and test data differ in subtle ways because, for +example, they are collected using slightly different methods, or +because it is cheaper to collect data in one way versus another. In +this case, there can be a mismatch between the training and test +data. This can lead to the neural network overfitting these small +differences between the test and training sets, and a poor performance +on the test set despite having a good performance on the validation +set. To rectify this, Andrew Ng suggests making two validation or dev +sets, one constructed from the training data and one constructed from +the test data. The difference between the performance of the algorithm +on these two validation sets quantifies the train-test mismatch. This +can serve as another important diagnostic when using DNNs for +supervised learning.

    +
    +
    +

    Limitations of supervised learning with deep networks

    +

    Like all statistical methods, supervised learning using neural +networks has important limitations. This is especially important when +one seeks to apply these methods, especially to physics problems. Like +all tools, DNNs are not a universal solution. Often, the same or +better performance on a task can be achieved by using a few +hand-engineered features (or even a collection of random +features).

    +

    Here we list some of the important limitations of supervised neural network based models.

    +
      +
    • Need labeled data. All supervised learning methods, DNNs for supervised learning require labeled data. Often, labeled data is harder to acquire than unlabeled data (e.g. one must pay for human experts to label images).

    • +
    • Supervised neural networks are extremely data intensive. DNNs are data hungry. They perform best when data is plentiful. This is doubly so for supervised methods where the data must also be labeled. The utility of DNNs is extremely limited if data is hard to acquire or the datasets are small (hundreds to a few thousand samples). In this case, the performance of other methods that utilize hand-engineered features can exceed that of DNNs.

    • +
    • Homogeneous data. Almost all DNNs deal with homogeneous data of one type. It is very hard to design architectures that mix and match data types (i.e. some continuous variables, some discrete variables, some time series). In applications beyond images, video, and language, this is often what is required. In contrast, ensemble models like random forests or gradient-boosted trees have no difficulty handling mixed data types.

    • +
    • Many problems are not about prediction. In natural science we are often interested in learning something about the underlying distribution that generates the data. In this case, it is often difficult to cast these ideas in a supervised learning setting. While the problems are related, it is possible to make good predictions with a wrong model. The model might or might not be useful for understanding the underlying science.

    • +
    +

    Some of these remarks are particular to DNNs, others are shared by all supervised learning methods. This motivates the use of unsupervised methods which in part circumvent these problems.

    +
    +
    +

    Solving ODEs with Deep Learning

    +

    The Universal Approximation Theorem states that a neural network can +approximate any function at a single hidden layer along with one input +and output layer to any given precision.

    +

    Book on solving differential equations with ML methods.

    +

    An Introduction to Neural Network Methods for Differential Equations, by Yadav and Kumar.

    +

    Master thesis on applying deep learning to problems in mechanics.

    +

    Using Deep Reinforcement Learning for Active Flow Control, by Marius Holm

    +

    Thanks to Kristine Baluka Hein.

    +

    The lectures on differential equations were developed by Kristine Baluka Hein, now PhD student at IFI. +A great thanks to Kristine.

    +
    +
    +

    Ordinary Differential Equations

    +

    An ordinary differential equation (ODE) is an equation involving functions having one variable.

    +

    In general, an ordinary differential equation looks like

    + +
    +
    +\[ +\begin{equation} \label{ode} \tag{1} +f\left(x, \, g(x), \, g'(x), \, g''(x), \, \dots \, , \, g^{(n)}(x)\right) = 0 +\end{equation} +\]
    +

    where \(g(x)\) is the function to find, and \(g^{(n)}(x)\) is the \(n\)-th derivative of \(g(x)\).

    +

    The \(f\left(x, g(x), g'(x), g''(x), \, \dots \, , g^{(n)}(x)\right)\) is just a way to write that there is an expression involving \(x\) and \(g(x), \ g'(x), \ g''(x), \, \dots \, , \text{ and } g^{(n)}(x)\) on the left side of the equality sign in (1). +The highest order of derivative, that is the value of \(n\), determines to the order of the equation. +The equation is referred to as a \(n\)-th order ODE. +Along with (1), some additional conditions of the function \(g(x)\) are typically given +for the solution to be unique.

    +
    +
    +

    The trial solution

    +

    Let the trial solution \(g_t(x)\) be

    + +
    +
    +\[ +\begin{equation} + g_t(x) = h_1(x) + h_2(x,N(x,P)) +\label{_auto1} \tag{2} +\end{equation} +\]
    +

    where \(h_1(x)\) is a function that makes \(g_t(x)\) satisfy a given set +of conditions, \(N(x,P)\) a neural network with weights and biases +described by \(P\) and \(h_2(x, N(x,P))\) some expression involving the +neural network. The role of the function \(h_2(x, N(x,P))\), is to +ensure that the output from \(N(x,P)\) is zero when \(g_t(x)\) is +evaluated at the values of \(x\) where the given conditions must be +satisfied. The function \(h_1(x)\) should alone make \(g_t(x)\) satisfy +the conditions.

    +

    But what about the network \(N(x,P)\)?

    +

    As described previously, an optimization method could be used to minimize the parameters of a neural network, that being its weights and biases, through backward propagation.

    +
    +
    +

    Minimization process

    +

    For the minimization to be defined, we need to have a cost function at hand to minimize.

    +

    It is given that \(f\left(x, \, g(x), \, g'(x), \, g''(x), \, \dots \, , \, g^{(n)}(x)\right)\) should be equal to zero in (1). +We can choose to consider the mean squared error as the cost function for an input \(x\). +Since we are looking at one input, the cost function is just \(f\) squared. +The cost function \(c\left(x, P \right)\) can therefore be expressed as

    +
    +\[ +C\left(x, P\right) = \big(f\left(x, \, g(x), \, g'(x), \, g''(x), \, \dots \, , \, g^{(n)}(x)\right)\big)^2 +\]
    +

    If \(N\) inputs are given as a vector \(\boldsymbol{x}\) with elements \(x_i\) for \(i = 1,\dots,N\), +the cost function becomes

    + +
    +
    +\[ +\begin{equation} \label{cost} \tag{3} + C\left(\boldsymbol{x}, P\right) = \frac{1}{N} \sum_{i=1}^N \big(f\left(x_i, \, g(x_i), \, g'(x_i), \, g''(x_i), \, \dots \, , \, g^{(n)}(x_i)\right)\big)^2 +\end{equation} +\]
    +

    The neural net should then find the parameters \(P\) that minimizes the cost function in +(3) for a set of \(N\) training samples \(x_i\).

    +
    +
    +

    Minimizing the cost function using gradient descent and automatic differentiation

    +

    To perform the minimization using gradient descent, the gradient of \(C\left(\boldsymbol{x}, P\right)\) is needed. +It might happen so that finding an analytical expression of the gradient of \(C(\boldsymbol{x}, P)\) from (3) gets too messy, depending on which cost function one desires to use.

    +

    Luckily, there exists libraries that makes the job for us through automatic differentiation. +Automatic differentiation is a method of finding the derivatives numerically with very high precision.

    +
    +
    +

    Example: Exponential decay

    +

    An exponential decay of a quantity \(g(x)\) is described by the equation

    + +
    +
    +\[ +\begin{equation} \label{solve_expdec} \tag{4} + g'(x) = -\gamma g(x) +\end{equation} +\]
    +

    with \(g(0) = g_0\) for some chosen initial value \(g_0\).

    +

    The analytical solution of (4) is

    + +
    +
    +\[ +\begin{equation} + g(x) = g_0 \exp\left(-\gamma x\right) +\label{_auto2} \tag{5} +\end{equation} +\]
    +

    Having an analytical solution at hand, it is possible to use it to compare how well a neural network finds a solution of (4).

    +
    +
    +

    The function to solve for

    +

    The program will use a neural network to solve

    + +
    +
    +\[ +\begin{equation} \label{solveode} \tag{6} +g'(x) = -\gamma g(x) +\end{equation} +\]
    +

    where \(g(0) = g_0\) with \(\gamma\) and \(g_0\) being some chosen values.

    +

    In this example, \(\gamma = 2\) and \(g_0 = 10\).

    +
    +
    +

    The trial solution

    +

    To begin with, a trial solution \(g_t(t)\) must be chosen. A general trial solution for ordinary differential equations could be

    +
    +\[ +g_t(x, P) = h_1(x) + h_2(x, N(x, P)) +\]
    +

    with \(h_1(x)\) ensuring that \(g_t(x)\) satisfies some conditions and \(h_2(x,N(x, P))\) an expression involving \(x\) and the output from the neural network \(N(x,P)\) with \(P \) being the collection of the weights and biases for each layer. For now, it is assumed that the network consists of one input layer, one hidden layer, and one output layer.

    +
    +
    +

    Setup of Network

    +

    In this network, there are no weights and bias at the input layer, so \(P = \{ P_{\text{hidden}}, P_{\text{output}} \}\). +If there are \(N_{\text{hidden} }\) neurons in the hidden layer, then \(P_{\text{hidden}}\) is a \(N_{\text{hidden} } \times (1 + N_{\text{input}})\) matrix, given that there are \(N_{\text{input}}\) neurons in the input layer.

    +

    The first column in \(P_{\text{hidden} }\) represents the bias for each neuron in the hidden layer and the second column represents the weights for each neuron in the hidden layer from the input layer. +If there are \(N_{\text{output} }\) neurons in the output layer, then \(P_{\text{output}} \) is a \(N_{\text{output} } \times (1 + N_{\text{hidden} })\) matrix.

    +

    Its first column represents the bias of each neuron and the remaining columns represents the weights to each neuron.

    +

    It is given that \(g(0) = g_0\). The trial solution must fulfill this condition to be a proper solution of (6). A possible way to ensure that \(g_t(0, P) = g_0\), is to let \(F(N(x,P)) = x \cdot N(x,P)\) and \(A(x) = g_0\). This gives the following trial solution:

    + +
    +
    +\[ +\begin{equation} \label{trial} \tag{7} +g_t(x, P) = g_0 + x \cdot N(x, P) +\end{equation} +\]
    +
    +
    +

    Reformulating the problem

    +

    We wish that our neural network manages to minimize a given cost function.

    +

    A reformulation of out equation, (6), must therefore be done, +such that it describes the problem a neural network can solve for.

    +

    The neural network must find the set of weights and biases \(P\) such that the trial solution in (7) satisfies (6).

    +

    The trial solution

    +
    +\[ +g_t(x, P) = g_0 + x \cdot N(x, P) +\]
    +

    has been chosen such that it already solves the condition \(g(0) = g_0\). What remains, is to find \(P\) such that

    + +
    +
    +\[ +\begin{equation} \label{nnmin} \tag{8} +g_t'(x, P) = - \gamma g_t(x, P) +\end{equation} +\]
    +

    is fulfilled as best as possible.

    +
    +
    +

    More technicalities

    +

    The left hand side and right hand side of (8) must be computed separately, and then the neural network must choose weights and biases, contained in \(P\), such that the sides are equal as best as possible. +This means that the absolute or squared difference between the sides must be as close to zero, ideally equal to zero. +In this case, the difference squared shows to be an appropriate measurement of how erroneous the trial solution is with respect to \(P\) of the neural network.

    +

    This gives the following cost function our neural network must solve for:

    +
    +\[ +\min_{P}\Big\{ \big(g_t'(x, P) - ( -\gamma g_t(x, P) \big)^2 \Big\} +\]
    +

    (the notation \(\min_{P}\{ f(x, P) \}\) means that we desire to find \(P\) that yields the minimum of \(f(x, P)\))

    +

    or, in terms of weights and biases for the hidden and output layer in our network:

    +
    +\[ +\min_{P_{\text{hidden} }, \ P_{\text{output} }}\Big\{ \big(g_t'(x, \{ P_{\text{hidden} }, P_{\text{output} }\}) - ( -\gamma g_t(x, \{ P_{\text{hidden} }, P_{\text{output} }\}) \big)^2 \Big\} +\]
    +

    for an input value \(x\).

    +
    +
    +

    More details

    +

    If the neural network evaluates \(g_t(x, P)\) at more values for \(x\), say \(N\) values \(x_i\) for \(i = 1, \dots, N\), then the total error to minimize becomes

    + +
    +
    +\[ +\begin{equation} \label{min} \tag{9} +\min_{P}\Big\{\frac{1}{N} \sum_{i=1}^N \big(g_t'(x_i, P) - ( -\gamma g_t(x_i, P) \big)^2 \Big\} +\end{equation} +\]
    +

    Letting \(\boldsymbol{x}\) be a vector with elements \(x_i\) and \(C(\boldsymbol{x}, P) = \frac{1}{N} \sum_i \big(g_t'(x_i, P) - ( -\gamma g_t(x_i, P) \big)^2\) denote the cost function, the minimization problem that our network must solve, becomes

    +
    +\[ +\min_{P} C(\boldsymbol{x}, P) +\]
    +

    In terms of \(P_{\text{hidden} }\) and \(P_{\text{output} }\), this could also be expressed as

    +
    +\[ +\min_{P_{\text{hidden} }, \ P_{\text{output} }} C(\boldsymbol{x}, \{P_{\text{hidden} }, P_{\text{output} }\}) +\]
    +
    +
    +

    A possible implementation of a neural network

    +

    For simplicity, it is assumed that the input is an array \(\boldsymbol{x} = (x_1, \dots, x_N)\) with \(N\) elements. It is at these points the neural network should find \(P\) such that it fulfills (9).

    +

    First, the neural network must feed forward the inputs. +This means that \(\boldsymbol{x}s\) must be passed through an input layer, a hidden layer and a output layer. The input layer in this case, does not need to process the data any further. +The input layer will consist of \(N_{\text{input} }\) neurons, passing its element to each neuron in the hidden layer. The number of neurons in the hidden layer will be \(N_{\text{hidden} }\).

    +
    +
    +

    Technicalities

    +

    For the \(i\)-th in the hidden layer with weight \(w_i^{\text{hidden} }\) and bias \(b_i^{\text{hidden} }\), the weighting from the \(j\)-th neuron at the input layer is:

    +
    +\[\begin{split} +\begin{aligned} +z_{i,j}^{\text{hidden}} &= b_i^{\text{hidden}} + w_i^{\text{hidden}}x_j \\ +&= +\begin{pmatrix} +b_i^{\text{hidden}} & w_i^{\text{hidden}} +\end{pmatrix} +\begin{pmatrix} +1 \\ +x_j +\end{pmatrix} +\end{aligned} +\end{split}\]
    +
    +
    +

    Final technicalities I

    +

    The result after weighting the inputs at the \(i\)-th hidden neuron can be written as a vector:

    +
    +\[\begin{split} +\begin{aligned} +\boldsymbol{z}_{i}^{\text{hidden}} &= \Big( b_i^{\text{hidden}} + w_i^{\text{hidden}}x_1 , \ b_i^{\text{hidden}} + w_i^{\text{hidden}} x_2, \ \dots \, , \ b_i^{\text{hidden}} + w_i^{\text{hidden}} x_N\Big) \\ +&= +\begin{pmatrix} + b_i^{\text{hidden}} & w_i^{\text{hidden}} +\end{pmatrix} +\begin{pmatrix} +1 & 1 & \dots & 1 \\ +x_1 & x_2 & \dots & x_N +\end{pmatrix} \\ +&= \boldsymbol{p}_{i, \text{hidden}}^T X +\end{aligned} +\end{split}\]
    +
    +
    +

    Final technicalities II

    +

    The vector \(\boldsymbol{p}_{i, \text{hidden}}^T\) constitutes each row in \(P_{\text{hidden} }\), which contains the weights for the neural network to minimize according to (9).

    +

    After having found \(\boldsymbol{z}_{i}^{\text{hidden}} \) for every \(i\)-th neuron within the hidden layer, the vector will be sent to an activation function \(a_i(\boldsymbol{z})\).

    +

    In this example, the sigmoid function has been chosen to be the activation function for each hidden neuron:

    +
    +\[ +f(z) = \frac{1}{1 + \exp{(-z)}} +\]
    +

    It is possible to use other activations functions for the hidden layer also.

    +

    The output \(\boldsymbol{x}_i^{\text{hidden}}\) from each \(i\)-th hidden neuron is:

    +
    +\[ +\boldsymbol{x}_i^{\text{hidden} } = f\big( \boldsymbol{z}_{i}^{\text{hidden}} \big) +\]
    +

    The outputs \(\boldsymbol{x}_i^{\text{hidden} } \) are then sent to the output layer.

    +

    The output layer consists of one neuron in this case, and combines the +output from each of the neurons in the hidden layers. The output layer +combines the results from the hidden layer using some weights \(w_i^{\text{output}}\) +and biases \(b_i^{\text{output}}\). In this case, +it is assumes that the number of neurons in the output layer is one.

    +
    +
    +

    Final technicalities III

    +

    The procedure of weighting the output neuron \(j\) in the hidden layer to the \(i\)-th neuron in the output layer is similar as for the hidden layer described previously.

    +
    +\[\begin{split} +\begin{aligned} +z_{1,j}^{\text{output}} & = +\begin{pmatrix} +b_1^{\text{output}} & \boldsymbol{w}_1^{\text{output}} +\end{pmatrix} +\begin{pmatrix} +1 \\ +\boldsymbol{x}_j^{\text{hidden}} +\end{pmatrix} +\end{aligned} +\end{split}\]
    +
    +
    +

    Final technicalities IV

    +

    Expressing \(z_{1,j}^{\text{output}}\) as a vector gives the following way of weighting the inputs from the hidden layer:

    +
    +\[\begin{split} +\boldsymbol{z}_{1}^{\text{output}} = +\begin{pmatrix} +b_1^{\text{output}} & \boldsymbol{w}_1^{\text{output}} +\end{pmatrix} +\begin{pmatrix} +1 & 1 & \dots & 1 \\ +\boldsymbol{x}_1^{\text{hidden}} & \boldsymbol{x}_2^{\text{hidden}} & \dots & \boldsymbol{x}_N^{\text{hidden}} +\end{pmatrix} +\end{split}\]
    +

    In this case we seek a continuous range of values since we are approximating a function. This means that after computing \(\boldsymbol{z}_{1}^{\text{output}}\) the neural network has finished its feed forward step, and \(\boldsymbol{z}_{1}^{\text{output}}\) is the final output of the network.

    +
    +
    +

    Back propagation

    +

    The next step is to decide how the parameters should be changed such that they minimize the cost function.

    +

    The chosen cost function for this problem is

    +
    +\[ +C(\boldsymbol{x}, P) = \frac{1}{N} \sum_i \big(g_t'(x_i, P) - ( -\gamma g_t(x_i, P) \big)^2 +\]
    +

    In order to minimize the cost function, an optimization method must be chosen.

    +

    Here, gradient descent with a constant step size has been chosen.

    +
    +
    +

    Gradient descent

    +

    The idea of the gradient descent algorithm is to update parameters in +a direction where the cost function decreases goes to a minimum.

    +

    In general, the update of some parameters \(\boldsymbol{\omega}\) given a cost +function defined by some weights \(\boldsymbol{\omega}\), \(C(\boldsymbol{x}, +\boldsymbol{\omega})\), goes as follows:

    +
    +\[ +\boldsymbol{\omega}_{\text{new} } = \boldsymbol{\omega} - \lambda \nabla_{\boldsymbol{\omega}} C(\boldsymbol{x}, \boldsymbol{\omega}) +\]
    +

    for a number of iterations or until \( \big|\big| \boldsymbol{\omega}_{\text{new} } - \boldsymbol{\omega} \big|\big|\) becomes smaller than some given tolerance.

    +

    The value of \(\lambda\) decides how large steps the algorithm must take +in the direction of \( \nabla_{\boldsymbol{\omega}} C(\boldsymbol{x}, \boldsymbol{\omega})\). +The notation \(\nabla_{\boldsymbol{\omega}}\) express the gradient with respect +to the elements in \(\boldsymbol{\omega}\).

    +

    In our case, we have to minimize the cost function \(C(\boldsymbol{x}, P)\) with +respect to the two sets of weights and biases, that is for the hidden +layer \(P_{\text{hidden} }\) and for the output layer \(P_{\text{output} +}\) .

    +

    This means that \(P_{\text{hidden} }\) and \(P_{\text{output} }\) is updated by

    +
    +\[\begin{split} +\begin{aligned} +P_{\text{hidden},\text{new}} &= P_{\text{hidden}} - \lambda \nabla_{P_{\text{hidden}}} C(\boldsymbol{x}, P) \\ +P_{\text{output},\text{new}} &= P_{\text{output}} - \lambda \nabla_{P_{\text{output}}} C(\boldsymbol{x}, P) +\end{aligned} +\end{split}\]
    +
    +
    +

    The code for solving the ODE

    +
    +
    +
    import autograd.numpy as np
    +from autograd import grad, elementwise_grad
    +import autograd.numpy.random as npr
    +from matplotlib import pyplot as plt
    +
    +def sigmoid(z):
    +    return 1/(1 + np.exp(-z))
    +
    +# Assuming one input, hidden, and output layer
    +def neural_network(params, x):
    +
    +    # Find the weights (including and biases) for the hidden and output layer.
    +    # Assume that params is a list of parameters for each layer.
    +    # The biases are the first element for each array in params,
    +    # and the weights are the remaning elements in each array in params.
    +
    +    w_hidden = params[0]
    +    w_output = params[1]
    +
    +    # Assumes input x being an one-dimensional array
    +    num_values = np.size(x)
    +    x = x.reshape(-1, num_values)
    +
    +    # Assume that the input layer does nothing to the input x
    +    x_input = x
    +
    +    ## Hidden layer:
    +
    +    # Add a row of ones to include bias
    +    x_input = np.concatenate((np.ones((1,num_values)), x_input ), axis = 0)
    +
    +    z_hidden = np.matmul(w_hidden, x_input)
    +    x_hidden = sigmoid(z_hidden)
    +
    +    ## Output layer:
    +
    +    # Include bias:
    +    x_hidden = np.concatenate((np.ones((1,num_values)), x_hidden ), axis = 0)
    +
    +    z_output = np.matmul(w_output, x_hidden)
    +    x_output = z_output
    +
    +    return x_output
    +
    +# The trial solution using the deep neural network:
    +def g_trial(x,params, g0 = 10):
    +    return g0 + x*neural_network(params,x)
    +
    +# The right side of the ODE:
    +def g(x, g_trial, gamma = 2):
    +    return -gamma*g_trial
    +
    +# The cost function:
    +def cost_function(P, x):
    +
    +    # Evaluate the trial function with the current parameters P
    +    g_t = g_trial(x,P)
    +
    +    # Find the derivative w.r.t x of the neural network
    +    d_net_out = elementwise_grad(neural_network,1)(P,x)
    +
    +    # Find the derivative w.r.t x of the trial function
    +    d_g_t = elementwise_grad(g_trial,0)(x,P)
    +
    +    # The right side of the ODE
    +    func = g(x, g_t)
    +
    +    err_sqr = (d_g_t - func)**2
    +    cost_sum = np.sum(err_sqr)
    +
    +    return cost_sum / np.size(err_sqr)
    +
    +# Solve the exponential decay ODE using neural network with one input, hidden, and output layer
    +def solve_ode_neural_network(x, num_neurons_hidden, num_iter, lmb):
    +    ## Set up initial weights and biases
    +
    +    # For the hidden layer
    +    p0 = npr.randn(num_neurons_hidden, 2 )
    +
    +    # For the output layer
    +    p1 = npr.randn(1, num_neurons_hidden + 1 ) # +1 since bias is included
    +
    +    P = [p0, p1]
    +
    +    print('Initial cost: %g'%cost_function(P, x))
    +
    +    ## Start finding the optimal weights using gradient descent
    +
    +    # Find the Python function that represents the gradient of the cost function
    +    # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer
    +    cost_function_grad = grad(cost_function,0)
    +
    +    # Let the update be done num_iter times
    +    for i in range(num_iter):
    +        # Evaluate the gradient at the current weights and biases in P.
    +        # The cost_grad consist now of two arrays;
    +        # one for the gradient w.r.t P_hidden and
    +        # one for the gradient w.r.t P_output
    +        cost_grad =  cost_function_grad(P, x)
    +
    +        P[0] = P[0] - lmb * cost_grad[0]
    +        P[1] = P[1] - lmb * cost_grad[1]
    +
    +    print('Final cost: %g'%cost_function(P, x))
    +
    +    return P
    +
    +def g_analytic(x, gamma = 2, g0 = 10):
    +    return g0*np.exp(-gamma*x)
    +
    +# Solve the given problem
    +if __name__ == '__main__':
    +    # Set seed such that the weight are initialized
    +    # with same weights and biases for every run.
    +    npr.seed(15)
    +
    +    ## Decide the vales of arguments to the function to solve
    +    N = 10
    +    x = np.linspace(0, 1, N)
    +
    +    ## Set up the initial parameters
    +    num_hidden_neurons = 10
    +    num_iter = 10000
    +    lmb = 0.001
    +
    +    # Use the network
    +    P = solve_ode_neural_network(x, num_hidden_neurons, num_iter, lmb)
    +
    +    # Print the deviation from the trial solution and true solution
    +    res = g_trial(x,P)
    +    res_analytical = g_analytic(x)
    +
    +    print('Max absolute difference: %g'%np.max(np.abs(res - res_analytical)))
    +
    +    # Plot the results
    +    plt.figure(figsize=(10,10))
    +
    +    plt.title('Performance of neural network solving an ODE compared to the analytical solution')
    +    plt.plot(x, res_analytical)
    +    plt.plot(x, res[0,:])
    +    plt.legend(['analytical','nn'])
    +    plt.xlabel('x')
    +    plt.ylabel('g(x)')
    +    plt.show()
    +
    +
    +
    +
    +
    +
    +

    The network with one input layer, specified number of hidden layers, and one output layer

    +

    It is also possible to extend the construction of our network into a more general one, allowing the network to contain more than one hidden layers.

    +

    The number of neurons within each hidden layer are given as a list of integers in the program below.

    +
    +
    +
    import autograd.numpy as np
    +from autograd import grad, elementwise_grad
    +import autograd.numpy.random as npr
    +from matplotlib import pyplot as plt
    +
    +def sigmoid(z):
    +    return 1/(1 + np.exp(-z))
    +
    +# The neural network with one input layer and one output layer,
    +# but with number of hidden layers specified by the user.
    +def deep_neural_network(deep_params, x):
    +    # N_hidden is the number of hidden layers
    +
    +    N_hidden = np.size(deep_params) - 1 # -1 since params consists of
    +                                        # parameters to all the hidden
    +                                        # layers AND the output layer.
    +
    +    # Assumes input x being an one-dimensional array
    +    num_values = np.size(x)
    +    x = x.reshape(-1, num_values)
    +
    +    # Assume that the input layer does nothing to the input x
    +    x_input = x
    +
    +    # Due to multiple hidden layers, define a variable referencing to the
    +    # output of the previous layer:
    +    x_prev = x_input
    +
    +    ## Hidden layers:
    +
    +    for l in range(N_hidden):
    +        # From the list of parameters P; find the correct weigths and bias for this layer
    +        w_hidden = deep_params[l]
    +
    +        # Add a row of ones to include bias
    +        x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0)
    +
    +        z_hidden = np.matmul(w_hidden, x_prev)
    +        x_hidden = sigmoid(z_hidden)
    +
    +        # Update x_prev such that next layer can use the output from this layer
    +        x_prev = x_hidden
    +
    +    ## Output layer:
    +
    +    # Get the weights and bias for this layer
    +    w_output = deep_params[-1]
    +
    +    # Include bias:
    +    x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0)
    +
    +    z_output = np.matmul(w_output, x_prev)
    +    x_output = z_output
    +
    +    return x_output
    +
    +# The trial solution using the deep neural network:
    +def g_trial_deep(x,params, g0 = 10):
    +    return g0 + x*deep_neural_network(params, x)
    +
    +# The right side of the ODE:
    +def g(x, g_trial, gamma = 2):
    +    return -gamma*g_trial
    +
    +# The same cost function as before, but calls deep_neural_network instead.
    +def cost_function_deep(P, x):
    +
    +    # Evaluate the trial function with the current parameters P
    +    g_t = g_trial_deep(x,P)
    +
    +    # Find the derivative w.r.t x of the neural network
    +    d_net_out = elementwise_grad(deep_neural_network,1)(P,x)
    +
    +    # Find the derivative w.r.t x of the trial function
    +    d_g_t = elementwise_grad(g_trial_deep,0)(x,P)
    +
    +    # The right side of the ODE
    +    func = g(x, g_t)
    +
    +    err_sqr = (d_g_t - func)**2
    +    cost_sum = np.sum(err_sqr)
    +
    +    return cost_sum / np.size(err_sqr)
    +
    +# Solve the exponential decay ODE using neural network with one input and one output layer,
    +# but with specified number of hidden layers from the user.
    +def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb):
    +    # num_hidden_neurons is now a list of number of neurons within each hidden layer
    +
    +    # The number of elements in the list num_hidden_neurons thus represents
    +    # the number of hidden layers.
    +
    +    # Find the number of hidden layers:
    +    N_hidden = np.size(num_neurons)
    +
    +    ## Set up initial weights and biases
    +
    +    # Initialize the list of parameters:
    +    P = [None]*(N_hidden + 1) # + 1 to include the output layer
    +
    +    P[0] = npr.randn(num_neurons[0], 2 )
    +    for l in range(1,N_hidden):
    +        P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias
    +
    +    # For the output layer
    +    P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included
    +
    +    print('Initial cost: %g'%cost_function_deep(P, x))
    +
    +    ## Start finding the optimal weights using gradient descent
    +
    +    # Find the Python function that represents the gradient of the cost function
    +    # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer
    +    cost_function_deep_grad = grad(cost_function_deep,0)
    +
    +    # Let the update be done num_iter times
    +    for i in range(num_iter):
    +        # Evaluate the gradient at the current weights and biases in P.
    +        # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases
    +        # in the hidden layers and output layers evaluated at x.
    +        cost_deep_grad =  cost_function_deep_grad(P, x)
    +
    +        for l in range(N_hidden+1):
    +            P[l] = P[l] - lmb * cost_deep_grad[l]
    +
    +    print('Final cost: %g'%cost_function_deep(P, x))
    +
    +    return P
    +
    +def g_analytic(x, gamma = 2, g0 = 10):
    +    return g0*np.exp(-gamma*x)
    +
    +# Solve the given problem
    +if __name__ == '__main__':
    +    npr.seed(15)
    +
    +    ## Decide the vales of arguments to the function to solve
    +    N = 10
    +    x = np.linspace(0, 1, N)
    +
    +    ## Set up the initial parameters
    +    num_hidden_neurons = np.array([10,10])
    +    num_iter = 10000
    +    lmb = 0.001
    +
    +    P = solve_ode_deep_neural_network(x, num_hidden_neurons, num_iter, lmb)
    +
    +    res = g_trial_deep(x,P)
    +    res_analytical = g_analytic(x)
    +
    +    plt.figure(figsize=(10,10))
    +
    +    plt.title('Performance of a deep neural network solving an ODE compared to the analytical solution')
    +    plt.plot(x, res_analytical)
    +    plt.plot(x, res[0,:])
    +    plt.legend(['analytical','dnn'])
    +    plt.ylabel('g(x)')
    +    plt.show()
    +
    +
    +
    +
    +
    +
    +

    Example: Population growth

    +

    A logistic model of population growth assumes that a population converges toward an equilibrium. +The population growth can be modeled by

    + +
    +
    +\[ +\begin{equation} \label{log} \tag{10} + g'(t) = \alpha g(t)(A - g(t)) +\end{equation} +\]
    +

    where \(g(t)\) is the population density at time \(t\), \(\alpha > 0\) the growth rate and \(A > 0\) is the maximum population number in the environment. +Also, at \(t = 0\) the population has the size \(g(0) = g_0\), where \(g_0\) is some chosen constant.

    +

    In this example, similar network as for the exponential decay using Autograd has been used to solve the equation. However, as the implementation might suffer from e.g numerical instability +and high execution time (this might be more apparent in the examples solving PDEs), +using a library like TensorFlow is recommended. +Here, we stay with a more simple approach and implement for comparison, the simple forward Euler method.

    +
    +
    +

    Setting up the problem

    +

    Here, we will model a population \(g(t)\) in an environment having carrying capacity \(A\). +The population follows the model

    + +
    +
    +\[ +\begin{equation} \label{solveode_population} \tag{11} +g'(t) = \alpha g(t)(A - g(t)) +\end{equation} +\]
    +

    where \(g(0) = g_0\).

    +

    In this example, we let \(\alpha = 2\), \(A = 1\), and \(g_0 = 1.2\).

    +
    +
    +

    The trial solution

    +

    We will get a slightly different trial solution, as the boundary conditions are different +compared to the case for exponential decay.

    +

    A possible trial solution satisfying the condition \(g(0) = g_0\) could be

    +
    +\[ +h_1(t) = g_0 + t \cdot N(t,P) +\]
    +

    with \(N(t,P)\) being the output from the neural network with weights and biases for each layer collected in the set \(P\).

    +

    The analytical solution is

    +
    +\[ +g(t) = \frac{Ag_0}{g_0 + (A - g_0)\exp(-\alpha A t)} +\]
    +
    +
    +

    The program using Autograd

    +

    The network will be the similar as for the exponential decay example, but with some small modifications for our problem.

    +
    +
    +
    import autograd.numpy as np
    +from autograd import grad, elementwise_grad
    +import autograd.numpy.random as npr
    +from matplotlib import pyplot as plt
    +
    +def sigmoid(z):
    +    return 1/(1 + np.exp(-z))
    +
    +# Function to get the parameters.
    +# Done such that one can easily change the paramaters after one's liking.
    +def get_parameters():
    +    alpha = 2
    +    A = 1
    +    g0 = 1.2
    +    return alpha, A, g0
    +
    +def deep_neural_network(P, x):
    +    # N_hidden is the number of hidden layers
    +    N_hidden = np.size(P) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer
    +
    +    # Assumes input x being an one-dimensional array
    +    num_values = np.size(x)
    +    x = x.reshape(-1, num_values)
    +
    +    # Assume that the input layer does nothing to the input x
    +    x_input = x
    +
    +    # Due to multiple hidden layers, define a variable referencing to the
    +    # output of the previous layer:
    +    x_prev = x_input
    +
    +    ## Hidden layers:
    +
    +    for l in range(N_hidden):
    +        # From the list of parameters P; find the correct weigths and bias for this layer
    +        w_hidden = P[l]
    +
    +        # Add a row of ones to include bias
    +        x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0)
    +
    +        z_hidden = np.matmul(w_hidden, x_prev)
    +        x_hidden = sigmoid(z_hidden)
    +
    +        # Update x_prev such that next layer can use the output from this layer
    +        x_prev = x_hidden
    +
    +    ## Output layer:
    +
    +    # Get the weights and bias for this layer
    +    w_output = P[-1]
    +
    +    # Include bias:
    +    x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0)
    +
    +    z_output = np.matmul(w_output, x_prev)
    +    x_output = z_output
    +
    +    return x_output
    +
    +
    +def cost_function_deep(P, x):
    +
    +    # Evaluate the trial function with the current parameters P
    +    g_t = g_trial_deep(x,P)
    +
    +    # Find the derivative w.r.t x of the trial function
    +    d_g_t = elementwise_grad(g_trial_deep,0)(x,P)
    +
    +    # The right side of the ODE
    +    func = f(x, g_t)
    +
    +    err_sqr = (d_g_t - func)**2
    +    cost_sum = np.sum(err_sqr)
    +
    +    return cost_sum / np.size(err_sqr)
    +
    +# The right side of the ODE:
    +def f(x, g_trial):
    +    alpha,A, g0 = get_parameters()
    +    return alpha*g_trial*(A - g_trial)
    +
    +# The trial solution using the deep neural network:
    +def g_trial_deep(x, params):
    +    alpha,A, g0 = get_parameters()
    +    return g0 + x*deep_neural_network(params,x)
    +
    +# The analytical solution:
    +def g_analytic(t):
    +    alpha,A, g0 = get_parameters()
    +    return A*g0/(g0 + (A - g0)*np.exp(-alpha*A*t))
    +
    +def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb):
    +    # num_hidden_neurons is now a list of number of neurons within each hidden layer
    +
    +    # Find the number of hidden layers:
    +    N_hidden = np.size(num_neurons)
    +
    +    ## Set up initial weigths and biases
    +
    +    # Initialize the list of parameters:
    +    P = [None]*(N_hidden + 1) # + 1 to include the output layer
    +
    +    P[0] = npr.randn(num_neurons[0], 2 )
    +    for l in range(1,N_hidden):
    +        P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias
    +
    +    # For the output layer
    +    P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included
    +
    +    print('Initial cost: %g'%cost_function_deep(P, x))
    +
    +    ## Start finding the optimal weigths using gradient descent
    +
    +    # Find the Python function that represents the gradient of the cost function
    +    # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer
    +    cost_function_deep_grad = grad(cost_function_deep,0)
    +
    +    # Let the update be done num_iter times
    +    for i in range(num_iter):
    +        # Evaluate the gradient at the current weights and biases in P.
    +        # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases
    +        # in the hidden layers and output layers evaluated at x.
    +        cost_deep_grad =  cost_function_deep_grad(P, x)
    +
    +        for l in range(N_hidden+1):
    +            P[l] = P[l] - lmb * cost_deep_grad[l]
    +
    +    print('Final cost: %g'%cost_function_deep(P, x))
    +
    +    return P
    +
    +if __name__ == '__main__':
    +    npr.seed(4155)
    +
    +    ## Decide the vales of arguments to the function to solve
    +    Nt = 10
    +    T = 1
    +    t = np.linspace(0,T, Nt)
    +
    +    ## Set up the initial parameters
    +    num_hidden_neurons = [100, 50, 25]
    +    num_iter = 1000
    +    lmb = 1e-3
    +
    +    P = solve_ode_deep_neural_network(t, num_hidden_neurons, num_iter, lmb)
    +
    +    g_dnn_ag = g_trial_deep(t,P)
    +    g_analytical = g_analytic(t)
    +
    +    # Find the maximum absolute difference between the solutons:
    +    diff_ag = np.max(np.abs(g_dnn_ag - g_analytical))
    +    print("The max absolute difference between the solutions is: %g"%diff_ag)
    +
    +    plt.figure(figsize=(10,10))
    +
    +    plt.title('Performance of neural network solving an ODE compared to the analytical solution')
    +    plt.plot(t, g_analytical)
    +    plt.plot(t, g_dnn_ag[0,:])
    +    plt.legend(['analytical','nn'])
    +    plt.xlabel('t')
    +    plt.ylabel('g(t)')
    +
    +    plt.show()
    +
    +
    +
    +
    +
    +
    +

    Using forward Euler to solve the ODE

    +

    A straightforward way of solving an ODE numerically, is to use Euler’s method.

    +

    Euler’s method uses Taylor series to approximate the value at a function \(f\) at a step \(\Delta x\) from \(x\):

    +
    +\[ +f(x + \Delta x) \approx f(x) + \Delta x f'(x) +\]
    +

    In our case, using Euler’s method to approximate the value of \(g\) at a step \(\Delta t\) from \(t\) yields

    +
    +\[\begin{split} +\begin{aligned} + g(t + \Delta t) &\approx g(t) + \Delta t g'(t) \\ + &= g(t) + \Delta t \big(\alpha g(t)(A - g(t))\big) +\end{aligned} +\end{split}\]
    +

    along with the condition that \(g(0) = g_0\).

    +

    Let \(t_i = i \cdot \Delta t\) where \(\Delta t = \frac{T}{N_t-1}\) where \(T\) is the final time our solver must solve for and \(N_t\) the number of values for \(t \in [0, T]\) for \(i = 0, \dots, N_t-1\).

    +

    For \(i \geq 1\), we have that

    +
    +\[\begin{split} +\begin{aligned} +t_i &= i\Delta t \\ +&= (i - 1)\Delta t + \Delta t \\ +&= t_{i-1} + \Delta t +\end{aligned} +\end{split}\]
    +

    Now, if \(g_i = g(t_i)\) then

    + +
    +
    +\[\begin{split} +\begin{equation} + \begin{aligned} + g_i &= g(t_i) \\ + &= g(t_{i-1} + \Delta t) \\ + &\approx g(t_{i-1}) + \Delta t \big(\alpha g(t_{i-1})(A - g(t_{i-1}))\big) \\ + &= g_{i-1} + \Delta t \big(\alpha g_{i-1}(A - g_{i-1})\big) + \end{aligned} +\end{equation} \label{odenum} \tag{12} +\end{split}\]
    +

    for \(i \geq 1\) and \(g_0 = g(t_0) = g(0) = g_0\).

    +

    Equation (12) could be implemented in the following way, +extending the program that uses the network using Autograd:

    +
    +
    +
    # Assume that all function definitions from the example program using Autograd
    +# are located here.
    +
    +if __name__ == '__main__':
    +    npr.seed(4155)
    +
    +    ## Decide the vales of arguments to the function to solve
    +    Nt = 10
    +    T = 1
    +    t = np.linspace(0,T, Nt)
    +
    +    ## Set up the initial parameters
    +    num_hidden_neurons = [100,50,25]
    +    num_iter = 1000
    +    lmb = 1e-3
    +
    +    P = solve_ode_deep_neural_network(t, num_hidden_neurons, num_iter, lmb)
    +
    +    g_dnn_ag = g_trial_deep(t,P)
    +    g_analytical = g_analytic(t)
    +
    +    # Find the maximum absolute difference between the solutons:
    +    diff_ag = np.max(np.abs(g_dnn_ag - g_analytical))
    +    print("The max absolute difference between the solutions is: %g"%diff_ag)
    +
    +    plt.figure(figsize=(10,10))
    +
    +    plt.title('Performance of neural network solving an ODE compared to the analytical solution')
    +    plt.plot(t, g_analytical)
    +    plt.plot(t, g_dnn_ag[0,:])
    +    plt.legend(['analytical','nn'])
    +    plt.xlabel('t')
    +    plt.ylabel('g(t)')
    +
    +    ## Find an approximation to the funtion using forward Euler
    +
    +    alpha, A, g0 = get_parameters()
    +    dt = T/(Nt - 1)
    +
    +    # Perform forward Euler to solve the ODE
    +    g_euler = np.zeros(Nt)
    +    g_euler[0] = g0
    +
    +    for i in range(1,Nt):
    +        g_euler[i] = g_euler[i-1] + dt*(alpha*g_euler[i-1]*(A - g_euler[i-1]))
    +
    +    # Print the errors done by each method
    +    diff1 = np.max(np.abs(g_euler - g_analytical))
    +    diff2 = np.max(np.abs(g_dnn_ag[0,:] - g_analytical))
    +
    +    print('Max absolute difference between Euler method and analytical: %g'%diff1)
    +    print('Max absolute difference between deep neural network and analytical: %g'%diff2)
    +
    +    # Plot results
    +    plt.figure(figsize=(10,10))
    +
    +    plt.plot(t,g_euler)
    +    plt.plot(t,g_analytical)
    +    plt.plot(t,g_dnn_ag[0,:])
    +
    +    plt.legend(['euler','analytical','dnn'])
    +    plt.xlabel('Time t')
    +    plt.ylabel('g(t)')
    +
    +    plt.show()
    +
    +
    +
    +
    +
    +
    +

    Example: Solving the one dimensional Poisson equation

    +

    The Poisson equation for \(g(x)\) in one dimension is

    + +
    +
    +\[ +\begin{equation} \label{poisson} \tag{13} + -g''(x) = f(x) +\end{equation} +\]
    +

    where \(f(x)\) is a given function for \(x \in (0,1)\).

    +

    The conditions that \(g(x)\) is chosen to fulfill, are

    +
    +\[\begin{split} +\begin{align*} + g(0) &= 0 \\ + g(1) &= 0 +\end{align*} +\end{split}\]
    +

    This equation can be solved numerically using programs where e.g Autograd and TensorFlow are used. +The results from the networks can then be compared to the analytical solution. +In addition, it could be interesting to see how a typical method for numerically solving second order ODEs compares to the neural networks.

    +
    +
    +

    The specific equation to solve for

    +

    Here, the function \(g(x)\) to solve for follows the equation

    +
    +\[ +-g''(x) = f(x),\qquad x \in (0,1) +\]
    +

    where \(f(x)\) is a given function, along with the chosen conditions

    + +
    +
    +\[ +\begin{aligned} +g(0) = g(1) = 0 +\end{aligned}\label{cond} \tag{14} +\]
    +

    In this example, we consider the case when \(f(x) = (3x + x^2)\exp(x)\).

    +

    For this case, a possible trial solution satisfying the conditions could be

    +
    +\[ +g_t(x) = x \cdot (1-x) \cdot N(P,x) +\]
    +

    The analytical solution for this problem is

    +
    +\[ +g(x) = x(1 - x)\exp(x) +\]
    +
    +
    +

    Solving the equation using Autograd

    +
    +
    +
    import autograd.numpy as np
    +from autograd import grad, elementwise_grad
    +import autograd.numpy.random as npr
    +from matplotlib import pyplot as plt
    +
    +def sigmoid(z):
    +    return 1/(1 + np.exp(-z))
    +
    +def deep_neural_network(deep_params, x):
    +    # N_hidden is the number of hidden layers
    +    N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer
    +
    +    # Assumes input x being an one-dimensional array
    +    num_values = np.size(x)
    +    x = x.reshape(-1, num_values)
    +
    +    # Assume that the input layer does nothing to the input x
    +    x_input = x
    +
    +    # Due to multiple hidden layers, define a variable referencing to the
    +    # output of the previous layer:
    +    x_prev = x_input
    +
    +    ## Hidden layers:
    +
    +    for l in range(N_hidden):
    +        # From the list of parameters P; find the correct weigths and bias for this layer
    +        w_hidden = deep_params[l]
    +
    +        # Add a row of ones to include bias
    +        x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0)
    +
    +        z_hidden = np.matmul(w_hidden, x_prev)
    +        x_hidden = sigmoid(z_hidden)
    +
    +        # Update x_prev such that next layer can use the output from this layer
    +        x_prev = x_hidden
    +
    +    ## Output layer:
    +
    +    # Get the weights and bias for this layer
    +    w_output = deep_params[-1]
    +
    +    # Include bias:
    +    x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0)
    +
    +    z_output = np.matmul(w_output, x_prev)
    +    x_output = z_output
    +
    +    return x_output
    +
    +def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb):
    +    # num_hidden_neurons is now a list of number of neurons within each hidden layer
    +
    +    # Find the number of hidden layers:
    +    N_hidden = np.size(num_neurons)
    +
    +    ## Set up initial weigths and biases
    +
    +    # Initialize the list of parameters:
    +    P = [None]*(N_hidden + 1) # + 1 to include the output layer
    +
    +    P[0] = npr.randn(num_neurons[0], 2 )
    +    for l in range(1,N_hidden):
    +        P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias
    +
    +    # For the output layer
    +    P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included
    +
    +    print('Initial cost: %g'%cost_function_deep(P, x))
    +
    +    ## Start finding the optimal weigths using gradient descent
    +
    +    # Find the Python function that represents the gradient of the cost function
    +    # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer
    +    cost_function_deep_grad = grad(cost_function_deep,0)
    +
    +    # Let the update be done num_iter times
    +    for i in range(num_iter):
    +        # Evaluate the gradient at the current weights and biases in P.
    +        # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases
    +        # in the hidden layers and output layers evaluated at x.
    +        cost_deep_grad =  cost_function_deep_grad(P, x)
    +
    +        for l in range(N_hidden+1):
    +            P[l] = P[l] - lmb * cost_deep_grad[l]
    +
    +    print('Final cost: %g'%cost_function_deep(P, x))
    +
    +    return P
    +
    +## Set up the cost function specified for this Poisson equation:
    +
    +# The right side of the ODE
    +def f(x):
    +    return (3*x + x**2)*np.exp(x)
    +
    +def cost_function_deep(P, x):
    +
    +    # Evaluate the trial function with the current parameters P
    +    g_t = g_trial_deep(x,P)
    +
    +    # Find the derivative w.r.t x of the trial function
    +    d2_g_t = elementwise_grad(elementwise_grad(g_trial_deep,0))(x,P)
    +
    +    right_side = f(x)
    +
    +    err_sqr = (-d2_g_t - right_side)**2
    +    cost_sum = np.sum(err_sqr)
    +
    +    return cost_sum/np.size(err_sqr)
    +
    +# The trial solution:
    +def g_trial_deep(x,P):
    +    return x*(1-x)*deep_neural_network(P,x)
    +
    +# The analytic solution;
    +def g_analytic(x):
    +    return x*(1-x)*np.exp(x)
    +
    +if __name__ == '__main__':
    +    npr.seed(4155)
    +
    +    ## Decide the vales of arguments to the function to solve
    +    Nx = 10
    +    x = np.linspace(0,1, Nx)
    +
    +    ## Set up the initial parameters
    +    num_hidden_neurons = [200,100]
    +    num_iter = 1000
    +    lmb = 1e-3
    +
    +    P = solve_ode_deep_neural_network(x, num_hidden_neurons, num_iter, lmb)
    +
    +    g_dnn_ag = g_trial_deep(x,P)
    +    g_analytical = g_analytic(x)
    +
    +    # Find the maximum absolute difference between the solutons:
    +    max_diff = np.max(np.abs(g_dnn_ag - g_analytical))
    +    print("The max absolute difference between the solutions is: %g"%max_diff)
    +
    +    plt.figure(figsize=(10,10))
    +
    +    plt.title('Performance of neural network solving an ODE compared to the analytical solution')
    +    plt.plot(x, g_analytical)
    +    plt.plot(x, g_dnn_ag[0,:])
    +    plt.legend(['analytical','nn'])
    +    plt.xlabel('x')
    +    plt.ylabel('g(x)')
    +    plt.show()
    +
    +
    +
    +
    +
    +
    +

    Comparing with a numerical scheme

    +

    The Poisson equation is possible to solve using Taylor series to approximate the second derivative.

    +

    Using Taylor series, the second derivative can be expressed as

    +
    +\[ +g''(x) = \frac{g(x + \Delta x) - 2g(x) + g(x-\Delta x)}{\Delta x^2} + E_{\Delta x}(x) +\]
    +

    where \(\Delta x\) is a small step size and \(E_{\Delta x}(x)\) being the error term.

    +

    Looking away from the error terms gives an approximation to the second derivative:

    + +
    +
    +\[ +\begin{equation} \label{approx} \tag{15} +g''(x) \approx \frac{g(x + \Delta x) - 2g(x) + g(x-\Delta x)}{\Delta x^2} +\end{equation} +\]
    +

    If \(x_i = i \Delta x = x_{i-1} + \Delta x\) and \(g_i = g(x_i)\) for \(i = 1,\dots N_x - 2\) with \(N_x\) being the number of values for \(x\), (15) becomes

    +
    +\[\begin{split} +\begin{aligned} +g''(x_i) &\approx \frac{g(x_i + \Delta x) - 2g(x_i) + g(x_i -\Delta x)}{\Delta x^2} \\ +&= \frac{g_{i+1} - 2g_i + g_{i-1}}{\Delta x^2} +\end{aligned} +\end{split}\]
    +

    Since we know from our problem that

    +
    +\[\begin{split} +\begin{aligned} +-g''(x) &= f(x) \\ +&= (3x + x^2)\exp(x) +\end{aligned} +\end{split}\]
    +

    along with the conditions \(g(0) = g(1) = 0\), +the following scheme can be used to find an approximate solution for \(g(x)\) numerically:

    + +
    +
    +\[\begin{split} +\begin{equation} + \begin{aligned} + -\Big( \frac{g_{i+1} - 2g_i + g_{i-1}}{\Delta x^2} \Big) &= f(x_i) \\ + -g_{i+1} + 2g_i - g_{i-1} &= \Delta x^2 f(x_i) + \end{aligned} +\end{equation} \label{odesys} \tag{16} +\end{split}\]
    +

    for \(i = 1, \dots, N_x - 2\) where \(g_0 = g_{N_x - 1} = 0\) and \(f(x_i) = (3x_i + x_i^2)\exp(x_i)\), which is given for our specific problem.

    +

    The equation can be rewritten into a matrix equation:

    +
    +\[\begin{split} +\begin{aligned} +\begin{pmatrix} +2 & -1 & 0 & \dots & 0 \\ +-1 & 2 & -1 & \dots & 0 \\ +\vdots & & \ddots & & \vdots \\ +0 & \dots & -1 & 2 & -1 \\ +0 & \dots & 0 & -1 & 2\\ +\end{pmatrix} +\begin{pmatrix} +g_1 \\ +g_2 \\ +\vdots \\ +g_{N_x - 3} \\ +g_{N_x - 2} +\end{pmatrix} +&= +\Delta x^2 +\begin{pmatrix} +f(x_1) \\ +f(x_2) \\ +\vdots \\ +f(x_{N_x - 3}) \\ +f(x_{N_x - 2}) +\end{pmatrix} \\ +\boldsymbol{A}\boldsymbol{g} &= \boldsymbol{f}, +\end{aligned} +\end{split}\]
    +

    which makes it possible to solve for the vector \(\boldsymbol{g}\).

    +
    +
    +

    Setting up the code

    +

    We can then compare the result from this numerical scheme with the output from our network using Autograd:

    +
    +
    +
    import autograd.numpy as np
    +from autograd import grad, elementwise_grad
    +import autograd.numpy.random as npr
    +from matplotlib import pyplot as plt
    +
    +def sigmoid(z):
    +    return 1/(1 + np.exp(-z))
    +
    +def deep_neural_network(deep_params, x):
    +    # N_hidden is the number of hidden layers
    +    N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer
    +
    +    # Assumes input x being an one-dimensional array
    +    num_values = np.size(x)
    +    x = x.reshape(-1, num_values)
    +
    +    # Assume that the input layer does nothing to the input x
    +    x_input = x
    +
    +    # Due to multiple hidden layers, define a variable referencing to the
    +    # output of the previous layer:
    +    x_prev = x_input
    +
    +    ## Hidden layers:
    +
    +    for l in range(N_hidden):
    +        # From the list of parameters P; find the correct weigths and bias for this layer
    +        w_hidden = deep_params[l]
    +
    +        # Add a row of ones to include bias
    +        x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0)
    +
    +        z_hidden = np.matmul(w_hidden, x_prev)
    +        x_hidden = sigmoid(z_hidden)
    +
    +        # Update x_prev such that next layer can use the output from this layer
    +        x_prev = x_hidden
    +
    +    ## Output layer:
    +
    +    # Get the weights and bias for this layer
    +    w_output = deep_params[-1]
    +
    +    # Include bias:
    +    x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0)
    +
    +    z_output = np.matmul(w_output, x_prev)
    +    x_output = z_output
    +
    +    return x_output
    +
    +def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb):
    +    # num_hidden_neurons is now a list of number of neurons within each hidden layer
    +
    +    # Find the number of hidden layers:
    +    N_hidden = np.size(num_neurons)
    +
    +    ## Set up initial weigths and biases
    +
    +    # Initialize the list of parameters:
    +    P = [None]*(N_hidden + 1) # + 1 to include the output layer
    +
    +    P[0] = npr.randn(num_neurons[0], 2 )
    +    for l in range(1,N_hidden):
    +        P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias
    +
    +    # For the output layer
    +    P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included
    +
    +    print('Initial cost: %g'%cost_function_deep(P, x))
    +
    +    ## Start finding the optimal weigths using gradient descent
    +
    +    # Find the Python function that represents the gradient of the cost function
    +    # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer
    +    cost_function_deep_grad = grad(cost_function_deep,0)
    +
    +    # Let the update be done num_iter times
    +    for i in range(num_iter):
    +        # Evaluate the gradient at the current weights and biases in P.
    +        # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases
    +        # in the hidden layers and output layers evaluated at x.
    +        cost_deep_grad =  cost_function_deep_grad(P, x)
    +
    +        for l in range(N_hidden+1):
    +            P[l] = P[l] - lmb * cost_deep_grad[l]
    +
    +    print('Final cost: %g'%cost_function_deep(P, x))
    +
    +    return P
    +
    +## Set up the cost function specified for this Poisson equation:
    +
    +# The right side of the ODE
    +def f(x):
    +    return (3*x + x**2)*np.exp(x)
    +
    +def cost_function_deep(P, x):
    +
    +    # Evaluate the trial function with the current parameters P
    +    g_t = g_trial_deep(x,P)
    +
    +    # Find the derivative w.r.t x of the trial function
    +    d2_g_t = elementwise_grad(elementwise_grad(g_trial_deep,0))(x,P)
    +
    +    right_side = f(x)
    +
    +    err_sqr = (-d2_g_t - right_side)**2
    +    cost_sum = np.sum(err_sqr)
    +
    +    return cost_sum/np.size(err_sqr)
    +
    +# The trial solution:
    +def g_trial_deep(x,P):
    +    return x*(1-x)*deep_neural_network(P,x)
    +
    +# The analytic solution;
    +def g_analytic(x):
    +    return x*(1-x)*np.exp(x)
    +
    +if __name__ == '__main__':
    +    npr.seed(4155)
    +
    +    ## Decide the vales of arguments to the function to solve
    +    Nx = 10
    +    x = np.linspace(0,1, Nx)
    +
    +    ## Set up the initial parameters
    +    num_hidden_neurons = [200,100]
    +    num_iter = 1000
    +    lmb = 1e-3
    +
    +    P = solve_ode_deep_neural_network(x, num_hidden_neurons, num_iter, lmb)
    +
    +    g_dnn_ag = g_trial_deep(x,P)
    +    g_analytical = g_analytic(x)
    +
    +    # Find the maximum absolute difference between the solutons:
    +
    +    plt.figure(figsize=(10,10))
    +
    +    plt.title('Performance of neural network solving an ODE compared to the analytical solution')
    +    plt.plot(x, g_analytical)
    +    plt.plot(x, g_dnn_ag[0,:])
    +    plt.legend(['analytical','nn'])
    +    plt.xlabel('x')
    +    plt.ylabel('g(x)')
    +
    +    ## Perform the computation using the numerical scheme
    +
    +    dx = 1/(Nx - 1)
    +
    +    # Set up the matrix A
    +    A = np.zeros((Nx-2,Nx-2))
    +
    +    A[0,0] = 2
    +    A[0,1] = -1
    +
    +    for i in range(1,Nx-3):
    +        A[i,i-1] = -1
    +        A[i,i] = 2
    +        A[i,i+1] = -1
    +
    +    A[Nx - 3, Nx - 4] = -1
    +    A[Nx - 3, Nx - 3] = 2
    +
    +    # Set up the vector f
    +    f_vec = dx**2 * f(x[1:-1])
    +
    +    # Solve the equation
    +    g_res = np.linalg.solve(A,f_vec)
    +
    +    g_vec = np.zeros(Nx)
    +    g_vec[1:-1] = g_res
    +
    +    # Print the differences between each method
    +    max_diff1 = np.max(np.abs(g_dnn_ag - g_analytical))
    +    max_diff2 = np.max(np.abs(g_vec - g_analytical))
    +    print("The max absolute difference between the analytical solution and DNN Autograd: %g"%max_diff1)
    +    print("The max absolute difference between the analytical solution and numerical scheme: %g"%max_diff2)
    +
    +    # Plot the results
    +    plt.figure(figsize=(10,10))
    +
    +    plt.plot(x,g_vec)
    +    plt.plot(x,g_analytical)
    +    plt.plot(x,g_dnn_ag[0,:])
    +
    +    plt.legend(['numerical scheme','analytical','dnn'])
    +    plt.show()
    +
    +
    +
    +
    +
    +
    +

    Partial Differential Equations

    +

    A partial differential equation (PDE) has a solution here the function +is defined by multiple variables. The equation may involve all kinds +of combinations of which variables the function is differentiated with +respect to.

    +

    In general, a partial differential equation for a function \(g(x_1,\dots,x_N)\) with \(N\) variables may be expressed as

    + +
    +
    +\[ +\begin{equation} \label{PDE} \tag{17} + f\left(x_1, \, \dots \, , x_N, \frac{\partial g(x_1,\dots,x_N) }{\partial x_1}, \dots , \frac{\partial g(x_1,\dots,x_N) }{\partial x_N}, \frac{\partial g(x_1,\dots,x_N) }{\partial x_1\partial x_2}, \, \dots \, , \frac{\partial^n g(x_1,\dots,x_N) }{\partial x_N^n} \right) = 0 +\end{equation} +\]
    +

    where \(f\) is an expression involving all kinds of possible mixed derivatives of \(g(x_1,\dots,x_N)\) up to an order \(n\). In order for the solution to be unique, some additional conditions must also be given.

    +
    +
    +

    Type of problem

    +

    The problem our network must solve for, is similar to the ODE case. +We must have a trial solution \(g_t\) at hand.

    +

    For instance, the trial solution could be expressed as

    +
    +\[ +\begin{align*} + g_t(x_1,\dots,x_N) = h_1(x_1,\dots,x_N) + h_2(x_1,\dots,x_N,N(x_1,\dots,x_N,P)) +\end{align*} +\]
    +

    where \(h_1(x_1,\dots,x_N)\) is a function that ensures \(g_t(x_1,\dots,x_N)\) satisfies some given conditions. +The neural network \(N(x_1,\dots,x_N,P)\) has weights and biases described by \(P\) and \(h_2(x_1,\dots,x_N,N(x_1,\dots,x_N,P))\) is an expression using the output from the neural network in some way.

    +

    The role of the function \(h_2(x_1,\dots,x_N,N(x_1,\dots,x_N,P))\), is to ensure that the output of \(N(x_1,\dots,x_N,P)\) is zero when \(g_t(x_1,\dots,x_N)\) is evaluated at the values of \(x_1,\dots,x_N\) where the given conditions must be satisfied. The function \(h_1(x_1,\dots,x_N)\) should alone make \(g_t(x_1,\dots,x_N)\) satisfy the conditions.

    +
    +
    +

    Network requirements

    +

    The network tries then the minimize the cost function following the +same ideas as described for the ODE case, but now with more than one +variables to consider. The concept still remains the same; find a set +of parameters \(P\) such that the expression \(f\) in (17) is as +close to zero as possible.

    +

    As for the ODE case, the cost function is the mean squared error that +the network must try to minimize. The cost function for the network to +minimize is

    +
    +\[ +C\left(x_1, \dots, x_N, P\right) = \left( f\left(x_1, \, \dots \, , x_N, \frac{\partial g(x_1,\dots,x_N) }{\partial x_1}, \dots , \frac{\partial g(x_1,\dots,x_N) }{\partial x_N}, \frac{\partial g(x_1,\dots,x_N) }{\partial x_1\partial x_2}, \, \dots \, , \frac{\partial^n g(x_1,\dots,x_N) }{\partial x_N^n} \right) \right)^2 +\]
    +
    +
    +

    More details

    +

    If we let \(\boldsymbol{x} = \big( x_1, \dots, x_N \big)\) be an array containing the values for \(x_1, \dots, x_N\) respectively, the cost function can be reformulated into the following:

    +
    +\[ +C\left(\boldsymbol{x}, P\right) = f\left( \left( \boldsymbol{x}, \frac{\partial g(\boldsymbol{x}) }{\partial x_1}, \dots , \frac{\partial g(\boldsymbol{x}) }{\partial x_N}, \frac{\partial g(\boldsymbol{x}) }{\partial x_1\partial x_2}, \, \dots \, , \frac{\partial^n g(\boldsymbol{x}) }{\partial x_N^n} \right) \right)^2 +\]
    +

    If we also have \(M\) different sets of values for \(x_1, \dots, x_N\), that is \(\boldsymbol{x}_i = \big(x_1^{(i)}, \dots, x_N^{(i)}\big)\) for \(i = 1,\dots,M\) being the rows in matrix \(X\), the cost function can be generalized into

    +
    +\[ +C\left(X, P \right) = \sum_{i=1}^M f\left( \left( \boldsymbol{x}_i, \frac{\partial g(\boldsymbol{x}_i) }{\partial x_1}, \dots , \frac{\partial g(\boldsymbol{x}_i) }{\partial x_N}, \frac{\partial g(\boldsymbol{x}_i) }{\partial x_1\partial x_2}, \, \dots \, , \frac{\partial^n g(\boldsymbol{x}_i) }{\partial x_N^n} \right) \right)^2. +\]
    +
    +
    +

    Example: The diffusion equation

    +

    In one spatial dimension, the equation reads

    +
    +\[ +\frac{\partial g(x,t)}{\partial t} = \frac{\partial^2 g(x,t)}{\partial x^2} +\]
    +

    where a possible choice of conditions are

    +
    +\[\begin{split} +\begin{align*} +g(0,t) &= 0 ,\qquad t \geq 0 \\ +g(1,t) &= 0, \qquad t \geq 0 \\ +g(x,0) &= u(x),\qquad x\in [0,1] +\end{align*} +\end{split}\]
    +

    with \(u(x)\) being some given function.

    +
    +
    +

    Defining the problem

    +

    For this case, we want to find \(g(x,t)\) such that

    + +
    +
    +\[ +\begin{equation} + \frac{\partial g(x,t)}{\partial t} = \frac{\partial^2 g(x,t)}{\partial x^2} +\end{equation} \label{diffonedim} \tag{18} +\]
    +

    and

    +
    +\[\begin{split} +\begin{align*} +g(0,t) &= 0 ,\qquad t \geq 0 \\ +g(1,t) &= 0, \qquad t \geq 0 \\ +g(x,0) &= u(x),\qquad x\in [0,1] +\end{align*} +\end{split}\]
    +

    with \(u(x) = \sin(\pi x)\).

    +

    First, let us set up the deep neural network. +The deep neural network will follow the same structure as discussed in the examples solving the ODEs. +First, we will look into how Autograd could be used in a network tailored to solve for bivariate functions.

    +
    +
    +

    Setting up the network using Autograd

    +

    The only change to do here, is to extend our network such that +functions of multiple parameters are correctly handled. In this case +we have two variables in our function to solve for, that is time \(t\) +and position \(x\). The variables will be represented by a +one-dimensional array in the program. The program will evaluate the +network at each possible pair \((x,t)\), given an array for the desired +\(x\)-values and \(t\)-values to approximate the solution at.

    +
    +
    +
    def sigmoid(z):
    +    return 1/(1 + np.exp(-z))
    +
    +def deep_neural_network(deep_params, x):
    +    # x is now a point and a 1D numpy array; make it a column vector
    +    num_coordinates = np.size(x,0)
    +    x = x.reshape(num_coordinates,-1)
    +
    +    num_points = np.size(x,1)
    +
    +    # N_hidden is the number of hidden layers
    +    N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer
    +
    +    # Assume that the input layer does nothing to the input x
    +    x_input = x
    +    x_prev = x_input
    +
    +    ## Hidden layers:
    +
    +    for l in range(N_hidden):
    +        # From the list of parameters P; find the correct weigths and bias for this layer
    +        w_hidden = deep_params[l]
    +
    +        # Add a row of ones to include bias
    +        x_prev = np.concatenate((np.ones((1,num_points)), x_prev ), axis = 0)
    +
    +        z_hidden = np.matmul(w_hidden, x_prev)
    +        x_hidden = sigmoid(z_hidden)
    +
    +        # Update x_prev such that next layer can use the output from this layer
    +        x_prev = x_hidden
    +
    +    ## Output layer:
    +
    +    # Get the weights and bias for this layer
    +    w_output = deep_params[-1]
    +
    +    # Include bias:
    +    x_prev = np.concatenate((np.ones((1,num_points)), x_prev), axis = 0)
    +
    +    z_output = np.matmul(w_output, x_prev)
    +    x_output = z_output
    +
    +    return x_output[0][0]
    +
    +
    +
    +
    +
    +
    +

    Setting up the network using Autograd; The trial solution

    +

    The cost function must then iterate through the given arrays +containing values for \(x\) and \(t\), defines a point \((x,t)\) the deep +neural network and the trial solution is evaluated at, and then finds +the Jacobian of the trial solution.

    +

    A possible trial solution for this PDE is

    +
    +\[ +g_t(x,t) = h_1(x,t) + x(1-x)tN(x,t,P) +\]
    +

    with \(A(x,t)\) being a function ensuring that \(g_t(x,t)\) satisfies our given conditions, and \(N(x,t,P)\) being the output from the deep neural network using weights and biases for each layer from \(P\).

    +

    To fulfill the conditions, \(A(x,t)\) could be:

    +
    +\[ +h_1(x,t) = (1-t)\Big(u(x) - \big((1-x)u(0) + x u(1)\big)\Big) = (1-t)u(x) = (1-t)\sin(\pi x) +\]
    +

    since \((0) = u(1) = 0\) and \(u(x) = \sin(\pi x)\).

    +
    +
    +

    Why the jacobian?

    +

    The Jacobian is used because the program must find the derivative of +the trial solution with respect to \(x\) and \(t\).

    +

    This gives the necessity of computing the Jacobian matrix, as we want +to evaluate the gradient with respect to \(x\) and \(t\) (note that the +Jacobian of a scalar-valued multivariate function is simply its +gradient).

    +

    In Autograd, the differentiation is by default done with respect to +the first input argument of your Python function. Since the points is +an array representing \(x\) and \(t\), the Jacobian is calculated using +the values of \(x\) and \(t\).

    +

    To find the second derivative with respect to \(x\) and \(t\), the +Jacobian can be found for the second time. The result is a Hessian +matrix, which is the matrix containing all the possible second order +mixed derivatives of \(g(x,t)\).

    +
    +
    +
    # Set up the trial function:
    +def u(x):
    +    return np.sin(np.pi*x)
    +
    +def g_trial(point,P):
    +    x,t = point
    +    return (1-t)*u(x) + x*(1-x)*t*deep_neural_network(P,point)
    +
    +# The right side of the ODE:
    +def f(point):
    +    return 0.
    +
    +# The cost function:
    +def cost_function(P, x, t):
    +    cost_sum = 0
    +
    +    g_t_jacobian_func = jacobian(g_trial)
    +    g_t_hessian_func = hessian(g_trial)
    +
    +    for x_ in x:
    +        for t_ in t:
    +            point = np.array([x_,t_])
    +
    +            g_t = g_trial(point,P)
    +            g_t_jacobian = g_t_jacobian_func(point,P)
    +            g_t_hessian = g_t_hessian_func(point,P)
    +
    +            g_t_dt = g_t_jacobian[1]
    +            g_t_d2x = g_t_hessian[0][0]
    +
    +            func = f(point)
    +
    +            err_sqr = ( (g_t_dt - g_t_d2x) - func)**2
    +            cost_sum += err_sqr
    +
    +    return cost_sum
    +
    +
    +
    +
    +
    +
    +

    Setting up the network using Autograd; The full program

    +

    Having set up the network, along with the trial solution and cost function, we can now see how the deep neural network performs by comparing the results to the analytical solution.

    +

    The analytical solution of our problem is

    +
    +\[ +g(x,t) = \exp(-\pi^2 t)\sin(\pi x) +\]
    +

    A possible way to implement a neural network solving the PDE, is given below. +Be aware, though, that it is fairly slow for the parameters used. +A better result is possible, but requires more iterations, and thus longer time to complete.

    +

    Indeed, the program below is not optimal in its implementation, but rather serves as an example on how to implement and use a neural network to solve a PDE. +Using TensorFlow results in a much better execution time. Try it!

    +
    +
    +
    import autograd.numpy as np
    +from autograd import jacobian,hessian,grad
    +import autograd.numpy.random as npr
    +from matplotlib import cm
    +from matplotlib import pyplot as plt
    +from mpl_toolkits.mplot3d import axes3d
    +
    +## Set up the network
    +
    +def sigmoid(z):
    +    return 1/(1 + np.exp(-z))
    +
    +def deep_neural_network(deep_params, x):
    +    # x is now a point and a 1D numpy array; make it a column vector
    +    num_coordinates = np.size(x,0)
    +    x = x.reshape(num_coordinates,-1)
    +
    +    num_points = np.size(x,1)
    +
    +    # N_hidden is the number of hidden layers
    +    N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer
    +
    +    # Assume that the input layer does nothing to the input x
    +    x_input = x
    +    x_prev = x_input
    +
    +    ## Hidden layers:
    +
    +    for l in range(N_hidden):
    +        # From the list of parameters P; find the correct weigths and bias for this layer
    +        w_hidden = deep_params[l]
    +
    +        # Add a row of ones to include bias
    +        x_prev = np.concatenate((np.ones((1,num_points)), x_prev ), axis = 0)
    +
    +        z_hidden = np.matmul(w_hidden, x_prev)
    +        x_hidden = sigmoid(z_hidden)
    +
    +        # Update x_prev such that next layer can use the output from this layer
    +        x_prev = x_hidden
    +
    +    ## Output layer:
    +
    +    # Get the weights and bias for this layer
    +    w_output = deep_params[-1]
    +
    +    # Include bias:
    +    x_prev = np.concatenate((np.ones((1,num_points)), x_prev), axis = 0)
    +
    +    z_output = np.matmul(w_output, x_prev)
    +    x_output = z_output
    +
    +    return x_output[0][0]
    +
    +## Define the trial solution and cost function
    +def u(x):
    +    return np.sin(np.pi*x)
    +
    +def g_trial(point,P):
    +    x,t = point
    +    return (1-t)*u(x) + x*(1-x)*t*deep_neural_network(P,point)
    +
    +# The right side of the ODE:
    +def f(point):
    +    return 0.
    +
    +# The cost function:
    +def cost_function(P, x, t):
    +    cost_sum = 0
    +
    +    g_t_jacobian_func = jacobian(g_trial)
    +    g_t_hessian_func = hessian(g_trial)
    +
    +    for x_ in x:
    +        for t_ in t:
    +            point = np.array([x_,t_])
    +
    +            g_t = g_trial(point,P)
    +            g_t_jacobian = g_t_jacobian_func(point,P)
    +            g_t_hessian = g_t_hessian_func(point,P)
    +
    +            g_t_dt = g_t_jacobian[1]
    +            g_t_d2x = g_t_hessian[0][0]
    +
    +            func = f(point)
    +
    +            err_sqr = ( (g_t_dt - g_t_d2x) - func)**2
    +            cost_sum += err_sqr
    +
    +    return cost_sum /( np.size(x)*np.size(t) )
    +
    +## For comparison, define the analytical solution
    +def g_analytic(point):
    +    x,t = point
    +    return np.exp(-np.pi**2*t)*np.sin(np.pi*x)
    +
    +## Set up a function for training the network to solve for the equation
    +def solve_pde_deep_neural_network(x,t, num_neurons, num_iter, lmb):
    +    ## Set up initial weigths and biases
    +    N_hidden = np.size(num_neurons)
    +
    +    ## Set up initial weigths and biases
    +
    +    # Initialize the list of parameters:
    +    P = [None]*(N_hidden + 1) # + 1 to include the output layer
    +
    +    P[0] = npr.randn(num_neurons[0], 2 + 1 ) # 2 since we have two points, +1 to include bias
    +    for l in range(1,N_hidden):
    +        P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias
    +
    +    # For the output layer
    +    P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included
    +
    +    print('Initial cost: ',cost_function(P, x, t))
    +
    +    cost_function_grad = grad(cost_function,0)
    +
    +    # Let the update be done num_iter times
    +    for i in range(num_iter):
    +        cost_grad =  cost_function_grad(P, x , t)
    +
    +        for l in range(N_hidden+1):
    +            P[l] = P[l] - lmb * cost_grad[l]
    +
    +    print('Final cost: ',cost_function(P, x, t))
    +
    +    return P
    +
    +if __name__ == '__main__':
    +    ### Use the neural network:
    +    npr.seed(15)
    +
    +    ## Decide the vales of arguments to the function to solve
    +    Nx = 10; Nt = 10
    +    x = np.linspace(0, 1, Nx)
    +    t = np.linspace(0,1,Nt)
    +
    +    ## Set up the parameters for the network
    +    num_hidden_neurons = [100, 25]
    +    num_iter = 250
    +    lmb = 0.01
    +
    +    P = solve_pde_deep_neural_network(x,t, num_hidden_neurons, num_iter, lmb)
    +
    +    ## Store the results
    +    g_dnn_ag = np.zeros((Nx, Nt))
    +    G_analytical = np.zeros((Nx, Nt))
    +    for i,x_ in enumerate(x):
    +        for j, t_ in enumerate(t):
    +            point = np.array([x_, t_])
    +            g_dnn_ag[i,j] = g_trial(point,P)
    +
    +            G_analytical[i,j] = g_analytic(point)
    +
    +    # Find the map difference between the analytical and the computed solution
    +    diff_ag = np.abs(g_dnn_ag - G_analytical)
    +    print('Max absolute difference between the analytical solution and the network: %g'%np.max(diff_ag))
    +
    +    ## Plot the solutions in two dimensions, that being in position and time
    +
    +    T,X = np.meshgrid(t,x)
    +
    +    fig = plt.figure(figsize=(10,10))
    +    ax = fig.gca(projection='3d')
    +    ax.set_title('Solution from the deep neural network w/ %d layer'%len(num_hidden_neurons))
    +    s = ax.plot_surface(T,X,g_dnn_ag,linewidth=0,antialiased=False,cmap=cm.viridis)
    +    ax.set_xlabel('Time $t$')
    +    ax.set_ylabel('Position $x$');
    +
    +
    +    fig = plt.figure(figsize=(10,10))
    +    ax = fig.gca(projection='3d')
    +    ax.set_title('Analytical solution')
    +    s = ax.plot_surface(T,X,G_analytical,linewidth=0,antialiased=False,cmap=cm.viridis)
    +    ax.set_xlabel('Time $t$')
    +    ax.set_ylabel('Position $x$');
    +
    +    fig = plt.figure(figsize=(10,10))
    +    ax = fig.gca(projection='3d')
    +    ax.set_title('Difference')
    +    s = ax.plot_surface(T,X,diff_ag,linewidth=0,antialiased=False,cmap=cm.viridis)
    +    ax.set_xlabel('Time $t$')
    +    ax.set_ylabel('Position $x$');
    +
    +    ## Take some slices of the 3D plots just to see the solutions at particular times
    +    indx1 = 0
    +    indx2 = int(Nt/2)
    +    indx3 = Nt-1
    +
    +    t1 = t[indx1]
    +    t2 = t[indx2]
    +    t3 = t[indx3]
    +
    +    # Slice the results from the DNN
    +    res1 = g_dnn_ag[:,indx1]
    +    res2 = g_dnn_ag[:,indx2]
    +    res3 = g_dnn_ag[:,indx3]
    +
    +    # Slice the analytical results
    +    res_analytical1 = G_analytical[:,indx1]
    +    res_analytical2 = G_analytical[:,indx2]
    +    res_analytical3 = G_analytical[:,indx3]
    +
    +    # Plot the slices
    +    plt.figure(figsize=(10,10))
    +    plt.title("Computed solutions at time = %g"%t1)
    +    plt.plot(x, res1)
    +    plt.plot(x,res_analytical1)
    +    plt.legend(['dnn','analytical'])
    +
    +    plt.figure(figsize=(10,10))
    +    plt.title("Computed solutions at time = %g"%t2)
    +    plt.plot(x, res2)
    +    plt.plot(x,res_analytical2)
    +    plt.legend(['dnn','analytical'])
    +
    +    plt.figure(figsize=(10,10))
    +    plt.title("Computed solutions at time = %g"%t3)
    +    plt.plot(x, res3)
    +    plt.plot(x,res_analytical3)
    +    plt.legend(['dnn','analytical'])
    +
    +    plt.show()
    +
    +
    +
    +
    +
    +
    +

    Example: Solving the wave equation with Neural Networks

    +

    The wave equation is

    +
    +\[ +\frac{\partial^2 g(x,t)}{\partial t^2} = c^2\frac{\partial^2 g(x,t)}{\partial x^2} +\]
    +

    with \(c\) being the specified wave speed.

    +

    Here, the chosen conditions are

    +
    +\[\begin{split} +\begin{align*} + g(0,t) &= 0 \\ + g(1,t) &= 0 \\ + g(x,0) &= u(x) \\ + \frac{\partial g(x,t)}{\partial t} \Big |_{t = 0} &= v(x) +\end{align*} +\end{split}\]
    +

    where \(\frac{\partial g(x,t)}{\partial t} \Big |_{t = 0}\) means the derivative of \(g(x,t)\) with respect to \(t\) is evaluated at \(t = 0\), and \(u(x)\) and \(v(x)\) being given functions.

    +
    +
    +

    The problem to solve for

    +

    The wave equation to solve for, is

    + +
    +
    +\[ +\begin{equation} \label{wave} \tag{19} +\frac{\partial^2 g(x,t)}{\partial t^2} = c^2 \frac{\partial^2 g(x,t)}{\partial x^2} +\end{equation} +\]
    +

    where \(c\) is the given wave speed. +The chosen conditions for this equation are

    + +
    +
    +\[\begin{split} +\begin{aligned} +g(0,t) &= 0, &t \geq 0 \\ +g(1,t) &= 0, &t \geq 0 \\ +g(x,0) &= u(x), &x\in[0,1] \\ +\frac{\partial g(x,t)}{\partial t}\Big |_{t = 0} &= v(x), &x \in [0,1] +\end{aligned} \label{condwave} \tag{20} +\end{split}\]
    +

    In this example, let \(c = 1\) and \(u(x) = \sin(\pi x)\) and \(v(x) = -\pi\sin(\pi x)\).

    +
    +
    +

    The trial solution

    +

    Setting up the network is done in similar matter as for the example of solving the diffusion equation. +The only things we have to change, is the trial solution such that it satisfies the conditions from (20) and the cost function.

    +

    The trial solution becomes slightly different since we have other conditions than in the example of solving the diffusion equation. Here, a possible trial solution \(g_t(x,t)\) is

    +
    +\[ +g_t(x,t) = h_1(x,t) + x(1-x)t^2N(x,t,P) +\]
    +

    where

    +
    +\[ +h_1(x,t) = (1-t^2)u(x) + tv(x) +\]
    +

    Note that this trial solution satisfies the conditions only if \(u(0) = v(0) = u(1) = v(1) = 0\), which is the case in this example.

    +
    +
    +

    The analytical solution

    +

    The analytical solution for our specific problem, is

    +
    +\[ +g(x,t) = \sin(\pi x)\cos(\pi t) - \sin(\pi x)\sin(\pi t) +\]
    +
    +
    +

    Solving the wave equation - the full program using Autograd

    +
    +
    +
    import autograd.numpy as np
    +from autograd import hessian,grad
    +import autograd.numpy.random as npr
    +from matplotlib import cm
    +from matplotlib import pyplot as plt
    +from mpl_toolkits.mplot3d import axes3d
    +
    +## Set up the trial function:
    +def u(x):
    +    return np.sin(np.pi*x)
    +
    +def v(x):
    +    return -np.pi*np.sin(np.pi*x)
    +
    +def h1(point):
    +    x,t = point
    +    return (1 - t**2)*u(x) + t*v(x)
    +
    +def g_trial(point,P):
    +    x,t = point
    +    return h1(point) + x*(1-x)*t**2*deep_neural_network(P,point)
    +
    +## Define the cost function
    +def cost_function(P, x, t):
    +    cost_sum = 0
    +
    +    g_t_hessian_func = hessian(g_trial)
    +
    +    for x_ in x:
    +        for t_ in t:
    +            point = np.array([x_,t_])
    +
    +            g_t_hessian = g_t_hessian_func(point,P)
    +
    +            g_t_d2x = g_t_hessian[0][0]
    +            g_t_d2t = g_t_hessian[1][1]
    +
    +            err_sqr = ( (g_t_d2t - g_t_d2x) )**2
    +            cost_sum += err_sqr
    +
    +    return cost_sum / (np.size(t) * np.size(x))
    +
    +## The neural network
    +def sigmoid(z):
    +    return 1/(1 + np.exp(-z))
    +
    +def deep_neural_network(deep_params, x):
    +    # x is now a point and a 1D numpy array; make it a column vector
    +    num_coordinates = np.size(x,0)
    +    x = x.reshape(num_coordinates,-1)
    +
    +    num_points = np.size(x,1)
    +
    +    # N_hidden is the number of hidden layers
    +    N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer
    +
    +    # Assume that the input layer does nothing to the input x
    +    x_input = x
    +    x_prev = x_input
    +
    +    ## Hidden layers:
    +
    +    for l in range(N_hidden):
    +        # From the list of parameters P; find the correct weigths and bias for this layer
    +        w_hidden = deep_params[l]
    +
    +        # Add a row of ones to include bias
    +        x_prev = np.concatenate((np.ones((1,num_points)), x_prev ), axis = 0)
    +
    +        z_hidden = np.matmul(w_hidden, x_prev)
    +        x_hidden = sigmoid(z_hidden)
    +
    +        # Update x_prev such that next layer can use the output from this layer
    +        x_prev = x_hidden
    +
    +    ## Output layer:
    +
    +    # Get the weights and bias for this layer
    +    w_output = deep_params[-1]
    +
    +    # Include bias:
    +    x_prev = np.concatenate((np.ones((1,num_points)), x_prev), axis = 0)
    +
    +    z_output = np.matmul(w_output, x_prev)
    +    x_output = z_output
    +
    +    return x_output[0][0]
    +
    +## The analytical solution
    +def g_analytic(point):
    +    x,t = point
    +    return np.sin(np.pi*x)*np.cos(np.pi*t) - np.sin(np.pi*x)*np.sin(np.pi*t)
    +
    +def solve_pde_deep_neural_network(x,t, num_neurons, num_iter, lmb):
    +    ## Set up initial weigths and biases
    +    N_hidden = np.size(num_neurons)
    +
    +    ## Set up initial weigths and biases
    +
    +    # Initialize the list of parameters:
    +    P = [None]*(N_hidden + 1) # + 1 to include the output layer
    +
    +    P[0] = npr.randn(num_neurons[0], 2 + 1 ) # 2 since we have two points, +1 to include bias
    +    for l in range(1,N_hidden):
    +        P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias
    +
    +    # For the output layer
    +    P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included
    +
    +    print('Initial cost: ',cost_function(P, x, t))
    +
    +    cost_function_grad = grad(cost_function,0)
    +
    +    # Let the update be done num_iter times
    +    for i in range(num_iter):
    +        cost_grad =  cost_function_grad(P, x , t)
    +
    +        for l in range(N_hidden+1):
    +            P[l] = P[l] - lmb * cost_grad[l]
    +
    +
    +    print('Final cost: ',cost_function(P, x, t))
    +
    +    return P
    +
    +if __name__ == '__main__':
    +    ### Use the neural network:
    +    npr.seed(15)
    +
    +    ## Decide the vales of arguments to the function to solve
    +    Nx = 10; Nt = 10
    +    x = np.linspace(0, 1, Nx)
    +    t = np.linspace(0,1,Nt)
    +
    +    ## Set up the parameters for the network
    +    num_hidden_neurons = [50,20]
    +    num_iter = 1000
    +    lmb = 0.01
    +
    +    P = solve_pde_deep_neural_network(x,t, num_hidden_neurons, num_iter, lmb)
    +
    +    ## Store the results
    +    res = np.zeros((Nx, Nt))
    +    res_analytical = np.zeros((Nx, Nt))
    +    for i,x_ in enumerate(x):
    +        for j, t_ in enumerate(t):
    +            point = np.array([x_, t_])
    +            res[i,j] = g_trial(point,P)
    +
    +            res_analytical[i,j] = g_analytic(point)
    +
    +    diff = np.abs(res - res_analytical)
    +    print("Max difference between analytical and solution from nn: %g"%np.max(diff))
    +
    +    ## Plot the solutions in two dimensions, that being in position and time
    +
    +    T,X = np.meshgrid(t,x)
    +
    +    fig = plt.figure(figsize=(10,10))
    +    ax = fig.gca(projection='3d')
    +    ax.set_title('Solution from the deep neural network w/ %d layer'%len(num_hidden_neurons))
    +    s = ax.plot_surface(T,X,res,linewidth=0,antialiased=False,cmap=cm.viridis)
    +    ax.set_xlabel('Time $t$')
    +    ax.set_ylabel('Position $x$');
    +
    +
    +    fig = plt.figure(figsize=(10,10))
    +    ax = fig.gca(projection='3d')
    +    ax.set_title('Analytical solution')
    +    s = ax.plot_surface(T,X,res_analytical,linewidth=0,antialiased=False,cmap=cm.viridis)
    +    ax.set_xlabel('Time $t$')
    +    ax.set_ylabel('Position $x$');
    +
    +
    +    fig = plt.figure(figsize=(10,10))
    +    ax = fig.gca(projection='3d')
    +    ax.set_title('Difference')
    +    s = ax.plot_surface(T,X,diff,linewidth=0,antialiased=False,cmap=cm.viridis)
    +    ax.set_xlabel('Time $t$')
    +    ax.set_ylabel('Position $x$');
    +
    +    ## Take some slices of the 3D plots just to see the solutions at particular times
    +    indx1 = 0
    +    indx2 = int(Nt/2)
    +    indx3 = Nt-1
    +
    +    t1 = t[indx1]
    +    t2 = t[indx2]
    +    t3 = t[indx3]
    +
    +    # Slice the results from the DNN
    +    res1 = res[:,indx1]
    +    res2 = res[:,indx2]
    +    res3 = res[:,indx3]
    +
    +    # Slice the analytical results
    +    res_analytical1 = res_analytical[:,indx1]
    +    res_analytical2 = res_analytical[:,indx2]
    +    res_analytical3 = res_analytical[:,indx3]
    +
    +    # Plot the slices
    +    plt.figure(figsize=(10,10))
    +    plt.title("Computed solutions at time = %g"%t1)
    +    plt.plot(x, res1)
    +    plt.plot(x,res_analytical1)
    +    plt.legend(['dnn','analytical'])
    +
    +    plt.figure(figsize=(10,10))
    +    plt.title("Computed solutions at time = %g"%t2)
    +    plt.plot(x, res2)
    +    plt.plot(x,res_analytical2)
    +    plt.legend(['dnn','analytical'])
    +
    +    plt.figure(figsize=(10,10))
    +    plt.title("Computed solutions at time = %g"%t3)
    +    plt.plot(x, res3)
    +    plt.plot(x,res_analytical3)
    +    plt.legend(['dnn','analytical'])
    +
    +    plt.show()
    +
    +
    +
    +
    +
    + +
    + + + + +
    + + + + + +
    +
    +
    +

    + + By Morten Hjorth-Jensen
    + + © Copyright 2021.
    +

    +
    +
    + + +
    +
    + + + + + \ No newline at end of file diff --git a/doc/LectureNotes/_build/jupyter_execute/exercisesweek43.ipynb b/doc/LectureNotes/_build/jupyter_execute/exercisesweek43.ipynb new file mode 100644 index 000000000..f9ef9df1d --- /dev/null +++ b/doc/LectureNotes/_build/jupyter_execute/exercisesweek43.ipynb @@ -0,0 +1,169 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "20ae416e", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "8bfcd25c", + "metadata": { + "editable": true + }, + "source": [ + "# Exercises weeks 43 and 44 \n", + "**October 9-13, 2023**\n", + "\n", + "Date: **Deadline is Sunday November 5 at midnight**\n", + "\n", + "You can hand in the exercises from week 43 and week 44 as one exercise and get a total score of two additional points." + ] + }, + { + "cell_type": "markdown", + "id": "fed7dbe4", + "metadata": { + "editable": true + }, + "source": [ + "# Overarching aims of the exercises weeks 43 and 44\n", + "\n", + "The aim of the exercises this week and next week is to get started with writing a neural network code\n", + "of relevance for project 2. \n", + "\n", + "During week 41 we discussed three different types of gates, the\n", + "so-called XOR, the OR and the AND gates. In order to develop a code\n", + "for neural networks, it can be useful to set up a simpler system with\n", + "only two inputs and one output. This can make it easier to debug and\n", + "study the feed forward pass and the back propagation part. In the\n", + "exercise this and next week, we propose to study this system with just\n", + "one hidden layer and two hidden nodes. There is only one output node\n", + "and we can choose to use either a simple regression case (fitting a\n", + "line) or just a binary classification case with the cross-entropy as\n", + "cost function.\n", + "\n", + "Their inputs and outputs can be\n", + "summarized using the following tables, first for the OR gate with\n", + "inputs $x_1$ and $x_2$ and outputs $y$:\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 1
    1 0 1
    1 1 1
    " + ] + }, + { + "cell_type": "markdown", + "id": "f108a242", + "metadata": { + "editable": true + }, + "source": [ + "## The AND and XOR Gates\n", + "\n", + "The AND gate is defined as\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 0
    1 0 0
    1 1 1
    \n", + "\n", + "And finally we have the XOR gate\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 1
    1 0 1
    1 1 0
    " + ] + }, + { + "cell_type": "markdown", + "id": "aa6993a7", + "metadata": { + "editable": true + }, + "source": [ + "## Representing the Data Sets\n", + "\n", + "Our design matrix is defined by the input values $x_1$ and $x_2$. Since we have four possible outputs, our design matrix reads" + ] + }, + { + "cell_type": "markdown", + "id": "90bd0efa", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{X}=\\begin{bmatrix} 0 & 0 \\\\\n", + " 0 & 1 \\\\\n", + "\t\t 1 & 0 \\\\\n", + "\t\t 1 & 1 \\end{bmatrix},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "23ba74e1", + "metadata": { + "editable": true + }, + "source": [ + "while the vector of outputs is $\\boldsymbol{y}^T=[0,1,1,0]$ for the XOR gate, $\\boldsymbol{y}^T=[0,0,0,1]$ for the AND gate and $\\boldsymbol{y}^T=[0,1,1,1]$ for the OR gate.\n", + "\n", + "Your tasks here are\n", + "\n", + "1. Set up the design matrix with the inputs as discussed above and a vector containing the output, the so-called targets. Note that the design matrix is the same for all gates. You need just to define different outputs.\n", + "\n", + "2. Construct a neural network with only one hidden layer and two hidden nodes using the Sigmoid function as activation function.\n", + "\n", + "3. Set up the output layer with only one output node and use again the Sigmoid function as activation function for the output.\n", + "\n", + "4. Initialize the weights and biases and perform a feed forward pass and compare the outputs with the targets.\n", + "\n", + "5. Set up the cost function (cross entropy for classification of binary cases).\n", + "\n", + "6. Calculate the gradients needed for the back propagation part.\n", + "\n", + "7. Use the gradients to train the network in the back propagation part. Think of using automatic differentiation.\n", + "\n", + "8. Train the network and study your results and compare with results obtained either with **scikit-learn** or **TensorFlow**.\n", + "\n", + "Everything you develop here can be used directly into the code for the project." + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/doc/LectureNotes/_build/jupyter_execute/exercisesweek43.txt b/doc/LectureNotes/_build/jupyter_execute/exercisesweek43.txt new file mode 100644 index 000000000..e69de29bb diff --git a/doc/LectureNotes/_build/jupyter_execute/week43.ipynb b/doc/LectureNotes/_build/jupyter_execute/week43.ipynb new file mode 100644 index 000000000..5e579bffd --- /dev/null +++ b/doc/LectureNotes/_build/jupyter_execute/week43.ipynb @@ -0,0 +1,7761 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "944a1ec4", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "571ef4ca", + "metadata": { + "editable": true + }, + "source": [ + "# Week 43: Deep Learning: Constructing a Neural Network code and solving differential equations\n", + "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and Facility for Rare Isotope Beams, Michigan State University\n", + "\n", + "Date: **Oct 23, 2023**\n", + "\n", + "Copyright 1999-2023, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license" + ] + }, + { + "cell_type": "markdown", + "id": "c53e0e9f", + "metadata": { + "editable": true + }, + "source": [ + "## Plans for week 43\n", + "\n", + "**Material for the active learning sessions on Tuesday and Wednesday.**\n", + "\n", + " * Exercise on writing your own neural network code, application to the OR and XOR gates\n", + "\n", + " * The exercises this week will be continued next week as well\n", + "\n", + " * Discussion of project 2\n", + "\n", + " \n", + "\n", + "**Material for the lecture on Thursday October 26, 2023.**\n", + "\n", + " * Building our own Feed-forward Neural Network and discussion of project 2, continuation from last week\n", + "\n", + " * Solving differential equations with Neural Networks and intro to **Tensorflow** with examples.\n", + "\n", + " * Readings and Videos:\n", + "\n", + " * These lecture notes\n", + "\n", + " * [Aurelien Geron's chapters 10-11](https://github.com/CompPhysics/MachineLearning/blob/master/doc/Textbooks/TensorflowML.pdf)\n", + "\n", + " * For a more in depth discussion on neural networks we recommend Goodfellow et al chapters 6 and 7. \n", + "\n", + " * [Neural Networks demystified](https://www.youtube.com/watch?v=bxe2T-V8XRs&list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&ab_channel=WelchLabs)\n", + "\n", + " * [Building Neural Networks from scratch](https://www.youtube.com/watch?v=Wo5dMEP_BbI&list=PLQVvvaa0QuDcjD5BAw2DxE6OF2tius3V3&ab_channel=sentdex)\n", + "\n", + " * [Video on Neural Networks](https://www.youtube.com/watch?v=CqOfi41LfDw)\n", + "\n", + " * [Video on the back propagation algorithm](https://www.youtube.com/watch?v=Ilg3gGewQ5U)\n", + "\n", + "I also recommend Michael Nielsen's intuitive approach to the neural networks and the universal approximation theorem, see the slides at ." + ] + }, + { + "cell_type": "markdown", + "id": "02ed9bb6", + "metadata": { + "editable": true + }, + "source": [ + "## Using Automatic differentiation\n", + "a\n", + "In our discussions of ordinary differential equations \n", + "we will also study the usage of [Autograd](https://www.youtube.com/watch?v=fRf4l5qaX1M&ab_channel=AlexSmola) in computing gradients for deep learning. For the documentation of Autograd and examples see the lectures slides from [week 39](https://compphysics.github.io/MachineLearning/doc/pub/week39/html/week39.html) and the [Autograd documentation](https://github.com/HIPS/autograd).\n", + "t" + ] + }, + { + "cell_type": "markdown", + "id": "05cfb0c9", + "metadata": { + "editable": true + }, + "source": [ + "## Back propagation and automatic differentiation\n", + "\n", + "For more details on the back propagation algorithm and automatic differentiation see\n", + "1. \n", + "\n", + "2. \n", + "\n", + "3. Slides 12-44 at URL\":http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture4.pdf\"" + ] + }, + { + "cell_type": "markdown", + "id": "21caf391", + "metadata": { + "editable": true + }, + "source": [ + "## Material for exercises week 43 and week 44" + ] + }, + { + "cell_type": "markdown", + "id": "3c9b1e04", + "metadata": { + "editable": true + }, + "source": [ + "## Writing our first neural network code, testing it for the OR and XOR gates\n", + "\n", + "During week 41 we discussed three different types of gates, the\n", + "so-called XOR, the OR and the AND gates. In order to develop a code\n", + "for neural networks, it can be useful to set up a simpler system with\n", + "only two inputs and one output. This can make it easier to debug and\n", + "study the feed forward pass and the back propagation part. In the\n", + "exercise this and next week, we propose to study this system with just\n", + "one hidden layer and two hidden nodes. There is only one output node\n", + "and we can choose to use either a simple regression case (fitting a\n", + "line) or just a binary classification case with the corss-entropy as\n", + "cost function.\n", + "\n", + "Their inputs and outputs can be\n", + "summarized using the following tables, first for the OR gate with\n", + "inputs $x_1$ and $x_2$ and outputs $y$:\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 1
    1 0 1
    1 1 1
    " + ] + }, + { + "cell_type": "markdown", + "id": "4dabb457", + "metadata": { + "editable": true + }, + "source": [ + "## The AND and XOR Gates\n", + "\n", + "The AND gate is defined as\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 0
    1 0 0
    1 1 1
    \n", + "\n", + "And finally we have the XOR gate\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 1
    1 0 1
    1 1 0
    " + ] + }, + { + "cell_type": "markdown", + "id": "a78cff46", + "metadata": { + "editable": true + }, + "source": [ + "## Representing the Data Sets\n", + "\n", + "Our design matrix is defined by the input values $x_1$ and $x_2$. Since we have four possible outputs, our design matrix reads" + ] + }, + { + "cell_type": "markdown", + "id": "e4c2f9d7", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{X}=\\begin{bmatrix} 0 & 0 \\\\\n", + " 0 & 1 \\\\\n", + "\t\t 1 & 0 \\\\\n", + "\t\t 1 & 1 \\end{bmatrix},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "103736e3", + "metadata": { + "editable": true + }, + "source": [ + "while the vector of outputs is $\\boldsymbol{y}^T=[0,1,1,0]$ for the XOR gate, $\\boldsymbol{y}^T=[0,0,0,1]$ for the AND gate and $\\boldsymbol{y}^T=[0,1,1,1]$ for the OR gate." + ] + }, + { + "cell_type": "markdown", + "id": "a5e5d384", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the Neural Network\n", + "\n", + "We define first our design matrix and the various output vectors for the different gates." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "09d0e5dd", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0.80625657 0.36420967]\n", + " [0.90297441 0.30170017]\n", + " [0.89823921 0.28566769]\n", + " [0.93420126 0.25920793]]\n", + "[0 0 0 0]\n" + ] + } + ], + "source": [ + "%matplotlib inline\n", + "\n", + "\"\"\"\n", + "Simple code that tests XOR, OR and AND gates with linear regression\n", + "\"\"\"\n", + "\n", + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn import datasets\n", + "\n", + "def sigmoid(x):\n", + " return 1/(1 + np.exp(-x))\n", + "\n", + "def feed_forward(X):\n", + " # weighted sum of inputs to the hidden layer\n", + " z_h = np.matmul(X, hidden_weights) + hidden_bias\n", + " # activation in the hidden layer\n", + " a_h = sigmoid(z_h)\n", + " \n", + " # weighted sum of inputs to the output layer\n", + " z_o = np.matmul(a_h, output_weights) + output_bias\n", + " # softmax output\n", + " # axis 0 holds each input and axis 1 the probabilities of each category\n", + " probabilities = sigmoid(z_o)\n", + " return probabilities\n", + "\n", + "# we obtain a prediction by taking the class with the highest likelihood\n", + "def predict(X):\n", + " probabilities = feed_forward(X)\n", + " return np.argmax(probabilities, axis=1)\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# Design matrix\n", + "X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64)\n", + "\n", + "# The XOR gate\n", + "yXOR = np.array( [ 0, 1 ,1, 0])\n", + "# The OR gate\n", + "yOR = np.array( [ 0, 1 ,1, 1])\n", + "# The AND gate\n", + "yAND = np.array( [ 0, 0 ,0, 1])\n", + "\n", + "# Defining the neural network\n", + "n_inputs, n_features = X.shape\n", + "n_hidden_neurons = 2\n", + "n_categories = 2\n", + "n_features = 2\n", + "\n", + "# we make the weights normally distributed using numpy.random.randn\n", + "\n", + "# weights and bias in the hidden layer\n", + "hidden_weights = np.random.randn(n_features, n_hidden_neurons)\n", + "hidden_bias = np.zeros(n_hidden_neurons) + 0.01\n", + "\n", + "# weights and bias in the output layer\n", + "output_weights = np.random.randn(n_hidden_neurons, n_categories)\n", + "output_bias = np.zeros(n_categories) + 0.01\n", + "\n", + "probabilities = feed_forward(X)\n", + "print(probabilities)\n", + "\n", + "\n", + "predictions = predict(X)\n", + "print(predictions)" + ] + }, + { + "cell_type": "markdown", + "id": "d9f554db", + "metadata": { + "editable": true + }, + "source": [ + "Not an impressive result, but this was our first forward pass with randomly assigned weights. Let us now add the full network with the back-propagation algorithm discussed above." + ] + }, + { + "cell_type": "markdown", + "id": "ab802e6b", + "metadata": { + "editable": true + }, + "source": [ + "## The Code using Scikit-Learn" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9231d583", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 1e-05\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 1e-05\n", + "Lambda = 0.0001\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 1e-05\n", + "Lambda = 0.001\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 1e-05\n", + "Lambda = 0.01\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 1e-05\n", + "Lambda = 0.1\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 1e-05\n", + "Lambda = 1.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 1e-05\n", + "Lambda = 10.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.0001\n", + "Lambda = 1e-05\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.0001\n", + "Lambda = 0.0001\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.0001\n", + "Lambda = 0.001\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.0001\n", + "Lambda = 0.01\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.0001\n", + "Lambda = 0.1\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.0001\n", + "Lambda = 1.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.0001\n", + "Lambda = 10.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.001\n", + "Lambda = 1e-05\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.001\n", + "Lambda = 0.0001\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.001\n", + "Lambda = 0.001\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.001\n", + "Lambda = 0.01\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.001\n", + "Lambda = 0.1\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.001\n", + "Lambda = 1.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.001\n", + "Lambda = 10.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.01\n", + "Lambda = 1e-05\n", + "Accuracy score on data set: 0.25\n", + "\n", + "Learning rate = 0.01\n", + "Lambda = 0.0001\n", + "Accuracy score on data set: 0.75\n", + "\n", + "Learning rate = 0.01\n", + "Lambda = 0.001\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.01\n", + "Lambda = 0.01\n", + "Accuracy score on data set: 0.75\n", + "\n", + "Learning rate = 0.01\n", + "Lambda = 0.1\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.01\n", + "Lambda = 1.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.01\n", + "Lambda = 10.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.1\n", + "Lambda = 1e-05\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.1\n", + "Lambda = 0.0001\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.1\n", + "Lambda = 0.001\n", + "Accuracy score on data set: 1.0\n", + "\n", + "Learning rate = 0.1\n", + "Lambda = 0.01\n", + "Accuracy score on data set: 1.0\n", + "\n", + "Learning rate = 0.1\n", + "Lambda = 0.1\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.1\n", + "Lambda = 1.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 0.1\n", + "Lambda = 10.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 1e-05\n", + "Accuracy score on data set: 0.75\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 0.0001\n", + "Accuracy score on data set: 0.75\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 0.001\n", + "Accuracy score on data set: 0.75\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 0.01\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 0.1\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 1.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 10.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 1e-05\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 0.0001\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 0.001\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 0.01\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 0.1\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 1.0\n", + "Accuracy score on data set: 0.5\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 10.0\n", + "Accuracy score on data set: 0.5\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n", + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n", + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n", + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n", + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n", + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n", + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n", + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n", + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n", + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAANbCAYAAAC6lftqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABrR0lEQVR4nO3dd3xUddbH8e9QJgMpQISQSOgEYpQSDEVpIqDriuIKPsqKC4tEmrCCCzYUUGwLigKCq1J0kQWlWigi7q4U6ShCCE1aME0gCSE9mecPJLvjBBhg7r2Z5PN+XvN6mN/cO/fk7BA5c8691+Z0Op0CAAAAABNUsDoAAAAAAOUHBQgAAAAA01CAAAAAADANBQgAAAAA01CAAAAAADANBQgAAAAA01CAAAAAADANBQgAAAAA01CAAICBuNcrAACuKlkdAACY6emnn9ayZcsuuU2dOnX0zTffXPOxPv30Ux0+fFhPP/30ZbddvHixnnvuOXXq1EkffPDBNR8bAIDSyubk6zkA5cjx48d1+vTp4uczZ85UXFycZsyYUbxmt9sVFRV1zce6/fbb1bZtW7322muX3bZv377KzMzUoUOH9NVXX6lu3brXfHwAAEojOiAAypV69eqpXr16xc+Dg4Nlt9vVqlUry2I6cuSIdu7cqffee09jxozRJ598oieffNKyeAAAMBLngABACQ4cOKDBgwerdevWat26tYYPH64TJ064bPOPf/xDv/vd79S8eXN16tRJEyZMUGZmpqTz3Y+TJ09q2bJlatasmRISEi56rCVLligwMFC33HKLfve732nJkiXKy8tz227Pnj0aNGiQbr75ZrVv316jRo1SYmJi8eunTp3Ss88+q1tvvVXR0dF6+OGHtWPHjuLXmzVrpunTp7u85/Tp09WsWbPi508//bT69++v8ePHKyYmRn/4wx9UUFCg06dPa+LEieratatuuukmtW3bVsOHD3f7ub788kvdf//9atmypW677TZNnjxZeXl5OnjwoJo1a6ZFixa5bJ+cnKwbbrjhsmNxAICygwIEAH7jyJEjeuihh3Tq1Cm99tprevnll3XixAn17dtXp06dknT+H9qvv/66Hn74Yc2ePVvDhw/XihUrNGnSJEnSjBkzVKtWLXXp0kWLFi1SSEhIiccqLCzUihUr9Pvf/152u13333+/Tp06pa+//tplu/j4ePXt21fZ2dl67bXX9OKLLyouLk4DBw5Ufn6+srKy9NBDD2nTpk168sknNWPGDPn7+2vQoEE6fPjwFf3827dv17FjxzR9+nQNHz5cFStW1ODBg7Vx40Y9+eSTmj17toYNG6ZNmzbphRdeKN5v4cKFGj16tG644QbNmDFDgwcP1oIFCzRhwgRFRESoZcuWWrFihcuxVqxYIYfDoTvvvPOKYgQA+C5GsADgN2bMmCGHw6F58+YpICBAknTLLbeoe/fu+uCDD/TUU09py5YtqlOnjh5++GFVqFBBbdu2VdWqVXXmzBlJUlRUlOx2u4KDgy853vXtt98qJSVFvXv3liS1atVKTZo00T//+U/9/ve/L95u5syZqlatmubMmSM/Pz9JUmhoqJ544gnt379fP/zwg06cOKHly5crMjJSkhQTE6P77rtP27ZtU+PGjT3++QsKCjRx4kTVr19f0vkuRZUqVfTUU08pJiZGktSuXTslJCRo4cKFkqSioiJNnz5dPXr00Msvv1z8Xrm5uVq2bJny8vLUu3dvvfDCCzpx4kTxOS7Lly/XXXfdpapVq3ocHwDAt9EBAYDf2Lx5s9q1ayeHw6GCggIVFBQoICBAMTEx2rRpkySpffv2Onr0qO6///7iE9nvuece9e/f/4qOtWTJEtWvX18NGzZURkaGMjIydNddd2nr1q0unYsdO3aoc+fOxcWHJLVo0ULffPONbrrpJm3fvl3h4eHFxYck+fn5adWqVXrooYeuKCaHw+Fynkzt2rX10UcfKSYmRj///LO+++47zZ8/Xzt37lR+fr6k812jX375Rd27d3d5rwEDBmjFihWy2+26++67VaVKleIuyO7du3X48GHdf//9VxQfAMC30QEBgN9IS0vTypUrtXLlSrfXgoODJUm///3vVVRUpAULFmjGjBl6++23VadOHT355JO6++67PTrO6dOn9e9//1v5+flq06aN2+uLFi3Ss88+WxzTddddd8mYL/X6lbjuuutks9lc1j777DO9+eabSkxMVPXq1RUZGSmHw+Fy/Av7XkxAQIB+97vf6bPPPtPjjz+uZcuWqX79+sVdFQBA+UABAgC/ERgYqFtvvVV//vOf3V6rVOm/vzZ79uypnj176uzZs9qwYYPef/99jRkzRjExMapdu/Zlj7NixQrl5+drxowZCgoKcnntnXfe0fLlyzV6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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/week43_15_2.png" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.neural_network import MLPClassifier\n", + "from sklearn.metrics import accuracy_score\n", + "import seaborn as sns\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# Design matrix\n", + "X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64)\n", + "\n", + "# The XOR gate\n", + "yXOR = np.array( [ 0, 1 ,1, 0])\n", + "# The OR gate\n", + "yOR = np.array( [ 0, 1 ,1, 1])\n", + "# The AND gate\n", + "yAND = np.array( [ 0, 0 ,0, 1])\n", + "\n", + "# Defining the neural network\n", + "n_inputs, n_features = X.shape\n", + "n_hidden_neurons = 2\n", + "n_categories = 2\n", + "n_features = 2\n", + "\n", + "eta_vals = np.logspace(-5, 1, 7)\n", + "lmbd_vals = np.logspace(-5, 1, 7)\n", + "# store models for later use\n", + "DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + "epochs = 100\n", + "\n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n", + " alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n", + " dnn.fit(X, yXOR)\n", + " DNN_scikit[i][j] = dnn\n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Accuracy score on data set: \", dnn.score(X, yXOR))\n", + " print()\n", + "\n", + "sns.set()\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " dnn = DNN_scikit[i][j]\n", + " test_pred = dnn.predict(X)\n", + " test_accuracy[i][j] = accuracy_score(yXOR, test_pred)\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "1c0ad443", + "metadata": { + "editable": true + }, + "source": [ + "How do we interpret these results?" + ] + }, + { + "cell_type": "markdown", + "id": "1cea859c", + "metadata": { + "editable": true + }, + "source": [ + "## Lecture Thursday October 26" + ] + }, + { + "cell_type": "markdown", + "id": "bbdb3e49", + "metadata": { + "editable": true + }, + "source": [ + "## Developing a code for doing neural networks with back propagation\n", + "\n", + "We repeat some of the elements discussed last week. The first part of\n", + "the material for Thursday was contained in the slides for last\n", + "week as well. We will repeat some of the topics here before we move into\n", + "applications to differential equations and other examples.\n", + "\n", + "One can identify a set of key steps when using neural networks to solve supervised learning problems: \n", + "\n", + "1. Collect and pre-process data \n", + "\n", + "2. Define model and architecture \n", + "\n", + "3. Choose cost function and optimizer \n", + "\n", + "4. Train the model \n", + "\n", + "5. Evaluate model performance on test data \n", + "\n", + "6. Adjust hyperparameters (if necessary, network architecture)" + ] + }, + { + "cell_type": "markdown", + "id": "45d25695", + "metadata": { + "editable": true + }, + "source": [ + "## Collect and pre-process data\n", + "\n", + "Here we will be using the MNIST dataset, which is readily available through the **scikit-learn**\n", + "package. You may also find it for example [here](http://yann.lecun.com/exdb/mnist/). \n", + "The *MNIST* (Modified National Institute of Standards and Technology) database is a large database\n", + "of handwritten digits that is commonly used for training various image processing systems. \n", + "The MNIST dataset consists of 70 000 images of size $28\\times 28$ pixels, each labeled from 0 to 9. \n", + "The scikit-learn dataset we will use consists of a selection of 1797 images of size $8\\times 8$ collected and processed from this database. \n", + "\n", + "To feed data into a feed-forward neural network we need to represent\n", + "the inputs as a design/feature matrix $X = (n_{inputs}, n_{features})$. Each\n", + "row represents an *input*, in this case a handwritten digit, and\n", + "each column represents a *feature*, in this case a pixel. The\n", + "correct answers, also known as *labels* or *targets* are\n", + "represented as a 1D array of integers \n", + "$Y = (n_{inputs}) = (5, 3, 1, 8,...)$.\n", + "\n", + "As an example, say we want to build a neural network using supervised learning to predict Body-Mass Index (BMI) from\n", + "measurements of height (in m) \n", + "and weight (in kg). If we have measurements of 5 people the design/feature matrix could be for example: \n", + "\n", + "$$ X = \\begin{bmatrix}\n", + "1.85 & 81\\\\\n", + "1.71 & 65\\\\\n", + "1.95 & 103\\\\\n", + "1.55 & 42\\\\\n", + "1.63 & 56\n", + "\\end{bmatrix} ,$$ \n", + "\n", + "and the targets would be: \n", + "\n", + "$$ Y = (23.7, 22.2, 27.1, 17.5, 21.1) $$ \n", + "\n", + "Since each input image is a 2D matrix, we need to flatten the image\n", + "(i.e. \"unravel\" the 2D matrix into a 1D array) to turn the data into a\n", + "design/feature matrix. This means we lose all spatial information in the\n", + "image, such as locality and translational invariance. More complicated\n", + "architectures such as Convolutional Neural Networks can take advantage\n", + "of such information, and are most commonly applied when analyzing\n", + "images." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "87c0ee64", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "inputs = (n_inputs, pixel_width, pixel_height) = (1797, 8, 8)\n", + "labels = (n_inputs) = (1797,)\n", + "X = (n_inputs, n_features) = (1797, 64)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/week43_20_1.png" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn import datasets\n", + "\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# display images in notebook\n", + "%matplotlib inline\n", + "plt.rcParams['figure.figsize'] = (12,12)\n", + "\n", + "\n", + "# download MNIST dataset\n", + "digits = datasets.load_digits()\n", + "\n", + "# define inputs and labels\n", + "inputs = digits.images\n", + "labels = digits.target\n", + "\n", + "print(\"inputs = (n_inputs, pixel_width, pixel_height) = \" + str(inputs.shape))\n", + "print(\"labels = (n_inputs) = \" + str(labels.shape))\n", + "\n", + "\n", + "# flatten the image\n", + "# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64\n", + "n_inputs = len(inputs)\n", + "inputs = inputs.reshape(n_inputs, -1)\n", + "print(\"X = (n_inputs, n_features) = \" + str(inputs.shape))\n", + "\n", + "\n", + "# choose some random images to display\n", + "indices = np.arange(n_inputs)\n", + "random_indices = np.random.choice(indices, size=5)\n", + "\n", + "for i, image in enumerate(digits.images[random_indices]):\n", + " plt.subplot(1, 5, i+1)\n", + " plt.axis('off')\n", + " plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')\n", + " plt.title(\"Label: %d\" % digits.target[random_indices[i]])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "4e780f35", + "metadata": { + "editable": true + }, + "source": [ + "## Train and test datasets\n", + "\n", + "Performing analysis before partitioning the dataset is a major error, that can lead to incorrect conclusions. \n", + "\n", + "We will reserve $80 \\%$ of our dataset for training and $20 \\%$ for testing. \n", + "\n", + "It is important that the train and test datasets are drawn randomly from our dataset, to ensure\n", + "no bias in the sampling. \n", + "Say you are taking measurements of weather data to predict the weather in the coming 5 days.\n", + "You don't want to train your model on measurements taken from the hours 00.00 to 12.00, and then test it on data\n", + "collected from 12.00 to 24.00." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "bb737921", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of training images: 1437\n", + "Number of test images: 360\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "\n", + "# one-liner from scikit-learn library\n", + "train_size = 0.8\n", + "test_size = 1 - train_size\n", + "X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,\n", + " test_size=test_size)\n", + "\n", + "# equivalently in numpy\n", + "def train_test_split_numpy(inputs, labels, train_size, test_size):\n", + " n_inputs = len(inputs)\n", + " inputs_shuffled = inputs.copy()\n", + " labels_shuffled = labels.copy()\n", + " \n", + " np.random.shuffle(inputs_shuffled)\n", + " np.random.shuffle(labels_shuffled)\n", + " \n", + " train_end = int(n_inputs*train_size)\n", + " X_train, X_test = inputs_shuffled[:train_end], inputs_shuffled[train_end:]\n", + " Y_train, Y_test = labels_shuffled[:train_end], labels_shuffled[train_end:]\n", + " \n", + " return X_train, X_test, Y_train, Y_test\n", + "\n", + "#X_train, X_test, Y_train, Y_test = train_test_split_numpy(inputs, labels, train_size, test_size)\n", + "\n", + "print(\"Number of training images: \" + str(len(X_train)))\n", + "print(\"Number of test images: \" + str(len(X_test)))" + ] + }, + { + "cell_type": "markdown", + "id": "ffb0a087", + "metadata": { + "editable": true + }, + "source": [ + "## Define model and architecture\n", + "\n", + "Our simple feed-forward neural network will consist of an *input* layer, a single *hidden* layer and an *output* layer. The activation $y$ of each neuron is a weighted sum of inputs, passed through an activation function. In case of the simple perceptron model we have \n", + "\n", + "$$ z = \\sum_{i=1}^n w_i a_i ,$$\n", + "\n", + "$$ y = f(z) ,$$\n", + "\n", + "where $f$ is the activation function, $a_i$ represents input from neuron $i$ in the preceding layer\n", + "and $w_i$ is the weight to input $i$. \n", + "The activation of the neurons in the input layer is just the features (e.g. a pixel value). \n", + "\n", + "The simplest activation function for a neuron is the *Heaviside* function:\n", + "\n", + "$$ f(z) = \n", + "\\begin{cases}\n", + "1, & z > 0\\\\\n", + "0, & \\text{otherwise}\n", + "\\end{cases}\n", + "$$\n", + "\n", + "A feed-forward neural network with this activation is known as a *perceptron*. \n", + "For a binary classifier (i.e. two classes, 0 or 1, dog or not-dog) we can also use this in our output layer. \n", + "This activation can be generalized to $k$ classes (using e.g. the *one-against-all* strategy), \n", + "and we call these architectures *multiclass perceptrons*. \n", + "\n", + "However, it is now common to use the terms Single Layer Perceptron (SLP) (1 hidden layer) and \n", + "Multilayer Perceptron (MLP) (2 or more hidden layers) to refer to feed-forward neural networks with any activation function. \n", + "\n", + "Typical choices for activation functions include the sigmoid function, hyperbolic tangent, and Rectified Linear Unit (ReLU). \n", + "We will be using the sigmoid function $\\sigma(x)$: \n", + "\n", + "$$ f(x) = \\sigma(x) = \\frac{1}{1 + e^{-x}} ,$$\n", + "\n", + "which is inspired by probability theory (see logistic regression) and was most commonly used until about 2011. See the discussion below concerning other activation functions." + ] + }, + { + "cell_type": "markdown", + "id": "fed0ab83", + "metadata": { + "editable": true + }, + "source": [ + "## Layers\n", + "\n", + "* Input \n", + "\n", + "Since each input image has 8x8 = 64 pixels or features, we have an input layer of 64 neurons. \n", + "\n", + "* Hidden layer\n", + "\n", + "We will use 50 neurons in the hidden layer receiving input from the neurons in the input layer. \n", + "Since each neuron in the hidden layer is connected to the 64 inputs we have 64x50 = 3200 weights to the hidden layer. \n", + "\n", + "* Output\n", + "\n", + "If we were building a binary classifier, it would be sufficient with a single neuron in the output layer,\n", + "which could output 0 or 1 according to the Heaviside function. This would be an example of a *hard* classifier, meaning it outputs the class of the input directly. However, if we are dealing with noisy data it is often beneficial to use a *soft* classifier, which outputs the probability of being in class 0 or 1. \n", + "\n", + "For a soft binary classifier, we could use a single neuron and interpret the output as either being the probability of being in class 0 or the probability of being in class 1. Alternatively we could use 2 neurons, and interpret each neuron as the probability of being in each class. \n", + "\n", + "Since we are doing multiclass classification, with 10 categories, it is natural to use 10 neurons in the output layer. We number the neurons $j = 0,1,...,9$. The activation of each output neuron $j$ will be according to the *softmax* function: \n", + "\n", + "$$ P(\\text{class $j$} \\mid \\text{input $\\boldsymbol{a}$}) = \\frac{\\exp{(\\boldsymbol{a}^T \\boldsymbol{w}_j)}}\n", + "{\\sum_{c=0}^{9} \\exp{(\\boldsymbol{a}^T \\boldsymbol{w}_c)}} ,$$ \n", + "\n", + "i.e. each neuron $j$ outputs the probability of being in class $j$ given an input from the hidden layer $\\boldsymbol{a}$, with $\\boldsymbol{w}_j$ the weights of neuron $j$ to the inputs. \n", + "The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1. \n", + "The exponent is just the weighted sum of inputs as before: \n", + "\n", + "$$ z_j = \\sum_{i=1}^n w_ {ij} a_i+b_j.$$ \n", + "\n", + "Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500\n", + "weights to the output layer." + ] + }, + { + "cell_type": "markdown", + "id": "6f3ab464", + "metadata": { + "editable": true + }, + "source": [ + "## Weights and biases\n", + "\n", + "Typically weights are initialized with small values distributed around zero, drawn from a uniform\n", + "or normal distribution. Setting all weights to zero means all neurons give the same output, making the network useless. \n", + "\n", + "Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range\n", + "of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron $j$, $b_j$: \n", + "\n", + "$$ z_j = \\sum_{i=1}^n w_ {ij} a_i + b_j.$$ \n", + "\n", + "The bias weights $\\boldsymbol{b}$ are often initialized to zero, but a small value like $0.01$ ensures all neurons have some output which can be backpropagated in the first training cycle." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6745d89e", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# building our neural network\n", + "\n", + "n_inputs, n_features = X_train.shape\n", + "n_hidden_neurons = 50\n", + "n_categories = 10\n", + "\n", + "# we make the weights normally distributed using numpy.random.randn\n", + "\n", + "# weights and bias in the hidden layer\n", + "hidden_weights = np.random.randn(n_features, n_hidden_neurons)\n", + "hidden_bias = np.zeros(n_hidden_neurons) + 0.01\n", + "\n", + "# weights and bias in the output layer\n", + "output_weights = np.random.randn(n_hidden_neurons, n_categories)\n", + "output_bias = np.zeros(n_categories) + 0.01" + ] + }, + { + "cell_type": "markdown", + "id": "c06d038e", + "metadata": { + "editable": true + }, + "source": [ + "## Feed-forward pass\n", + "\n", + "Denote $F$ the number of features, $H$ the number of hidden neurons and $C$ the number of categories. \n", + "For each input image we calculate a weighted sum of input features (pixel values) to each neuron $j$ in the hidden layer $l$: \n", + "\n", + "$$ z_{j}^{l} = \\sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},$$\n", + "\n", + "this is then passed through our activation function \n", + "\n", + "$$ a_{j}^{l} = f(z_{j}^{l}) .$$ \n", + "\n", + "We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron $j$ in the output layer: \n", + "\n", + "$$ z_{j}^{L} = \\sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.$$ \n", + "\n", + "Finally we calculate the output of neuron $j$ in the output layer using the softmax function: \n", + "\n", + "$$ a_{j}^{L} = \\frac{\\exp{(z_j^{L})}}\n", + "{\\sum_{c=0}^{C-1} \\exp{(z_c^{L})}} .$$" + ] + }, + { + "cell_type": "markdown", + "id": "4f0e93ce", + "metadata": { + "editable": true + }, + "source": [ + "## Matrix multiplications\n", + "\n", + "Since our data has the dimensions $X = (n_{inputs}, n_{features})$ and our weights to the hidden\n", + "layer have the dimensions \n", + "$W_{hidden} = (n_{features}, n_{hidden})$,\n", + "we can easily feed the network all our training data in one go by taking the matrix product \n", + "\n", + "$$ X W^{h} = (n_{inputs}, n_{hidden}),$$ \n", + "\n", + "and obtain a matrix that holds the weighted sum of inputs to the hidden layer\n", + "for each input image and each hidden neuron. \n", + "We also add the bias to obtain a matrix of weighted sums to the hidden layer $Z^{h}$: \n", + "\n", + "$$ \\boldsymbol{z}^{l} = \\boldsymbol{X} \\boldsymbol{W}^{l} + \\boldsymbol{b}^{l} ,$$\n", + "\n", + "meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image. \n", + "This is then passed through the activation: \n", + "\n", + "$$ \\boldsymbol{a}^{l} = f(\\boldsymbol{z}^l) .$$ \n", + "\n", + "This is fed to the output layer: \n", + "\n", + "$$ \\boldsymbol{z}^{L} = \\boldsymbol{a}^{L} \\boldsymbol{W}^{L} + \\boldsymbol{b}^{L} .$$\n", + "\n", + "Finally we receive our output values for each image and each category by passing it through the softmax function: \n", + "\n", + "$$ output = softmax (\\boldsymbol{z}^{L}) = (n_{inputs}, n_{categories}) .$$" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3c39783f", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "probabilities = (n_inputs, n_categories) = (1437, 10)\n", + "probability that image 0 is in category 0,1,2,...,9 = \n", + "[5.41511965e-04 2.17174962e-03 8.84355903e-03 1.44970586e-03\n", + " 1.10378326e-04 5.08318298e-09 2.03256632e-04 1.92507116e-03\n", + " 9.84443254e-01 3.11507992e-04]\n", + "probabilities sum up to: 1.0\n", + "\n", + "predictions = (n_inputs) = (1437,)\n", + "prediction for image 0: 8\n", + "correct label for image 0: 6\n" + ] + } + ], + "source": [ + "# setup the feed-forward pass, subscript h = hidden layer\n", + "\n", + "def sigmoid(x):\n", + " return 1/(1 + np.exp(-x))\n", + "\n", + "def feed_forward(X):\n", + " # weighted sum of inputs to the hidden layer\n", + " z_h = np.matmul(X, hidden_weights) + hidden_bias\n", + " # activation in the hidden layer\n", + " a_h = sigmoid(z_h)\n", + " \n", + " # weighted sum of inputs to the output layer\n", + " z_o = np.matmul(a_h, output_weights) + output_bias\n", + " # softmax output\n", + " # axis 0 holds each input and axis 1 the probabilities of each category\n", + " exp_term = np.exp(z_o)\n", + " probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + " \n", + " return probabilities\n", + "\n", + "probabilities = feed_forward(X_train)\n", + "print(\"probabilities = (n_inputs, n_categories) = \" + str(probabilities.shape))\n", + "print(\"probability that image 0 is in category 0,1,2,...,9 = \\n\" + str(probabilities[0]))\n", + "print(\"probabilities sum up to: \" + str(probabilities[0].sum()))\n", + "print()\n", + "\n", + "# we obtain a prediction by taking the class with the highest likelihood\n", + "def predict(X):\n", + " probabilities = feed_forward(X)\n", + " return np.argmax(probabilities, axis=1)\n", + "\n", + "predictions = predict(X_train)\n", + "print(\"predictions = (n_inputs) = \" + str(predictions.shape))\n", + "print(\"prediction for image 0: \" + str(predictions[0]))\n", + "print(\"correct label for image 0: \" + str(Y_train[0]))" + ] + }, + { + "cell_type": "markdown", + "id": "c956d7fe", + "metadata": { + "editable": true + }, + "source": [ + "## Choose cost function and optimizer\n", + "\n", + "To measure how well our neural network is doing we need to introduce a cost function. \n", + "We will call the function that gives the error of a single sample output the *loss* function, and the function\n", + "that gives the total error of our network across all samples the *cost* function.\n", + "A typical choice for multiclass classification is the *cross-entropy* loss, also known as the negative log likelihood. \n", + "\n", + "In *multiclass* classification it is common to treat each integer label as a so called *one-hot* vector: \n", + "\n", + "$$ y = 5 \\quad \\rightarrow \\quad \\boldsymbol{y} = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ,$$ \n", + "\n", + "$$ y = 1 \\quad \\rightarrow \\quad \\boldsymbol{y} = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ,$$ \n", + "\n", + "i.e. a binary bit string of length $C$, where $C = 10$ is the number of classes in the MNIST dataset. \n", + "\n", + "Let $y_{ic}$ denote the $c$-th component of the $i$-th one-hot vector. \n", + "We define the cost function $\\mathcal{C}$ as a sum over the cross-entropy loss for each point $\\boldsymbol{x}_i$ in the dataset.\n", + "\n", + "In the one-hot representation only one of the terms in the loss function is non-zero, namely the\n", + "probability of the correct category $c'$ \n", + "(i.e. the category $c'$ such that $y_{ic'} = 1$). This means that the cross entropy loss only punishes you for how wrong\n", + "you got the correct label. The probability of category $c$ is given by the softmax function. The vector $\\boldsymbol{\\theta}$ represents the parameters of our network, i.e. all the weights and biases." + ] + }, + { + "cell_type": "markdown", + "id": "e939a07d", + "metadata": { + "editable": true + }, + "source": [ + "## Optimizing the cost function\n", + "\n", + "The network is trained by finding the weights and biases that minimize the cost function. One of the most widely used classes of methods is *gradient descent* and its generalizations. The idea behind gradient descent\n", + "is simply to adjust the weights in the direction where the gradient of the cost function is large and negative. This ensures we flow toward a *local* minimum of the cost function. \n", + "Each parameter $\\theta$ is iteratively adjusted according to the rule \n", + "\n", + "$$ \\theta_{i+1} = \\theta_i - \\eta \\nabla \\mathcal{C}(\\theta_i) ,$$\n", + "\n", + "where $\\eta$ is known as the *learning rate*, which controls how big a step we take towards the minimum. \n", + "This update can be repeated for any number of iterations, or until we are satisfied with the result. \n", + "\n", + "A simple and effective improvement is a variant called *Batch Gradient Descent*. \n", + "Instead of calculating the gradient on the whole dataset, we calculate an approximation of the gradient\n", + "on a subset of the data called a *minibatch*. \n", + "If there are $N$ data points and we have a minibatch size of $M$, the total number of batches\n", + "is $N/M$. \n", + "We denote each minibatch $B_k$, with $k = 1, 2,...,N/M$. The gradient then becomes: \n", + "\n", + "$$ \\nabla \\mathcal{C}(\\theta) = \\frac{1}{N} \\sum_{i=1}^N \\nabla \\mathcal{L}_i(\\theta) \\quad \\rightarrow \\quad\n", + "\\frac{1}{M} \\sum_{i \\in B_k} \\nabla \\mathcal{L}_i(\\theta) ,$$\n", + "\n", + "i.e. instead of averaging the loss over the entire dataset, we average over a minibatch. \n", + "\n", + "This has two important benefits: \n", + "1. Introducing stochasticity decreases the chance that the algorithm becomes stuck in a local minima. \n", + "\n", + "2. It significantly speeds up the calculation, since we do not have to use the entire dataset to calculate the gradient. \n", + "\n", + "The various optmization methods, with codes and algorithms, are discussed in our lectures on [Gradient descent approaches](https://compphysics.github.io/MachineLearning/doc/pub/Splines/html/Splines-bs.html)." + ] + }, + { + "cell_type": "markdown", + "id": "ccdee2fd", + "metadata": { + "editable": true + }, + "source": [ + "## Regularization\n", + "\n", + "It is common to add an extra term to the cost function, proportional\n", + "to the size of the weights. This is equivalent to constraining the\n", + "size of the weights, so that they do not grow out of control.\n", + "Constraining the size of the weights means that the weights cannot\n", + "grow arbitrarily large to fit the training data, and in this way\n", + "reduces *overfitting*.\n", + "\n", + "We will measure the size of the weights using the so called *L2-norm*, meaning our cost function becomes: \n", + "\n", + "$$ \\mathcal{C}(\\theta) = \\frac{1}{N} \\sum_{i=1}^N \\mathcal{L}_i(\\theta) \\quad \\rightarrow \\quad\n", + "\\frac{1}{N} \\sum_{i=1}^N \\mathcal{L}_i(\\theta) + \\lambda \\lvert \\lvert \\boldsymbol{w} \\rvert \\rvert_2^2 \n", + "= \\frac{1}{N} \\sum_{i=1}^N \\mathcal{L}(\\theta) + \\lambda \\sum_{ij} w_{ij}^2,$$ \n", + "\n", + "i.e. we sum up all the weights squared. The factor $\\lambda$ is known as a regularization parameter.\n", + "\n", + "In order to train the model, we need to calculate the derivative of\n", + "the cost function with respect to every bias and weight in the\n", + "network. In total our network has $(64 + 1)\\times 50=3250$ weights in\n", + "the hidden layer and $(50 + 1)\\times 10=510$ weights to the output\n", + "layer ($+1$ for the bias), and the gradient must be calculated for\n", + "every parameter. We use the *backpropagation* algorithm discussed\n", + "above. This is a clever use of the chain rule that allows us to\n", + "calculate the gradient efficently." + ] + }, + { + "cell_type": "markdown", + "id": "1bf8ea1a", + "metadata": { + "editable": true + }, + "source": [ + "## Matrix multiplication\n", + "\n", + "To more efficently train our network these equations are implemented using matrix operations. \n", + "The error in the output layer is calculated simply as, with $\\boldsymbol{t}$ being our targets, \n", + "\n", + "$$ \\delta_L = \\boldsymbol{t} - \\boldsymbol{y} = (n_{inputs}, n_{categories}) .$$ \n", + "\n", + "The gradient for the output weights is calculated as \n", + "\n", + "$$ \\nabla W_{L} = \\boldsymbol{a}^T \\delta_L = (n_{hidden}, n_{categories}) ,$$\n", + "\n", + "where $\\boldsymbol{a} = (n_{inputs}, n_{hidden})$. This simply means that we are summing up the gradients for each input. \n", + "Since we are going backwards we have to transpose the activation matrix. \n", + "\n", + "The gradient with respect to the output bias is then \n", + "\n", + "$$ \\nabla \\boldsymbol{b}_{L} = \\sum_{i=1}^{n_{inputs}} \\delta_L = (n_{categories}) .$$ \n", + "\n", + "The error in the hidden layer is \n", + "\n", + "$$ \\Delta_h = \\delta_L W_{L}^T \\circ f'(z_{h}) = \\delta_L W_{L}^T \\circ a_{h} \\circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,$$ \n", + "\n", + "where $f'(a_{h})$ is the derivative of the activation in the hidden layer. The matrix products mean\n", + "that we are summing up the products for each neuron in the output layer. The symbol $\\circ$ denotes\n", + "the *Hadamard product*, meaning element-wise multiplication. \n", + "\n", + "This again gives us the gradients in the hidden layer: \n", + "\n", + "$$ \\nabla W_{h} = X^T \\delta_h = (n_{features}, n_{hidden}) ,$$ \n", + "\n", + "$$ \\nabla b_{h} = \\sum_{i=1}^{n_{inputs}} \\delta_h = (n_{hidden}) .$$" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "addc476d", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Old accuracy on training data: 0.1440501043841336\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "New accuracy on training data: 0.09951287404314545\n" + ] + } + ], + "source": [ + "# to categorical turns our integer vector into a onehot representation\n", + "from sklearn.metrics import accuracy_score\n", + "\n", + "# one-hot in numpy\n", + "def to_categorical_numpy(integer_vector):\n", + " n_inputs = len(integer_vector)\n", + " n_categories = np.max(integer_vector) + 1\n", + " onehot_vector = np.zeros((n_inputs, n_categories))\n", + " onehot_vector[range(n_inputs), integer_vector] = 1\n", + " \n", + " return onehot_vector\n", + "\n", + "#Y_train_onehot, Y_test_onehot = to_categorical(Y_train), to_categorical(Y_test)\n", + "Y_train_onehot, Y_test_onehot = to_categorical_numpy(Y_train), to_categorical_numpy(Y_test)\n", + "\n", + "def feed_forward_train(X):\n", + " # weighted sum of inputs to the hidden layer\n", + " z_h = np.matmul(X, hidden_weights) + hidden_bias\n", + " # activation in the hidden layer\n", + " a_h = sigmoid(z_h)\n", + " \n", + " # weighted sum of inputs to the output layer\n", + " z_o = np.matmul(a_h, output_weights) + output_bias\n", + " # softmax output\n", + " # axis 0 holds each input and axis 1 the probabilities of each category\n", + " exp_term = np.exp(z_o)\n", + " probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + " \n", + " # for backpropagation need activations in hidden and output layers\n", + " return a_h, probabilities\n", + "\n", + "def backpropagation(X, Y):\n", + " a_h, probabilities = feed_forward_train(X)\n", + " \n", + " # error in the output layer\n", + " error_output = probabilities - Y\n", + " # error in the hidden layer\n", + " error_hidden = np.matmul(error_output, output_weights.T) * a_h * (1 - a_h)\n", + " \n", + " # gradients for the output layer\n", + " output_weights_gradient = np.matmul(a_h.T, error_output)\n", + " output_bias_gradient = np.sum(error_output, axis=0)\n", + " \n", + " # gradient for the hidden layer\n", + " hidden_weights_gradient = np.matmul(X.T, error_hidden)\n", + " hidden_bias_gradient = np.sum(error_hidden, axis=0)\n", + "\n", + " return output_weights_gradient, output_bias_gradient, hidden_weights_gradient, hidden_bias_gradient\n", + "\n", + "print(\"Old accuracy on training data: \" + str(accuracy_score(predict(X_train), Y_train)))\n", + "\n", + "eta = 0.01\n", + "lmbd = 0.01\n", + "for i in range(1000):\n", + " # calculate gradients\n", + " dWo, dBo, dWh, dBh = backpropagation(X_train, Y_train_onehot)\n", + " \n", + " # regularization term gradients\n", + " dWo += lmbd * output_weights\n", + " dWh += lmbd * hidden_weights\n", + " \n", + " # update weights and biases\n", + " output_weights -= eta * dWo\n", + " output_bias -= eta * dBo\n", + " hidden_weights -= eta * dWh\n", + " hidden_bias -= eta * dBh\n", + "\n", + "print(\"New accuracy on training data: \" + str(accuracy_score(predict(X_train), Y_train)))" + ] + }, + { + "cell_type": "markdown", + "id": "435d5f8e", + "metadata": { + "editable": true + }, + "source": [ + "## Improving performance\n", + "\n", + "As we can see the network does not seem to be learning at all. It seems to be just guessing the label for each image. \n", + "In order to obtain a network that does something useful, we will have to do a bit more work. \n", + "\n", + "The choice of *hyperparameters* such as learning rate and regularization parameter is hugely influential for the performance of the network. Typically a *grid-search* is performed, wherein we test different hyperparameters separated by orders of magnitude. For example we could test the learning rates $\\eta = 10^{-6}, 10^{-5},...,10^{-1}$ with different regularization parameters $\\lambda = 10^{-6},...,10^{-0}$. \n", + "\n", + "Next, we haven't implemented minibatching yet, which introduces stochasticity and is though to act as an important regularizer on the weights. We call a feed-forward + backward pass with a minibatch an *iteration*, and a full training period\n", + "going through the entire dataset ($n/M$ batches) an *epoch*.\n", + "\n", + "If this does not improve network performance, you may want to consider altering the network architecture, adding more neurons or hidden layers. \n", + "Andrew Ng goes through some of these considerations in this [video](https://youtu.be/F1ka6a13S9I). You can find a summary of the video [here](https://kevinzakka.github.io/2016/09/26/applying-deep-learning/)." + ] + }, + { + "cell_type": "markdown", + "id": "4d67793b", + "metadata": { + "editable": true + }, + "source": [ + "## Full object-oriented implementation\n", + "\n", + "It is very natural to think of the network as an object, with specific instances of the network\n", + "being realizations of this object with different hyperparameters. An implementation using Python classes provides a clean structure and interface, and the full implementation of our neural network is given below." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e189ad94", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "class NeuralNetwork:\n", + " def __init__(\n", + " self,\n", + " X_data,\n", + " Y_data,\n", + " n_hidden_neurons=50,\n", + " n_categories=10,\n", + " epochs=10,\n", + " batch_size=100,\n", + " eta=0.1,\n", + " lmbd=0.0):\n", + "\n", + " self.X_data_full = X_data\n", + " self.Y_data_full = Y_data\n", + "\n", + " self.n_inputs = X_data.shape[0]\n", + " self.n_features = X_data.shape[1]\n", + " self.n_hidden_neurons = n_hidden_neurons\n", + " self.n_categories = n_categories\n", + "\n", + " self.epochs = epochs\n", + " self.batch_size = batch_size\n", + " self.iterations = self.n_inputs // self.batch_size\n", + " self.eta = eta\n", + " self.lmbd = lmbd\n", + "\n", + " self.create_biases_and_weights()\n", + "\n", + " def create_biases_and_weights(self):\n", + " self.hidden_weights = np.random.randn(self.n_features, self.n_hidden_neurons)\n", + " self.hidden_bias = np.zeros(self.n_hidden_neurons) + 0.01\n", + "\n", + " self.output_weights = np.random.randn(self.n_hidden_neurons, self.n_categories)\n", + " self.output_bias = np.zeros(self.n_categories) + 0.01\n", + "\n", + " def feed_forward(self):\n", + " # feed-forward for training\n", + " self.z_h = np.matmul(self.X_data, self.hidden_weights) + self.hidden_bias\n", + " self.a_h = sigmoid(self.z_h)\n", + "\n", + " self.z_o = np.matmul(self.a_h, self.output_weights) + self.output_bias\n", + "\n", + " exp_term = np.exp(self.z_o)\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + "\n", + " def feed_forward_out(self, X):\n", + " # feed-forward for output\n", + " z_h = np.matmul(X, self.hidden_weights) + self.hidden_bias\n", + " a_h = sigmoid(z_h)\n", + "\n", + " z_o = np.matmul(a_h, self.output_weights) + self.output_bias\n", + " \n", + " exp_term = np.exp(z_o)\n", + " probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + " return probabilities\n", + "\n", + " def backpropagation(self):\n", + " error_output = self.probabilities - self.Y_data\n", + " error_hidden = np.matmul(error_output, self.output_weights.T) * self.a_h * (1 - self.a_h)\n", + "\n", + " self.output_weights_gradient = np.matmul(self.a_h.T, error_output)\n", + " self.output_bias_gradient = np.sum(error_output, axis=0)\n", + "\n", + " self.hidden_weights_gradient = np.matmul(self.X_data.T, error_hidden)\n", + " self.hidden_bias_gradient = np.sum(error_hidden, axis=0)\n", + "\n", + " if self.lmbd > 0.0:\n", + " self.output_weights_gradient += self.lmbd * self.output_weights\n", + " self.hidden_weights_gradient += self.lmbd * self.hidden_weights\n", + "\n", + " self.output_weights -= self.eta * self.output_weights_gradient\n", + " self.output_bias -= self.eta * self.output_bias_gradient\n", + " self.hidden_weights -= self.eta * self.hidden_weights_gradient\n", + " self.hidden_bias -= self.eta * self.hidden_bias_gradient\n", + "\n", + " def predict(self, X):\n", + " probabilities = self.feed_forward_out(X)\n", + " return np.argmax(probabilities, axis=1)\n", + "\n", + " def predict_probabilities(self, X):\n", + " probabilities = self.feed_forward_out(X)\n", + " return probabilities\n", + "\n", + " def train(self):\n", + " data_indices = np.arange(self.n_inputs)\n", + "\n", + " for i in range(self.epochs):\n", + " for j in range(self.iterations):\n", + " # pick datapoints with replacement\n", + " chosen_datapoints = np.random.choice(\n", + " data_indices, size=self.batch_size, replace=False\n", + " )\n", + "\n", + " # minibatch training data\n", + " self.X_data = self.X_data_full[chosen_datapoints]\n", + " self.Y_data = self.Y_data_full[chosen_datapoints]\n", + "\n", + " self.feed_forward()\n", + " self.backpropagation()" + ] + }, + { + "cell_type": "markdown", + "id": "131559a9", + "metadata": { + "editable": true + }, + "source": [ + "## Evaluate model performance on test data\n", + "\n", + "To measure the performance of our network we evaluate how well it does it data it has never seen before, i.e. the test data. \n", + "We measure the performance of the network using the *accuracy* score. \n", + "The accuracy is as you would expect just the number of images correctly labeled divided by the total number of images. A perfect classifier will have an accuracy score of $1$. \n", + "\n", + "$$ \\text{Accuracy} = \\frac{\\sum_{i=1}^n I(\\tilde{y}_i = y_i)}{n} ,$$ \n", + "\n", + "where $I$ is the indicator function, $1$ if $\\tilde{y}_i = y_i$ and $0$ otherwise." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "6014b15e", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy score on test set: 0.9444444444444444\n" + ] + } + ], + "source": [ + "epochs = 100\n", + "batch_size = 100\n", + "\n", + "dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,\n", + " n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)\n", + "dnn.train()\n", + "test_predict = dnn.predict(X_test)\n", + "\n", + "# accuracy score from scikit library\n", + "print(\"Accuracy score on test set: \", accuracy_score(Y_test, test_predict))\n", + "\n", + "# equivalent in numpy\n", + "def accuracy_score_numpy(Y_test, Y_pred):\n", + " return np.sum(Y_test == Y_pred) / len(Y_test)\n", + "\n", + "#print(\"Accuracy score on test set: \", accuracy_score_numpy(Y_test, test_predict))" + ] + }, + { + "cell_type": "markdown", + "id": "a215be5c", + "metadata": { + "editable": true + }, + "source": [ + "## Adjust hyperparameters\n", + "\n", + "We now perform a grid search to find the optimal hyperparameters for the network. \n", + "Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around $98\\%$ ($2\\%$ error rate)." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "3c371733", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.11666666666666667\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.20833333333333334\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.12222222222222222\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.14722222222222223\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.17777777777777778\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.16111111111111112\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.20277777777777778\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.5305555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.5944444444444444\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.5888888888888889\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.6111111111111112\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.5222222222222223\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.5555555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.8055555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.85\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.85\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.875\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.8666666666666667\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.8638888888888889\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.9555555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.925\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.9472222222222222\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.9277777777777778\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.9472222222222222\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.9305555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.9555555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.7694444444444445\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.19166666666666668\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.10555555555555556\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.08611111111111111\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.10555555555555556\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.08888888888888889\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.08611111111111111\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.08888888888888889\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.09166666666666666\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.10555555555555556\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + } + ], + "source": [ + "eta_vals = np.logspace(-5, 1, 7)\n", + "lmbd_vals = np.logspace(-5, 1, 7)\n", + "# store the models for later use\n", + "DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + "\n", + "# grid search\n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,\n", + " n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)\n", + " dnn.train()\n", + " \n", + " DNN_numpy[i][j] = dnn\n", + " \n", + " test_predict = dnn.predict(X_test)\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Accuracy score on test set: \", accuracy_score(Y_test, test_predict))\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "id": "ed44fd1b", + "metadata": { + "editable": true + }, + "source": [ + "## Visualization" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "38c2057e", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_87501/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAANbCAYAAAC6lftqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAACRMklEQVR4nOzdd3xT1f/H8Xc60l2grLI3lLJlyxKBrwMHCigoCKK4AVFZDlREUUFRVBQFVESGIuDCHyIuUNmbAjLLKpRRKJ1pk/z+SKmEthAguSnN6/l49KE5uTf35MPh0s89n3uuyW632wUAAAAABvDzdgcAAAAA+A4SEAAAAACGIQEBAAAAYBgSEAAAAACGIQEBAAAAYBgSEAAAAACGIQEBAAAAYBgSEAAAAACGIQEBAAAAYBgSEABXpZEjR6pOnToX/Ln++uuv6Bjz589XnTp1dPDgQY/uc6UOHDigmJgYtWjRQhkZGYYdFwCAy2Gy2+12b3cCAC7V/v37dfLkydzXkydPVlxcnN5///3cNrPZrNjY2Ms+xsmTJ7V//37FxsbKbDZ7bJ8rNXHiRC1evFgHDx7UK6+8ojvuuMOQ4wIAcDlIQAAUCSNHjtSqVav066+/ersrhrLZbLr++uvVrVs3xcXF6fTp05o7d663uwUAQIEowQJQpK1cuVJ16tTRnDlz1LFjR1177bVavny5JOnrr7/WnXfeqcaNG6thw4a6/fbbtWjRotx9zy+nGjlypPr3769vvvlGN9xwg+rXr6/bbrtNf/zxxxXtI0nr16/Xvffeq8aNG+u6667T559/rv79+2vkyJEX/H7Lly9XQkKCOnbsqNtuu00bNmzQ9u3b82x34sQJPfvss7r22mvVpEkT3XvvvVq7dm3u+1lZWfrggw/UuXNnNWzYUF27dtU333yT+37fvn3Vt2/ffGO7cuXK3O8eGxurr7/+Wm3btlX79u21c+dOWa1Wffzxx7rlllvUsGFDNW7cWL169dI///zj9HlbtmzRgw8+qKZNm6pVq1YaOnSoEhISlJ2drbZt2+rpp5/O871uuukmjRo16oIxAgAULiQgAHzCxIkTNWLECI0YMUKNGzfWl19+qdGjR6tTp06aMmWKxo8fr8DAQA0bNkyHDx8u8HO2bNmiadOmafDgwfrggw8UEBCgwYMH6/Tp05e9z+7du9W/f39J0ttvv61Bgwbp448/dkoQCvLNN9+oWrVqatSokbp06aLIyEjNnj3baZu0tDT16tVLf//9t55++mm9//77CgsL04MPPqjdu3dLkkaMGKGPP/5YPXr00JQpU9ShQwc9++yzWrhw4UX7cC6r1aqPPvpIY8eO1ZNPPqmaNWtqwoQJ+uCDD3T33Xdr6tSpGjNmjJKSkjRkyBClpaVJkrZv367evXsrPT1dr7/+usaMGaO4uDgNGDBAdrtd3bp10y+//KKUlJTcY23cuFF79uzRnXfeeUl9BAB4V4C3OwAARujVq5duvPHG3NcHDhzQgAED9Pjjj+e2VaxYUXfeeafWrVun8uXL5/s5Z86c0fz581W5cmVJUmhoqPr06aMVK1bohhtuuKx9pkyZovDwcE2dOlUhISGSpOrVq6tXr14X/E6nTp3Sr7/+qkGDBkmSgoKC1LVrV3333XcaPny4wsLCJEkLFizQgQMHtHDhQsXExEiSmjVrpm7dumn16tWy2Wz68ccf9dxzz+m+++6TJLVu3VqHDx/WypUr1a1btwv243yPPPKIrrvuutzXiYmJGjp0qNMMSnBwsAYNGqQdO3aoSZMmmjx5sooVK6bp06crKChIkhQdHa0nn3xSO3bsUPfu3fXJJ59o8eLF6t69e+73qly5spo1a3ZJ/QMAeBcJCACfUKdOHafXZ0ubzpw5o3379mnfvn25JUFZWVkFfk5UVFRuIiE5fkmWpPT09MveZ8WKFerQoUNu8iFJTZo0UYUKFS74nb777jtlZ2fr+uuvV3JysiTphhtu0OzZs/X999/nJjBr1qxRxYoVc5MPyZGs/PTTT5KUO2PSpUsXp89/5513Lnj8gtSuXdvp9VtvvSXJcYN+fHy89u7dm3uvztlYr127Vh06dMhNPiSpYcOGTvf0NG3aVN9++626d+8ui8WiRYsWqV+/fjKZTJfVTwCAd5CAAPAJJUuWdHq9f/9+jR49WitWrFBAQICqV6+em6RcaG2Oc5MESbm//Npstsve5+TJk3n6J0mlS5cu8DMlxz0XNptNXbt2zfPenDlzchOQU6dO5fv5Z506dUpS3hhdrvM/Z/PmzXr55Ze1efNmBQcHq2bNmrnJ1dlYX6yPktSjRw89++yzOnz4sDZu3Kjk5GRW/AKAqxAJCACfY7PZ9NBDDykwMFBfffWVYmNjFRAQoF27dum7774zvD/R0dE6ceJEnvYTJ06oWrVq+e4TFxenbdu26YknnlCLFi2c3vv111/12WefaePGjWrUqJEiIiLyfS7J+vXrFR4ersjISEmOROjs7Iwk7dmzRydPnswtcbJarU77n71/40JSUlL04IMPqk6dOvrhhx9Uo0YN+fn56Y8//tDixYtzt4uIiHBaVvmsP/74QzExMSpbtqxuvPFGjR07VosXL9b69evVunXrAkvlAACFFzehA/A5SUlJ2rt3r3r06KGGDRsqIMBxLebPP/+UdOHZDE9o3ry5/vzzT2VmZua2bdu27YIPM5w3b57MZrP69++vli1bOv088MAD8vf315w5cyQ57vc4cOCAduzYkbu/xWLRoEGD9NVXX6lp06aSpF9++cXpGBMnTtQrr7wiSQoPD9eRI0ec3l+3bt1Fv9uePXt06tQp3XfffapVq5b8/Bz/7Jwf62bNmmnZsmWyWCy5++7YsUMPPfSQNm/eLMlx78zNN9+sH374QcuWLWP2AwCuUsyAAPA5JUuWVIUKFfTll18qOjpakZGRWr58uT7//HNJF76fwxMeeeQRLVq0SA8++KAGDBig5ORkvfvuuzKZTPne32CxWPTjjz+qQ4cOioiIyPN+mTJl1KZNGy1atEijRo3SnXfeqS+++EKPPvqohgwZoqioKH355ZfKyMhQ3759VblyZd14442aMGGCMjIyVK9ePS1fvlxLlizJvQ+kY8eO+vXXX/Xqq6+qc+fOWrt2rUsrZFWrVk3h4eH66KOPFBAQoICAAC1evFjz5s2T9F+sH3vsMd19990aOHCg+vXrJ4vFonfffVf16tVT+/btcz+vR48euvvuuxUeHq7//e9/lxFtAIC3MQMCwCdNnjxZZcuW1ciRI/Xkk09qw4YN+vDDD1W9enWtWbPG0L5UqVJF06ZNU2ZmpgYPHqyJEydq4MCBKl26dO5KVuf65ZdfdOrUKd1yyy0FfuYdd9yhjIwMLViwQOHh4Zo5c6aaNGmiV199VUOGDFFmZqa++OKL3Jvjx48fr/vuu09ffPGFHn74YS1fvlzvvPNO7sph3bt318CBA7Vo0SINHDhQ69at07vvvnvR7xYREaHJkyfLbrdryJAhGj58uA4fPqyZM2cqLCwsN9axsbH64osvZLPZNHToUI0ZM0aNGzfWJ5984vRE+caNG6tEiRLq2rWrgoODLynOAIDCgSehA4CX/fPPPwoMDHRaTvb06dNq06aNhg8fnrs0LqRNmzapZ8+e+uabb1S/fn1vdwcAcBkowQIAL9u6dasmTZqkp556SvXq1VNSUpKmT5+uiIiIC85y+JKVK1dq5cqVWrhwoVq1akXyAQBXMRIQAPCyAQMGyGKxaPbs2UpISFBoaKhatGihN954Q1FRUd7uXqGQlJSkTz/9VDVr1tS4ceO83R0AwBWgBAsAAACAYbgJHQAAAIBhSEAAAAAAGIYEBAAAAIBhSEAAAAAAGManVsG6MfJ+b3ehSDNF5n0iM9zLfibF210o0kzBQd7uAnDlghjHnmQrWczbXSjyFq9/2dtdKJDtSG1vdyFfftH/ersLl4QZEAAAAACGIQEBAAAAYBifKsECAAAALpdNNm93IV9X24zC1dZfAAAAAFcxEhAAAAAAhqEECwAAAHCB1V44S7Cutl/omQEBAAAAYBgSEAAAAACGudpmbAAAAACvsMnu7S4UCcyAAAAAADAMCQgAAAAAw1CCBQAAALigsD6I8GrDDAgAAAAAw5CAAAAAADAMJVgAAACAC6x2VsFyB2ZAAAAAABiGBAQAAACAYSjBAgAAAFzAgwjdgxkQAAAAAIYhAQEAAABgGEqwAAAAABdYKcFyC2ZAAAAAABiGBAQAAACAYSjBAgAAAFzAKljuwQwIAAAAAMOQgAAAAAAwDCVYAAAAgAusdkqw3IEZEAAAAACGIQEBAAAAYBhKsAAAAAAX2LzdgSKCGRAAAAAAhiEBAQAAAGAYSrAAAAAAF1h5EKFbMAMCAAAAwDAkIAAAAAAMQwkWAAAA4AIrFVhuwQwIAAAAAMOQgAAAAAAwDCVYAAAAgAt4EKF7MAMCAAAAwDAkIAAAAAAMQwkWAAAA4AKrTN7uQpHADAgAAAAAw5CAAAAAADAMJVgAAACAC2w8iNAtmAEBAAAAYBgSEAAAAACGoQTLIE0711e/5+9U5ZjyOn38jBZN/11z3/7RpX1rNq6id5Y+rweajNTR/Sec3ruxX3vd8dj/FF21tI4dPKHvp/6mbz9c4omvUKg1va6u7hvWVZVrR+v0iRQt+uIvffWBa3Go2aCSJn73lB5o94oSD550eq9ijTJ64Lnb1bB1LWVnW7Vl5S59Mmahjpz35+ALmnaqr34v3KnKdco5xvCnv2vu24tc2rdm4yp655fn9MA1o/Ifw492yRnDJ/X91F/17Ue/eOIrFGpNO8bqvpG3qXLtcjp94owWzVimryYtdmnfmg0ra+Ki4Xqg9WglHnAew19ufl1RZYrl2eee+iOUdCzZLX2/WhBjz2raIUb3DbtZlWvlnIe//FtffeDa3+WaDSpq4sKheqDDq7nn4TIVo/T536ML3Ofnr1Zq4jOz3dL3q0Wza2uq3+PXq3K10jp9Kk0/zlujudOXFbh9QIC/ut93rbrc0kilo4vp2NFk/fbTJs2dvlzZ2dbc7dp2qqu7+rdVxaqllJaSqfWr9mjau0t06mSqEV/rqsIqWO5BAmKAui1q6qU5Q/Tn/FX6fOx81W9dW/1G3ymTn0lzJvxwwX2r1a+kMV8PVUBg3j+qrg901KCJ92nu2z9q/W9bVadZdT306t0KDjVr7luuJTdFQd2m1fTi9IH68/v1mjH+R9VrXl39RnSVn59Jc977+YL7VqtbXi9//rACAv3zvFeqXHG9tXCoDu5O1BtPfC5zcKD6De+qV2c9pkc7vy5LRpanvlKhU7dFDb00Z7BjDL8yX/Vb11K/F+6Uyc/PtTH81ZMFjOHrNOjt+zR34iLnMRwW5FtjuFl1vTjjUf357VrNeP071WtZU/1G3eYYw+/83wX3rRZbQS9/+Vi+Y7h46QhFlSmmKaO/1vY1e53eS05Kcet3KOyIsWfVbVpVL057UH/+sF4zxi9ynIeH3Sw/k0lz3r/wxaBqdcvr5U8fyhPfpMTTGnr7xDzb39Kvrdrf0kQ/z13h1u9Q2MU2qqSX3umtPxZv1ecf/Kp6jSur/+PXy89k0uxpf+a7zyPDblSXWxvry0/+0L9bD6lmTHn1feQ6lSlXXBNf/laS1K5zrJ4ff7d+nLdan33wq0qUDNN9j16vNz/ur8fvmaIsS7aRXxM+ggTEAH1G3a49m/dr/EOfSJLW/rJF/gH+umvozZr//uJ8f5ENCPTXbQ931n3P31HgL7p3Db1Zf3yzSp++NE+StOGPbapYM1q3P9zZp355u3fojdoTd0gThnwhSVr7+zYFBPqr5+OdNf+T3wqO7/3t1XdY1wLj2/fpm5WekqFne72vzJxtjh44oRenP6RaDStp66o9nvtShUyfkTlj+OGpkqS1S7fIP9Bfdz3pwhh+rlvBY/jJm/XH/PPGcI2yuv2hTr41hp/pqj1bD2rCE59Jktb+FqeAAD/1HHSD5n+0tOD4PnCd+o64TZYMS76fW6N+JUnS3z9uyDO752uIsWfd+2TOefjJLyVJa//Y7jgPP9ZJ8z/5XZbMAuLbv536PnNzvvHPsli1fX28U1uthpXU/pYm+vzNH7V19d48+xRl9z50nfbsOKLxL8yXJK35e5cCAvx11/1t9c3Mv2XJdE4UIiJD1LVHM0179xfNm/GXJGnDKkfMBg79n6ZPWqLTSWm6Z2AHrVz2rya9+t/FpAN7j+u9Lx9Wy/a1tfyXOIO+IXwJ94B4WKA5QA3a1tFf3611al/+7RqFRoSo/rW1892v+f8a6t6Rt2vOhB80ffTX+W7z/J1va9ror5zasizZCgzynbwy0Byghq1r6a+fNjq1L/9xg0LDg1W/RY1892t+fazuHXqT5k76WdNf+y7fba69qaEWz1mRm3xI0s5NB9Sn2Qs+lXzkjuHv1zm1O8Zw8IXH8IjbNOetHzX9xQLGcPeJmnbe+M7KsvreGL62lv76cb1T+/If1jvGcMua+e7XvHN93ftMV8199ydNH7sw322q16+oM6fSfPoXY4kYe1qg2V8NW9XUX/+3yan9v/Nw9Xz3a94xVvc+eaPmvrdE08d979KxHh/bQwd2HdWCqb9fabevKoGB/mrYrKqW/7rNqX3ZL1sVGhak+k2q5NknNDxIP85boxV/bHdqP7T/uCQpukIJmUwmrV+5Rz/NX+O0zcGcUtnyFaPc+TWKBKtMhfLnakMC4mHRVUvLHBSoQ7uOOrUf3uN4XaFmdL77/btur/o1GKY5E36Q9Zw6zXMd+DdBiQccJ4nwEmG68b726ty7jb7/5Fc3foPCLbpySQUGBejQnkSn9sP7jkmSKlQvne9+/27cr36tX9Kc937ON75lK0UpvFiojh48qcfG9tTczeP07a639NKnD6l0+RLu/yKF2H9j+IhT++GcmFeoUTbf/f5dt1f9Gg7PGcO2fLfJO4bbqXOva/X9J7+58RsUbtFVSikwKFCHdp83hvfmjOEaZfLd79/1+9Sv2fOa887/FXiOqFG/klJOp+n56Q9p3s63NX/PRI2c8oBKlIl075co5IixZ0VXLpVzHj7m1H443vGL7gXPw9eO0Zz3lxR4jjjXdbdfozqNq+ijlxbI5mNroUZXLCGzOUCH4p3voTuccz9SxSol8+xz9PApvT/uRx08b58218cqKytbh+JPyG636+O3F+uf33c4bdP2+rqSpH3n/e4CuIvXLzNmZ2fr559/1po1a3T48GFZLBaFhIQoOjpazZo1U5cuXRQQ4PVuXrbw4qGSpLQz6U7taWcyJEmhEcH57nci4ZTLx4htWVNvL3lOkuOXPl+6gTcsMkTSf/E8Ky0lU5IUGl5AfI+cvuDnFisZLkkaMOo27dgQrzce/1zFSoXr/pG36o2vBunRLq8rMz3/koyiJrzY2TF8XozPjuGcP4PzXfIY/vlZSY5f+r6d4kNjuFjOGE45fwyfPUcUEN+LjGFJql6vokqVK67/m7lcC6b8qsq1o9Vn+C16c+FTeqLza8pM840xTIw9K/c8nCe+FzkPH714fM/V/aGO2rp6jzav2HUZvby6hef8rpCWmunUnpYzvkLDglz6nLad6qpT14ZaOGulUs47p59VvnKUHnzyf9oZd1ir//K9WMMYXv3Nfv/+/Ro4cKCOHj2q2NhYlSlTRsWKFVNmZqa2bdumb775Ru+9956mTp2q8uXLe7Orl81kckyL2e35X62xu+EqzpH44xp20+sqWb6E+j7bTe/98aIGXzdGp3xg9RU/v5xpxwLCaCsg7hcTmHPD9KnjZzR24LTcP7+Efcc18bundP2dzfTTl39f1mdfbUx+Bo3hm19XyXI5Y/j30Rrc8RXfGMOms2M4/zjabBe/MlyQt5+coayMLO3eclCStHXlLsVvP6y3fhimzj1b6cfP879xtaghxp7133m4gPhe5nn4XLHNqqlmg0p6+YGpV/xZV6OL/S7hSozbdo7ViFe7a/PaeE2flP/CAJWqldK4D+9TVpZVrwybW+DxfJnNfvWVOxVGXk1AXn75ZVWsWFHz5s1TREREnveTk5M1dOhQjRkzRh999JEXenjlUk+nScp7he3szEdqcnqefS7VySOndPLIKUnSjjW7NW3967qxX/uLrk5UFKTkxO/8maTQcMfVoLTk/K/wXMzZK3mrf4tzOgFvX7dPZ06lqUa9ipf1uVeji4/htCs+htMYXrtH09aN870xHH7+GM654nmZY1hSnlWZJClu9R6lnE5TtXoVLvtzrzbE2LMKju+VnYfP1fbmRjpzKlWrf/PNG6JTz844nzfTERpqlvTfbFNB7uzTWg8++T9tWrNPLw2draysvCWFjZpV1Qtv9VJ6aqZGPvq5jh4+5Z7OA/nw6j0ga9eu1fDhw/NNPiQpMjJSw4YN0+rVqw3umfsc3psoa7ZV5as71xiXr+6om9+//fBlfW5IeLA63tVK5c773IS9x5RyKk2lK/jGjWMJ8cdlzbaqXNVSTu3lqzpqjvfvPJLfbq59rtWmQHPeHD0g0N/pxvSiruAx7Hh9RWO454XGsG/ca5Ow75hjDFc7L77VcsbwvwmX9blhkSH6X+/Wqlw7731mAYEBSvah9f2JsWcVeB6u4nh9uefhc7XoVE//LN7i0r0iRdHhg0mO83Al53s9yldy/Fsff959kOd6bMTNevjpG7X8lzi9MGimMvIpH+54YwO9OrmvTiQma2j/aXnuGwHczasJSGRkpBITC/5LI0mHDx9WcHD+9aNXg6zMbG3+61+1ua2pU3vb25vpTFKqdqy9vNWUbFabhr4/QD2H3OTUXvuaaoqMCteeLQcuu89Xk6zMbG1euVttbmrk1N62a2OdOZWmHRviC9jzwjLSLNq6yvG55yYhjdvUVkhYkLau2n1F/b6aZGVma/Pf/6rNrdc4tbe9vZnOnErVjrWXtxSmYwzfn88Yrup7Y3jFLrXp2tipve0tTRxjeP2+y/rc7KxsPf56b/UcdINTe+ubGik41KxNf/97mT2++hBjz8o9D9+Yz3n4dJp2bNh/RZ8fXixUFaqV1tY1vrP64PmyLNnavC5ebTrVdWpv17meziSna8eWQ/nud/+gzrq9V0t9M/NvvTby63xnPpq3raVhr9yhuI0HNPT+aTqeWPRLX6+Et1e7KiqrYHm1BKtHjx4aNWqUBg8erJYtW6pcuXIym82yWCw6evSoVq1apQkTJqhHjx7e7OYVmz3+e4377hk99/ljWjxzmWJb1lSPITdq+uivZcnIUmhEsCrHlFfCnmM6feKMS5+ZmW7RV+8s0j3Db9WZk6la//tWVagZrT6jbtfuTfv188yCn4xa1Mx5d7Fem/O4nv3ofv08d4XqNq2m7o9cr+mvfeeIb3iwKteOVsK+4zp90vUHg3067nu9+fVgjZnxsL6Z8quKl4rQgGdv0/Z1+7Ti580e/EaFz+zx32vct8/ouc8f1eIvljvG8OAbNf3Fef+N4TrllbD3csdwitb/HqcKNcuqz8izY3i5h79V4TFn4k967evBevaTB/Xz7H9Ut3l1dX+8i6a/svC/MVynnBL2HdPpE66N4cz0LM374Gfd83RXnTp2Rmt/26qqsRXU55lbtHLJZm34c/vFP6QIIcaeNee9JXpt1qN69sP++nnuStVtWlXdH+6o6eO+lyUzS6HhQapcK1oJ8cd1+hJnhqrFlJMk7d/p2ysyzZr6p17/6D499+ZdWvztOsU2qqwe/a7VtHd/kSUzW6FhQapcvbQSDp7U6aQ0Va8drbv6t9GOrYf0589bFdPAuXR4/55jysqyaujo25SWZtGcqX+qcjXnFcuOH00mIYFHeDUBGTRokPz8/PTGG28oLS1vHXlYWJjuvfdeDRkyxAu9c5+Nf27T2D4fqO+z3TR61iCdOJykqc9/pfnvL5Yk1WxURW8uGqm3HpmqJbP+cvlzvxz3rZKOntYtD16vbo910ZmkVP25YLU+f2W+sjJ958mlG//eqVcfmq4+T9+k0VMH6viRU5o29lvN/9ixlGuNBhX15teD9dbQmfrl61Uuf+72dfs04q731G/ELXru4weUmW7RP4s3a+orC31uCciNf27X2L6T1XfU7Ro96wmdSDilqS987TyGfxyhtx6ddmlj+PXvlJR4Wrc8cL26PXrOGB67wLfG8PIdenXAx+oz/BaN/uxhHT9yWtNenq/5Hy2VJNVoWElvLnhKbw3+XL9cwtOfZ47/UUnHzqhr//a6dUAHnUlK1aIZyzRzfNG/t+Z8xNizNv69U68+/Kn6PHWTRn/ygI4fPaVpr36n+Z/8LsmxXPGbXz2ht56apV/muX4elhxPm5eklNNXfr/Z1Wzj6r165Zm56vtIR734dm+dSEzW1HeW6JsvHAui1Iwpp/FT79eE0Qu05PsNatuprvz8/FSnXgW9O2Ngns8b9uCnMvmZVLK0Y8nocR/1y7PNFx/9pplTfvfo94JvMtkLwRIHWVlZ2rZtm44ePar09HQFBwcrOjpaMTExMpvNbjvOjZH3u+2zkJcpMv97eeA+9jOuz+Dg0pmCXVvKEijUghjHnmQrWczbXSjyFq9/2dtdKNDq/VW93YV8Na+8z9tduCSF4gEbgYGBatiwobe7AQAAAMDDeBI6AAAAAMMUihkQAAAAoLDjQYTuwQwIAAAAAMOQgAAAAAAwDCVYAAAAgAuuxof+FUbMgAAAAAAwDAkIAAAAAMNQggUAAAC4wGrn2r07EEUAAAAAhiEBAQAAAGAYSrAAAAAAF9i4du8WRBEAAACAYUhAAAAAABiGEiwAAADABTyI0D2YAQEAAABgGBIQAAAAAIahBAsAAABwAQ8idA+iCAAAAPgom82mSZMmqV27dmrUqJEGDBig+Pj4Arc/cOCAHnnkEbVo0UJt2rTR2LFjlZ6efknHJAEBAAAAfNTkyZM1Z84cjR07VnPnzpXJZNLAgQNlsVjybHvmzBn17t1bp0+f1tSpU/XRRx9py5Ytevzxxy/pmCQgAAAAgAtsMhXKn8tlsVg0ffp0DRo0SB06dFBMTIwmTpyoo0ePasmSJXm2X7BggVJSUvTBBx+oYcOGatCggSZOnKi///5ba9ascfm4JCAAAACAD9q+fbtSU1PVqlWr3LbIyEjFxsZq9erVebbfu3evqlevrqioqNy2cuXKqUSJElq1apXLx+UmdAAAAOAq1qlTpwu+v3Tp0nzbjxw5IsmRRJyrTJkySkhIyLN96dKldezYMVmtVvn7+0uSUlJSdPr0aZ04ccLl/jIDAgAAALjAKr9C+XO5zt48bjabndqDgoKUmZmZZ/uuXbvq9OnTeu2115Samqrk5GS9+OKLMplM+d4zUhBmQAAAAICrWEEzHBcTHBwsyXEvyNn/l6TMzEyFhITk2b5KlSp67733NHr0aH355ZcKDg5W3759Vb9+fYWHh7t8XBIQAAAAwAedLb1KTExU5cqVc9sTExMVExOT7z4dOnTQH3/8oWPHjikiIkLBwcG69tprdeedd7p8XEqwAAAAABdY7X6F8udyxcTEKDw8XCtXrsxtS05OVlxcnJo1a5Zn+7Vr16pPnz6yWCwqXbq0goODtWrVKiUlJenaa691+bjMgAAAAAA+yGw2q0+fPpowYYKioqJUoUIFjR8/XtHR0erSpYusVqtOnjyZO9NRo0YN7dy5U6+99poeeOABHThwQMOHD1evXr1UqVIll49LAgIAAAD4qMGDBys7O1vPP/+8MjIy1Lx5c02bNk1ms1kHDx5Up06dNG7cON15550qXry4Pv74Y40bN0633nqrSpQooV69eunRRx+9pGOa7Ha73UPfp9C5MfJ+b3ehSDNFRni7C0We/UyKt7tQpJmCg7zdBeDKBTGOPclWspi3u1DkLV7/sre7UKBv9zT2dhfydXv1Dd7uwiXhHhAAAAAAhiEBAQAAAGAY7gEBAAAAXGC1m7zdhSKBGRAAAAAAhiEBAQAAAGAYSrAAAAAAF1i5du8WRBEAAACAYUhAAAAAABiGBAQAAACAYbgHBAAAAHCBzc61e3cgigAAAAAMQwICAAAAwDCUYAEAAAAuYBle9yCKAAAAAAxDAgIAAADAMJRgAQAAAC6w2k3e7kKRwAwIAAAAAMOQgAAAAAAwDCVYAAAAgAtsXLt3C59KQLa/H+PtLhRp5jCLt7tQ5FlSKni7C0VaVOkz3u5CkZeZ5VP/7HhF6qkQb3ehSHu4+R/e7gJw1SONAwAAAGAYLkUBAAAALrDauXbvDkQRAAAAgGFIQAAAAAAYhhIsAAAAwAU28SBCd2AGBAAAAIBhSEAAAAAAGIYSLAAAAMAFrILlHkQRAAAAgGFIQAAAAAAYhhIsAAAAwAVWrt27BVEEAAAAYBgSEAAAAACGoQQLAAAAcIHNzoMI3YEZEAAAAACGIQEBAAAAYBhKsAAAAAAXsAqWexBFAAAAAIYhAQEAAABgGEqwAAAAABfY7Fy7dweiCAAAAMAwJCAAAAAADEMJFgAAAOACq3gQoTswAwIAAADAMCQgAAAAAAxDCRYAAADgAlbBcg+iCAAAAMAwJCAAAAAADEMJFgAAAOACVsFyD2ZAAAAAABiGBAQAAACAYSjBAgAAAFzAKljuQRQBAAAAGIYEBAAAAIBhKMECAAAAXGClBMstiCIAAAAAw5CAAAAAADAMJVgAAACAC2w8iNAtmAEBAAAAYBgSEAAAAACGoQQLAAAAcAGrYLkHUQQAAABgGBIQAAAAAIahBAsAAABwgc3OKljuwAwIAAAAAMOQgAAAAAAwDCVYAAAAgAusXLt3CxIQg3QoX01PN26nWsVL6URGmmb9u0GTt6y44D4dK1TXkEZtFFO8tJIyM/R/+3fozfV/Kj07K8+24YFm/d+tA/TOxuWat3uLp75GodWubA09We861YworZOZqZqzd52m7PjrgvtcF11TT9Rtr9rFyuhUZroWH96mt7f8pnTrf/H9q+tQlQ4Oz7PvtT+8reOZqW7/HoVZh/LV9HSTc8bwDhfHcONzxnD8RcbwbQP0zgbfHMPXlqqlx+p0VrXw0jplSdO8/av06e4/L7hP29K19VCt61UzoqxOW9K09MhWvf/vEmWcM4ZvrdBEfau3VaXQKB3PTNGPh9Zr6q7flW23eforFTpty9TUoLrXq0Z4aSVZUjV33xpN3bn8gvu0L1tLj9W5TrUiy+iUJV1LDsfp3W1LlW7NUvmQ4lryvycL3HfB/vV6fv23bv4WhRfnCM87uC5N62ed1KkDFgUX81edGyLV4M7iMpnyvy/BZrVry8JT2rn0jNJPZiuiXKAadi+ham3z/rt21qrpxxX3/Wn1X1DDU18DIAExwjWlK+iTjt31w75temvDMjUrU1HPNGkvk8mkDzb/k+8+nSrW0MfX3an5e7bqjXV/qFaxUhrWpL2igkM1ZNn3TtsWMwdr6vXdVTG8mBFfp9BpElVRH157t346sFXvbP1dTUtW0tB6HWWSSR/tyP+Xi47lamly67u0MH6TJmz5VTUjS+mpetcryhymp1cvkCSVDApT6eBwvbbxZ60/edBp/1OWdI9/r8LkmtIV9Mn1OWN4/TI1K1tRz1zjwhjumDOG1/6hWsUZwwVpWLySJja7Vz8nbNHkHb+ocVQVPV67s/xk0rTdf+S7T/sydfRW03v146ENem/Hz6oeXlqP1+6iEkFhem7D15Kk3lVba1hsVy1J2KJ3tv+fSgSG6eHa16tmRLSeWTfLyK/odY1LVNL7LXvrp0Nb9N62X3VNVGUNqdtJfiaTPv53Wb77XFe2tia17KXvDmzUxLhfVCOitIbU7aSooDANX/uNjmWeUe8/p+bZr3e15rqpQn3Nj1/v6a9VaHCO8LzE7Rn6dVyCqrYJV5N7opS4LV3rvjwpu01q1LNEvvtsmHNSm+efUqO7SqhMTLDi/0nVH28dlclPqnpt3iTkyNZ0bfvxtKe/CkACYoQnG7VRXNJRPfXXj5KkPw7vVaCfnx6t31JT41Yr05qdZ5/RzTvpp/3/atjfiyRJ/xzZL3+TSf3rNlWwf4AycvbpUqmmXmzeWWGBZuO+UCHzRGx7bT91RMPWOK40Lju6WwF+/nqozrX6dOcKZdryxve5hv/T4kPbNWqt4x+5Fcf2yc/kp/tqNM+Nb2zxaEnSz4e363Cab5+Qc8fw8nPGsMlPjza4wBhukTOG/3JhDLforLAA3x3DD9e6XjuSj+iFjfMkSX8f36kAk5/612ivmXv/yncMP123q5Ye2aqXNs2XJK0+sUd+Jj/1qtJawX6Bstiy9VDNjvrn2C6NWD8nd7+45EP6pv0QtSxVQyuP7zbmCxYCj8V00PbTRzRqneMCw/LEXQrw89ODtdrq813/5BvjEQ1u1JLD23JnMVYe3ys/k0n3Vm+pYP9AZViztCnJ+eJEveLldVOF+nonbqnWndzv+S9WSHCO8LwNc08qqmqQ2j9ZVpJU8ZpQ2azS5vlJqndbMQUE5S0N2rn0jKq1C1fju6MkSeUbherE3kxt/+l0ngQkK8Omv95LVEgJf6WdsHr+C12lWAXLPShk8zCzn79alq2kxfv/dWpfFL9D4YFBalGmYp596kWVUZWIEvp8+1qn9k+3r1WHBR/nnpQjA4P0UYc7tPLoft33y1ee+xKFWKCfv1qWqqKfD213al98KE7hgUFqVqpynn3qFotW5fAozdy1yql9xq5V6rz4g9z41i1WVqct6T6ffJj9/NUyupIWxxcwhsteYAxvO28Mb1urDvPPG8PX3aGVR3x7DDeNqqZfj8Q5tf9yZKvCAoLUJKpqnn3qRJZTpbAozd3nXN4ye98/uv2Pt5Vhy1JUULiKmUP1Z6Lz3429KceUlJmqdqXruP27FFaBfv5qXrKqfknY5tT+8+E4hQUEqWnJKnn2iSkWrcphUfpyz0qn9pl7VuqmXyY5lbmd64WGXbXnzDHN2J3/Vf+iiHOE51mz7DqyJV2VW4U5tVdtHabsDLuObsvIdz9bll3mEOdf9YIj/JV5Jm8J5prPTiikRIBqXR/pvo4DBWAGxMMqRRRXkH+A9iQnObXvO+N4XS0ySssS9jm9F1vCcXUjw5qtadd3V5voKsq0WrVg71aNW/ObMm2OKxPp1ix1+W6a9iSfVMUw3zxhVA4rIbN/gPalnHRqj0/JiW9ElP5K3OP0Xt3i/8V3yrV3q3WZasq0Zuu7/Zv1xuZfZMmJb93i0UrOytD7rXqqdZmq8jP56feEnXpt0886lpFiwLcrHFwaw4f3Ob0XG3XeGC6XM4b35DOGv/XtMVwxJEpm/wDtTz3u1H4g9YQkqUpYSa04vsvpvTqR5SRJGbYsvdusj5qXrCGLLVuLDm3QO9sXy2LLVkpWhrJsVpUPKe60b0RAsCICg1UhNP+SjaKoUujZ88QJp/b9qY7zRtXwkvr7mPNsUEwxxwxopi1bH7S8R61KO84TPxzcpAlbl8iSz4xJ1woN1KBEBfVf/plssnvo2xQ+nCM878yRLNmypWLlA53aI8o5XicfzlKFxnn3i72tuDbPT1LF5mEqExOsA6tTdWh9mpr2iXLa7vCGNO3+/Yxufaui9izznX/f4D0kIB5WLDBIkpSSlenUnpplkeS4qe58UcEhkqQp192h7/bGaerW1WpYKlpDG7VVqeBQPfHnd5KkLJtNe5JP5tnfl0ScjW/2efHNeR0eEJRnn6igUEnSB6176vsDWzV95wo1KFFeg2M7qGRQmJ5c5ShpqVu8rMqGROqrvev12c4VqhFZSoNjr9PM9vep29JPnG5WL8qKmS9jDAfljOGOd+i7PXGaGrdaDUtGa2hjxvD5IgKDJeUdw2lWR3zDAoLz7FPC7BjDb11zr/7v8EZ9secv1SteQQ/X6qQoc7hGbpirDFuWliRs1t1VWmlPSqJ+PRKnqKBwDYu9Wdl2m0L8faecpaAYp2afjXE+5wmz40rzuy3u1qKDm/X57r9Vv3gFPR5znaKCwvTMmnl59ulf81qtO7Ffq0/sc/M3KNw4R3ieJdUxYxEY6jybEZgzu5GVlv+iEnW7FtPRben65ZWE3LZanSJU/47/LkBYUq3664Njatw7SsUq+M554XLZKB5yCxIQDzu7MoW9gIth9nyukgX6+UuSFu//V6+vc9yA+s/R/fIzmTTimuv09oblnJBz+OXGN/8A2/JpPxvfJYd3aMKWpZKklcfi5SeTnmnQSe/G/aG9KSc0cs13yrRate30EUnSmhMHtDP5mOZcd7+6VWmo2XvW5vnsosiki4zh/GLsn88YPpIzhpsyhs/13+o1ro/hAJPj1P3b0ThN2vGzJGnNyb0yyU+DY/6nD3cuVXzqcb265TtZbFa90KCbXmx4p9KzLfp8zzIF+5uVnpPg+IKLnScudB5emrBdb8f9IkladXyf/EwmDY3trPe3/+Y0o9IkqpJii5fTEytnu7v7hR7nCM/LjWFBtx/k027Nsuun5w4pPcmq1o+UUrEKZh3dlqFN85IUEOynlg+WkiStmn5CoSX9Ve9W373B39fZbDa9//77+vrrr5WcnKymTZvqxRdfVJUqectTJenYsWMaN26c/vrLsdpoq1atNGrUKEVHR7t8TNI4D0u2OK4IRZx3BejsTeNnLJl59jl71ejXg84lAX8c2itJio0q4/Z+Xq3Oxjc80PkK5tkrmmey84lvzlXP3xJ2OrUvO+qI99kSrQ0nD+UmH2etO3FQyZYMxRQr64beXx2Sc65qRpgLGMNZjOErcSbLUbt9/lX40JwZipTsvLXdaVZHzJcl7nBq//uYowa/TqTjH4F0q0VjNi9Qu5/Hqsefk9Rp6Th9vOs3lQsprtNZvrOSW3JOjPOeJ86O4bwxPjuL+scR5/salh91lMPFRDr/Q/u/8rE6bUnXsqPO5xVfwDnC88xhjoTt/JmOrHRbzvt5f52L/ydFSfssaj+0jOrcUEzR9UPUqGcJNetXUtt+PK2k+EwdWJ2qvctTdO1jZWS3O5btVc4hbFa77DbfKSX0ZZMnT9acOXM0duxYzZ07VyaTSQMHDpTFkv+FqqFDhyohIUGffvqpPv30Ux05ckSPPfbYJR3T6zMgffv2LXD96vPNmDHDw71xv/1nkpRts6lKpHO9ddUIx+udp0/k2WdvTt2sOecK0VkBfo4TTEZ23tpjX7U/9aSybTZVDneuZ60S7ojvruRjefaJz7lfpMD4WrMVERik/5WP0YaTh7T7jHNtfqCfv5Iy09z2HQq7/ck5YziigDF8Kp8xnFMLbvYrOMZwOJh2Utk2qyqFlnRqrxTmeL0nJTHPPvtz7g/JG1/H67PxbVemjpKz0rUxaX/u55Qwh6lscKS2nz7s3i9SiB1IdYzhymHO54mzr3efucB5ooAxfP6qWR3K1tbShO0++XwVzhGeFxEdIJOfdCbBufT37OviFfOWTqUcc8SwTIxzGWd0PcfrUweydHBdmqwWu74dciDP/jN67FGNjhFqN5hk8FzWIrYKlsVi0fTp0zVs2DB16NBBkjRx4kS1a9dOS5YsUdeuXZ22T05O1urVq/Xhhx8qNjZWkvTQQw/pscceU1JSkkqUcO3+Qq/PgLRu3VqrV6/WiRMnVKFChQv+XI0ybVatOnpAN1au7dR+c5U6Op2ZoQ3HE/Lss+roAaVmWXRbtVin9s6VainLZtW6Y4c82uericVm1erj8fpf+Rin9hsqOK5GbjqZ95es1cfilZpt0S0V6zu1X1+ujrJsVq0/cVBZNqteanKzHq7TxmmbzuXrKCQgUKuOx7v/yxRSHhnDiYzhsyy2bK0/Ga/ro8+LVXQ9JWela+upg3n2WXdyn9KyM3VD+YZO7R3KxCjLZtWmU47lX3tUbq6hMTc6bXNv1WtltdvzzJ4UZRZbttaeiFfncnWd2s/OWmxOyjse156IV1q2RTdXbODU3jHacZ7YcPK/X9iKBYaoSnhJrfehZXfPxTnC8wLMfiobG6z4FalOJW37/kmVOcxPpWrlvY+pWAXHDernr5CVuD1nRrBMgBr3KqFbxldw+qndJUKSdMv4Cmrcy3cWq/BV27dvV2pqqlq1apXbFhkZqdjYWK1evTrP9kFBQQoNDdXChQuVkpKilJQUffvtt6pataqKFXO9jM/rMyCPPfaYQkNDNWnSJE2ZMkUVK+Zdru9q997mv/Vll176oP3t+nrXZl1TpoIeqtdSr6/7XZnWbIUHmlWrWCnFn0nSycx0pWVn6e0Ny/VC8+t1OjND/7f/XzUtXUGP1GupT7et1clM3ymdcMWH25frs3Z99G7L7vpm3wY1KVlJD9ZurfFblirTlq2wALNqRpbW/pQkJVnSlGbN0qS43zWq4f+UnJWunw9tV5OSlTSwzrWasWuVkiyO2Y1P/v1bT9Rtr+OZKVp2ZLfqFCurQbHt9VvCv/o7ca+Xv7Wx3tv0t778Xy990CFnDJeuoIfqt9Tra10Yw5YM/V/8v2papoIeqc8Yzs/U3b/rwxb99UaTXvr24Fo1Kl5Z91Vvq0nbf84Zw0GqHl5aB9JO6pQlTelWiz7cuVRP171ZZ7LS9euRODUsUVn9a7TT7H3/6FTOGJ69b4Umt+ivZ+rerD8St6t5yeoaULODpu/+Q4fSky7Sq6Jlyr9/auq19+ntZj01f/96NYmqpPtrttHbcUtyY1wjorQOpJ7MOU9Y9P723zS8/g1KzkrXksPb1CSqkh6o1VYz96zMPU9IUq1IxxXi/GZSfAXnCM9r1LOEFr+UoN/HH1WtThFK3JGpLQtPqVnfKAUE+cmSZtOpAxZFRgcquJi/KjUPU6naQVo28WjuDebH/nXcA1KpeahK13bMhESUcV5Z68Aax9guVTPvAhgoeo4ccZSalytXzqm9TJkySkjIe/EgKChIr776qsaMGaNmzZrJZDKpdOnSmjlzpvz8XJ/XMNkLuivPYA8++KCKFy+uCRMmeOwYVWe84bHPvpgbKtXSk43bqnpklI6mpWjGjnWaGufILFuVraQ5N9yjZ/76UfN2b8ndp2eNBnowtrmqRpZQYlqKZu/cqA+3rMj3VtWKYZFa3v3RPJ9hJHOY925q7VK+jgbFdlD18JI6mnFGX+5eo+k7Hc9IaFGqimZ2uE8j1nyrBfGbcve5s0ojDajVSlXDo3Q044y+2rteH+/4Kze+Jkn3VG+m3tWbqnJ4CZ3KTNf3B7ZoUtwf+T60zAiWFO+tUHJD5Vp6slFbVS+WM4a3nzeGb7xHzyw/bwzXPG8M/3uRMdzj0TyfYaSo0me8clxJ6li2rh6p1UlVwkopMTNZX8Wv1My9jhv8mkZV0yetHtCLG7/R94f+e7r2bRWvUZ9qbVQ5tKSOZZ7R/AOr9dnuZU43Vd9QrqEerNlB5UNL6Ej6KX0Vv0pz41fkOb5RMrO8d92rU7kYPV6no6rlnCdm712lz3Oe19G8ZFV91ra/nlu3UAsPbMjdp1vlxupf41pVCYtSYsYZfR2/VtN2/uUc4/L19Hbznrpl6fvam3L8/MMaLvVUiFeO6wvnCEl6uPkfXjt2/IoUbZiTpNOHLAotGaCYm4qp/u3FJUkJW9K1+IXDajOodO6zPCxpNq378oTi/0lVZopNEWUDVOO6CNW7rbj8A/MvJVo/56Q2zk1S/wU1jPpaeYyKXeS1Y1/MkPW9vd2FfG15Jm+57rmWLl2ab/u3336r4cOHa9u2bU4JxPDhw5WYmKjPPvvMaXu73a533nlH//77rx588EFZrVZNnDhRKSkpmj17tsLDw+WKQpOAHD16VHFxcerYsaPHjuHNBMQXeDMB8RXeTEB8gTcTEF/hzQTEV3grAfEV3kxAfAUJyKW73ARk8eLFGjx4sDZu3Kjg4P9mvYYMGSKLxaIPP/zQafsffvhBL7/8sn777bfcZOP06dPq2LGjhgwZon79+rnU30LzL0HZsmVVtqzvrCwEAAAAuENBCcbFnC29SkxMVOXKlXPbExMTFRMTk2f7tWvXqlq1ak4zHcWKFVO1atW0b98+l4/r9ZvQAQAAgKuBze5XKH8uV0xMjMLDw7Vy5crctuTkZMXFxalZs2Z5ti9Xrpzi4+OVmfnf8trp6ek6ePBggc8NyQ8JCAAAAOCDzGaz+vTpowkTJmjp0qXavn27hg4dqujoaHXp0kVWq1XHjh1TRoZj9bRu3bpJkp588klt3749d3uz2aw777zT5eOSgAAAAAA+avDgwerRo4eef/559e7dW/7+/po2bZrMZrMSEhLUtm1bLVrkuC+nTJkymjVrlux2u/r166f7779fgYGBmj17tiIjI10+ZqG5BwQAAAAozKwqWg8ilCR/f38NGzZMw4YNy/NexYoVtWOH83OjatSooY8++uiKjskMCAAAAADDkIAAAAAAMAwlWAAAAIALbPaiV4LlDcyAAAAAADAMCQgAAAAAw1CCBQAAALjgSh76h/8QRQAAAACGIQEBAAAAYBhKsAAAAAAX2Irggwi9gRkQAAAAAIYhAQEAAABgGEqwAAAAABdYeRChWzADAgAAAMAwJCAAAAAADEMJFgAAAOACHkToHkQRAAAAgGFIQAAAAAAYhhIsAAAAwAU2VsFyC2ZAAAAAABiGBAQAAACAYSjBAgAAAFxgEyVY7sAMCAAAAADDkIAAAAAAMAwlWAAAAIALWAXLPZgBAQAAAGAYEhAAAAAAhqEECwAAAHCBzc61e3cgigAAAAAMQwICAAAAwDCUYAEAAAAuYBUs92AGBAAAAIBhSEAAAAAAGIYSLAAAAMAFNlGC5Q7MgAAAAAAwDAkIAAAAAMNQggUAAAC4gFWw3IMZEAAAAACGIQEBAAAAYBhKsAAAAAAXUILlHsyAAAAAADAMCQgAAAAAw1CCBQAAALiAEiz3YAYEAAAAgGFIQAAAAAAYxqdKsJZ1esfbXSjSrHZv9wC4Mlliat3T/MWJwtPK+Qd7uwtF2kFrpre7AC+iBMs9mAEBAAAAYBgSEAAAAACG8akSLAAAAOBy2SjVdQtmQAAAAAAYhgQEAAAAgGEowQIAAABcwCpY7sEMCAAAAADDkIAAAAAAMAwlWAAAAIALKMFyD2ZAAAAAABiGBAQAAACAYSjBAgAAAFxACZZ7MAMCAAAAwDAkIAAAAAAMQwkWAAAA4AJKsNyDGRAAAAAAhiEBAQAAAGAYSrAAAAAAF9gpwXILZkAAAAAAGIYEBAAAAIBhKMECAAAAXGATJVjuwAwIAAAAAMOQgAAAAAAwDCVYAAAAgAt4EKF7MAMCAAAAwDAkIAAAAAAMQwkWAAAA4AIeROgezIAAAAAAMAwJCAAAAADDUIIFAAAAuKAoroJls9n0/vvv6+uvv1ZycrKaNm2qF198UVWqVMmz7Xvvvaf3338/38+58847NW7cOJeOyQwIAAAA4KMmT56sOXPmaOzYsZo7d65MJpMGDhwoi8WSZ9sBAwZo+fLlTj9PPvmkgoOD1a9fP5ePSQICAAAA+CCLxaLp06dr0KBB6tChg2JiYjRx4kQdPXpUS5YsybN9WFiYSpcunfuTnp6uKVOmaOTIkYqJiXH5uCQgAAAAgAvsdlOh/Llc27dvV2pqqlq1apXbFhkZqdjYWK1evfqi+7/++uuqVauW7r777ks6LveAAAAAAD7oyJEjkqRy5co5tZcpU0YJCQkX3Hfz5s1aunSpPv/8c/n5XdqcBgkIAAAAcBXr1KnTBd9funRpvu3p6emSJLPZ7NQeFBSk06dPX/AzP/vsMzVq1Mhp9sRVJCAAAACAC4raKljBwcGSHPeCnP1/ScrMzFRISEiB+6WlpWnJkiV68cUXL+u4JCAAAADAVaygGY6LOVt6lZiYqMqVK+e2JyYmXvCm8mXLlslms6lLly6XdVxuQgcAAAB8UExMjMLDw7Vy5crctuTkZMXFxalZs2YF7rd27VrVq1dPkZGRl3VcZkAAAAAAF9jt3u6Be5nNZvXp00cTJkxQVFSUKlSooPHjxys6OlpdunSR1WrVyZMnFRER4VSitX37dtWuXfuyj8sMCAAAAOCjBg8erB49euj5559X79695e/vr2nTpslsNishIUFt27bVokWLnPY5fvy4ihcvftnHNNntRS2XK9iBQ+UuvhEum9VnRhKKqiwVrZsLCyN/caLwtHL+wRffCJftoDXT210o8mpVPOztLhSo+U/PersL+Vp902ve7sIloQQLAAAAcIGNC1VuQQkWAAAAAMOQgAAAAAAwDCVYAAAAgAvsRexBhN7CDAgAAAAAw5CAAAAAADAMJVgGWbXKX59ND1Z8vJ+KFbPrltss6t3bIlMBM3kWizTj8yAt/SVQp0+bVKmyTXfdlalOnbOdttu/30+fTAnSxo0B8g+wq2EDqx5+NEPly/vWUperV/nr80+DtT8nvl1vtejui8R35gxHfJNz4tujZ6auPy++vXqEKykpb54+++sziooixu6I8f79fpr2cZA2bQyQv79dDRpa9dAjGSrnY2N47Sp/ffFpkA7E+ymymF033ZqlnheIb5ZF+nKGWb/nxLdiZZvu6GlRx/Pi26dHmE7lM4a/+DpFJXxsDK9Z5a8Z54zhm2+16K6LjOEvZwTp13Ni3D2fMXxPAeeJL33sPPHXSpM+mOavPfEmlSgu9bjNqgH32C4Y348+89ePS/x06rRUtbJd991tU9cuNqftfl1m0idf+GvffpNKRUld/2fVA/faFBjo+e9U2HCe8D4bJVhuQQJigK1b/DX6+VBdd12W+g/I0JbNAfp0WpDsNunePpZ893n1lRCtWBGgnndZ1OSabO3a6a+Jb4fo9OlM3dndsU9ioklDBoeqUkWbnn0uXZmZ0qfTgzRyeJg+mZaioCAjv6X3bN3qr5deCFWH67LU7/4Mbd0SoM+mB8lml+65N//4jhsbopUrAtTjLosaN8nW7l3+eneiI7535MQ36aRJSUl+evjRDNWNtTrtHxnpWydkT8U4MdGkpwaHqmIlm0Y8my6LRfp8epBGjQjTlKm+M4a3bfXTKy+EqN112ep7f6bitvjri+lm2e3S3QXE942xwVq9IkB33GVR4yZW7d7lpw8mBiv5dKZu754lyTGGTyX56cFHMxRz3hiO8LExHLfVXy+/EKr212Xpvpwx/HnOGO5dQIxfHxuiVSsC1P2cMfzexBAln85Ut/POEw/lE2NfOk9s2GLSkOcCdENHmx5/wKr1m/30/lR/2WzSwL62fPcZMSZAy/4x6b67bWpxjU3bd5k09i1/nTot3dvDsc8/a0x6erTjcwc/ZNWuPSa994m/kk6ZNOpJa76fW1RxnkBRQgJigBkzglSjhk0jn82QJLVoYZXVKs2ZHaQePS15fsnaudNPf/0VqAEPZOT+cte0qVXBIXZ9MiVY/7vBovBw6fPPghQaIr05IU3BOc+dii5n0+jnQ/XvDn81aOgbJ+cvZwSpeg2bho9yxLd5C6uys6WvZgepe4+88d21009//xWo/gMycn/xuKapVcHBdk39OFhdcuK7a5fjalCbdlkqW9a3T8KeivEXnwcpNFR6ffw5Yzjaphdf8K0xPGtGkKrVsOnpnPg2zYnvvNlmdcsnvrt3+mnFX4G6b0Cm7sqJb+OmVgUHS59+HKRON2QpPFzakzOGr22XrTKMYVWvYdOwnBg3y4nx17ODdGcBY/ifvwLVb0CGeuXEuEnOGJ72cbA654zh3bkx9u3zxJTP/VWnpl2vPuf4O9umpVXZVunTWf7qe5dNwefFd/tOk35b7qcnHszWg30cyUarZnaFBEvvfOSvW2+wKTJC+vYnP0WXkV59zip/f6l1M7tOJpk0c56fnnnCqkAf+i2G8wSKEu4B8TCLRdq00V9t22U5tbdrn6X0dJM2b/LPs8/+/Y4/llatnadIGzW0KiPDpA3rA2S3S8uXBeqmmy25v7hJUp06Ns39OsVnfnG7WHy3bHY9vg0aOeK7cYPjX7Q9u/0VHm736V8qJM/F2G6X/loWqBtuch7DtevYNPsr3xnDWRZp80Z/XdvOOVZt2mcrPd2krfnE90BOfFucF9/6OfHddM4YDgu3+/wvFWfHcJvzxnDbC4zhszFuyXnioiwWac0Gkzq1c57p6NzBprR0k9Ztyluysife0dbhWue4NW1kV3qGSWs2ON7PyjIpJMQu/3P+iIoXsysry6S0NDd/kUKM80ThYbcXzp+rDQmIhyUk+Ckry6SKFZ1PzBUqOF4fPJj3j6B4McdIOnrE+b3Dhx2vjxzx05EjJqWmmlS2rF2T3g3WHd3CddMNEXr+2RAdPeo79YlHcuJb4bz4lr9AfIsVEN+Es/FNcPx39y5/hUfYNebFEN1xW4Ru7xqh114J0YkTvhNfyXMxPnp2DEfb9f67werRLVy33Bih0c+FKNHHxnD2BeJ76ILxdY7TkcOO10cTHP/ds8tP4RF2vfpisO66LVw9uobrjVeCddIHx/Dlxzj/MXz0vPPEKy+GqPttEbqja4TGvRLiUzE+mOBIFKpUcv4tqHIFx+v9B/LGokRxx3uHj5z3WYcd/z2UM4Z73WHV/oMmfTbHT8lnpE1bTfpynr/atrKpWKSbv0ghxnkCRY3XE5C9e/fqvffe09ixY/XHH3/keT8lJUWjRo3yQs/cIzXF8Rc4NMz5xBwa6vhvWlrev+ANG1lVrpxNH7wfrHXr/JWaKm3e5K+pnwTJz8+ujAzp9CnHflM/CdLx4yY991y6nn4mQ7t3++uZp8KUnu7Z71VYpJyNb2gB8U0tOL6TPwjW+nPiO+2c+ErS7t1+On7MpNp1rBozNk0PP5qhTRv9NWxoqDJ8JL6S52J86rRjv2k5Y3jU8+ka+rRjDA9/OsxnYpyS4vjv+fENyYlvej7xrd/IquhyNn38QbA2rPNXWqq0ZZO/Ps2Nr2Ofvbv9dOKYSbXq2DR6bLoefDRTmzf6a6SPjeHUyxjDDXJi/NE5Y3jLJn9NP+88seec88TLY9M08NEMbd7or+E+FOMzOfENC3VuDw1x/Dcln5mKZo3sqljerjcmBWjlWpNSUqV1m0x6d0qA/PzsSs+Jb7PGdvXvZdM7HwWo/a1m3fd4oKJK2DXu+ey8H1qEcZ5AUePV6sm1a9fqgQceUNmyZWW32/Xll1+qc+fOeuutt2Q2myVJGRkZWrhwocaNG+fNrl42W865oqAVKvJrDwyUXn8zVRPeDNHwZ8IkSSVL2vT4Exka+0qIgoOlrGzHjsVL2PXSy+ny85Mkq8pXsGnwE2Fa+kugbrk1K++HFzH2i8TXL58UOzBQevWNVL09PkQjhzniG1XSpscez9BrY0Nyy4GeHpYhs9mumrUcV5gaNLSqSlWbnhoSpiVLAnXrbUU/vpLnYpyd5fjAEiXsGn3eGH5ykGMMd/WJMZwT2ILOEQXEd8wbaXp3fLCeH+b4DSSqpE0PPZ6pN8cGKzjY8Yc2ZFiGzGapRs4Yrt/QqspVbRo+JFS/LgnUzT4yhs+ehwuK8YXG8MTxIXr2nDH8yOMZev2c88RTwzIUeM55on7OeeKZIWH6ZUmgbvGBGNtyLsoXeI4o4N+5yW9m6aU3A/Tw047lrEqXtGv4oGyNGBOgkJz4jn3bX9/+5KeBfa1qcY1Nh46Y9NGn/np8eICmvJ2du11Rx3mi8OBBhO7h1QTkrbfeUo8ePfT8889Lkn766Sc999xzeuSRRzRlyhQFFoE19sJzZj7Ov8J2tnY1LCz/wr0KFeya+G6akpJMSk52lHAlJppks5kUEWHPvQrSokW20z+esbFWhYfbtWuXv6Sif9IIC8+Jb1r+8T1/5umsChXseuudNJ3KiW+FijYdOye+khRbL+89CPXqWxUWZtee3b4RX8lzMQ7JGcPNmjuP4bo5Y3i3j8S4oPimX+QcUb6CXW+8k65TSSadSTapfD5juG69vKsPxeaOYa9PgBsm/DLHcPkKdo2/yHmi7gXOE3t9ZAxHhDv+m3reTEdaztXz8PD896tcUZo+KVsnk6RTyVLlCtLRY5LNZlJkhOP/5//gpwfudaysJUnNZVf9Onb1GBCobxf5qded+a+wVdRwnkBR49WRtWPHDvXp0yf39U033aRPPvlE69ev1/Dhw73YM/cpX8EmPz+7Dh1yDvXZ11Wq5v2Ln5kp/bIkUAkJJpUoYVeVKjb5+0s7/3XcZFarllXlyzs+Nyuff9uys6WgoKvwjqTLcDYOh8+L79nXVarkH9+lSwJ1JMGk4iXsqnxefGvWsiolRVr8U6Di9zl/rt3uiO/Z2lpf4KkYX3QMm30jxuVy4pBwyPkXi7PxrVRAfH9bEpAb30o58d2VE98atWxKSZF+/ilA+xnD58Q4/zFcuYAY/3qF54lIH4lxpfJ2+fvZtf+8MXz2dfUqeeOQkSn9+LOfDiVIUSWk6lWkgAApbodjn7q17TqSaJLdblLjBs5/PjWr21U80q7d+3znSjTnCRQ1Xk1AwsPDlZSU5NTWtGlTjR8/XosXL75qy67OZTZLDRtatXx5gNMqBcv+DFR4uF0xMXmvngUESO9NCtaPP5hz26xWaeECsypUsKpqNZtCQqT6DaxavixQlnOW/163zl8ZGSY1aOAbKwiZzY7SqL+W5R/fOgXE94P3grXoR+f4frvQrPI58Q0IkN57N1hz55id9v3nrwBlZprUsJHv1B97KsZnx/Bfy53H8PqcMVzfR1bBMpsdJQ9/Lwt0iu9ffwYoLNyu2gXE96P3gvV/P/43S2y1Sj8sDFS5CjZVyRnDH74brK/PG8MrcsZwg0a+EV+p4DG8/CJjePJ7wfrpvDH8Xc4YPhvjD/KJsa+dJ4KCpGsa2fXrn35O8f3lDz9FhNtVv27eX2IDA6Rx7/rrm+//W73JapXmLPBXpQp21axmV6UKjsRm3SbnX1X27ZdOJZtUvpzv/HLMeaLwsNtNhfLnauPVEqwOHTpozJgxeumllxQbG5tbctW5c2c9++yzGjt2rBISErzZRbe4t0+mhg8L1Ssvh+jGm7K0dau/vppr1oMDMxUUJKWmSvHx/ipf3qbixR3LDd52u0XzvzGrVCmbKlex6dsFZm3Z4q8xY9Nzy1UefDBTTz8VqudGharnXRYlJZn0ySdBiqmbrdbX+sY/fJJ0T59MjRwWqlfHhOiGG7MUF+eveV+Z9cA58d0f769y58T3ltssWjjfrJKlbKpc2abvFpq1dYu/XnrFEd/gYKnn3RbNmhmkEiXsatY8W3v3+OuLGUFq0TJL1zT1rZOyJ2IsSfc/kKnhT4fqhWdD1aOnYwxPyxnD5y/hW5Td3cei54eF6PUxwepyY5a2xflr/ldm9c+Jb1qqtD/eT+XK21UsJ74332bRd/PNKlnKrkqVbfphYaDitvjrhXPGcPe7LZqTM4avaZ6tfXv8NGtGkJq3zFZjHxvDvfpk6tlhoXptTIj+lxPjb74ya4CLY7hSZZu+X2hW3BZ/vXhOjHvcbdHsmUEqXsKups2ztW+Pv2bmnCea+FCMB/a16uGnAzTspQB1u9mqjVv89PkcPw152KrgICklVdqzz6SKFeyKKi75+0t3dbNp1jw/lSllV7Uqds1Z4K8Nm02a+KqjLDOquOOBhDPmOE4YrZvZdPiISVM+91e5snZ1v8U3yq/O4jyBosRkt3tv9eDTp09r6NCh+ueffzRlyhS1b9/e6f1Zs2bptddek9Vq1bZt2674eAcOlbviz7hcy5cF6PPPg3TwgJ9KlrLr9tst6nmX47Lvhg2OlauGDU/XDTc66lGys6UZnwdpyZJAnUk2qUZNq/r2zVSz5s4ng61b/DV9epC2b/NXUJBdbdpm6+FHMgqsufUkqxcvRv21PEBffBakgwcd8b31Not65MR34wbHqkpPD0vX/86J78wZQfrlnPje2zdTTZv9F1+bTfrhu0D98L1ZCYf9FBlpV8frs9S3f6bPPKH7XJ6IseR4yvpn04K0Y7tjDF/bJlsDvTSGswq6w9MAfy8P0KzPzLnx7XqbRXfe5Yjlpg3+evbpUD05LF2db3QkZtnZ0uwZZv2aE9/qNa3q1deia84bw4u+C9Si7wN15LCfIiLt6nB9tu714hj2l/dOFH8tD9DMnDFcqpRdt9xmUfecMbxpg79GPB2mp4alq8s5Y/jLGUFaek6M78nnPPHjd4H6Mec8EZFznujjxRiX8/fOndm/LjPpw0/9te+ASWVKSXd3s+q+ux1Jwur1Jg0cGqiXR2Tr9pscbVnZ0pTP/PXDz346nSzVqWnXQ/2surb5f2PEbpe+nOened/569ARqVSU1Lq5TU88aFVUcW98S+mgNdM7B5bvnCdqVTzsnQO7oMF3L3q7C/nafNvL3u7CJfFqAnLW/v37VaJECUVEROR5b+/evfr555/18MMPX/FxvJmA+AJvJiCAO3gzAfEV3kxAfIW3EhBf4c0ExFcU5gSk3rcvebsL+dp6+0ve7sIl8WoJ1lmVK1cu8L1q1aq5JfkAAAAA4H2srwYAAADAMIViBgQAAAAo7Lx/40LRwAwIAAAAAMOQgAAAAAAwDCVYAAAAgAuuxof+FUbMgAAAAAAwDAkIAAAAAMNQggUAAAC4gBIs92AGBAAAAIBhSEAAAAAAGIYSLAAAAMAFPIfQPZgBAQAAAGAYEhAAAAAAhqEECwAAAHABq2C5BzMgAAAAAAxDAgIAAADAMJRgAQAAAK5gGSy3YAYEAAAAgGFIQAAAAAAYhhIsAAAAwAWsguUezIAAAAAAMAwJCAAAAADDUIIFAAAAuMDOKlhuwQwIAAAAAMOQgAAAAAAwDCVYAAAAgAtYBcs9mAEBAAAAYBgSEAAAAACGoQQLAAAAcAUlWG7BDAgAAAAAw5CAAAAAADAMJVgAAACAC3gQoXswAwIAAADAMCQgAAAAAAxDCRYAAADgCkqw3IIZEAAAAACGIQEBAAAAYBhKsAAAAAAX2HkQoVswAwIAAADAMCQgAAAAAAxDCRYAAADgClbBcgtmQAAAAAAYhgQEAAAAgGEowQIAAABcwCpY7sEMCAAAAADDkIAAAAAAMAwlWAAAAIArWAXLLZgBAQAAAGAYn5oBqeAf4e0uAADgUWOO1/V2F4q0Ffc08HYXirz/2+TtHsDTfCoBAQAAAC4fq2C5AyVYAAAAAAxDAgIAAADAMJRgAQAAAK5gFSy3YAYEAAAAgGFIQAAAAAAfZbPZNGnSJLVr106NGjXSgAEDFB8fX+D2WVlZeuutt9SuXTs1btxYffr00bZt2y7pmCQgAAAAgCvshfTnCkyePFlz5szR2LFjNXfuXJlMJg0cOFAWiyXf7V966SXNmzdPr7zyir755hsVL15cAwcO1JkzZ1w+JgkIAAAA4IMsFoumT5+uQYMGqUOHDoqJidHEiRN19OhRLVmyJM/2Bw4c0Lx58zRu3Dhdd911qlGjhl577TWZzWZt2bLF5eOSgAAAAAA+aPv27UpNTVWrVq1y2yIjIxUbG6vVq1fn2X758uWKjIxU+/btnbb/9ddf1bp1a5ePyypYAAAAgCvshfNBhJ06dbrg+0uXLs23/ciRI5KkcuXKObWXKVNGCQkJebbft2+fKlWqpJ9//lkff/yxjh49qtjYWI0cOVI1atRwub/MgAAAAAA+KD09XZJkNpud2oOCgpSZmZln+5SUFO3fv1+TJ0/WU089pQ8//FABAQG65557dOLECZePywwIAAAAcBUraIbjYoKDgyU57gU5+/+SlJmZqZCQkDzbBwYG6syZM5o4cWLujMfEiRPVoUMHLViwQA8++KBLx2UGBAAAAHCB3V44fy7X2dKrxMREp/bExERFR0fn2T46OloBAQFO5VbBwcGqVKmSDh486PJxSUAAAAAAHxQTE6Pw8HCtXLkyty05OVlxcXFq1qxZnu2bNWum7Oxsbd68ObctIyNDBw4cUJUqVVw+LiVYAAAAgA8ym83q06ePJkyYoKioKFWoUEHjx49XdHS0unTpIqvVqpMnTyoiIkLBwcFq1qyZrr32Wo0YMUJjxoxR8eLFNWnSJPn7++v22293+bjMgAAAAACu8PYDBz3wIMLBgwerR48eev7559W7d2/5+/tr2rRpMpvNSkhIUNu2bbVo0aLc7d977z21aNFCTzzxhHr06KGUlBTNmDFDUVFRLh/TZLdfSeXY1cV2pLa3uwAAgEeNOV7X210o0lbc08DbXSjy/m/TWG93oUBVpr3p7S7kK/6B4d7uwiVhBgQAAACAYbgHBAAAAHBFIX0Q4dWGGRAAAAAAhiEBAQAAAGAYSrAAAAAAF5h8Zukmz2IGBAAAAIBhSEAAAAAAGIYSLAAAAMAVlGC5BTMgAAAAAAxDAgIAAADAMJRgAQAAAK7gQYRuwQwIAAAAAMOQgAAAAAAwDCVYAAAAgCtYBcstmAEBAAAAYBgSEAAAAACGoQQLAAAAcAUlWG7BDAgAAAAAw5CAAAAAADAMJVgAAACAKyjBcgtmQAAAAAAYhgQEAAAAgGEowQIAAABcYTd5uwdFAjMgAAAAAAxDAgIAAADAMJRgAQAAAC4wsQqWWzADAgAAAMAwJCAAAAAADEMJFgAAAOAKSrDcghkQAAAAAIYhASnEEhKlFl2lVeu93ZOiixh7FvH1PGLsecTYNYfXp2jx8H36qvcOffvwLm2df0J2e8GXi21Wu+Lmn9D3j+/WV/fs0E9P71X8X8l5tjvwT7IWj9inr/v8q28f2qUV7x1W+qlsT36VQqtpm1qaNPtRLVw5Wp//3zO6+4H2F9w+IMBfdz/QXp98O0QLV47W1O+G6J6HOyogwD/f7UPDgvT5T0+ry21NPNF9IBclWIXUoSPSwGHSmRSTmO/zDGLsWcTX84ix5xFj1xzbnqZlrx9U5Wsj1aB3KR3flq5Ns45JNrvq9SiV7z5b5h5X3IITqtezlErXCdGBFWf099uHZfKTKreOlCTt/ztZf711WDX/V1wNe5dWxqlsbZ57XL++uF83jq8qf7PvXEet26iSXpp0r/78vy36/P1fVL9JFfUb1FkmP5PmfPJHvvs8POJmdbmtiWZN+V3/bj2omnXLq8+j16tsueKa+NICp23DI0P08qQ+KluhhBFfBz6OBKSQsdmkhf8nvfmht3tSdBFjzyK+nkeMPY8YX5otX51Q8arBaj2kvCSpfJNwxwzHgpOqc2uUAoLyJgp7fj2tKm0j1eAuR4IS3ShMSXsztPOnU7kJyJavT6j8NWFq/nB07n6RFc36eUS8Dq1Nyd3OF/R55Hrt2X5E45+bJ0la+9dO+Qf46a4B7TV/xl+yZDrPCoVHhqhrz+aa/s7PmvfZcknShpV7JEkPPnWjpr+7WKeT0iRJra6L0aMjb1FIqNnAbwRfdkmXDo4dO6aXXnpJDzzwgEaMGKHPPvtMa9asUXp6uqf653N27JZenih1u0F64zlv96ZoIsaeRXw9jxh7HjF2nTXLpsStaarUMsKpvVLrCGVn2HRsW/6/I1izbAoMdf41JCjSX5lnrJIku82u6EahqtGluNM2EeUcvySnHMly0zco/AID/dWgeTX9tTTOqX35kq0KDQtS/Wuq5tknLCJYP369Wit+3+7UfnDfcUlSdMWo3O1emHiPNq3Zq+ce+cwj/QfOd0kzIM8++6yWL1+uWrVq6eDBg/r+++9lt9vl5+en6tWrq379+mrQoIEaNGigmJgYBQYGeqrfRVa5stLiL6XoMtQbewox9izi63nE2POIsetSjmbJlm1XRHnnq+cR0Y7XZw5bVK5xWJ79Ym6NUtyCkyrfLFyl64To0JoUJaxPVaN7S0uSTH4mXdO/bJ79Dq48I0kqVjnI3V+l0IquGCWzOUCH4o87tR/ef0KSVKFKSa37Z5fTe0cPJemDV7/P81ltOtdTVla2DuUkIpnpWXr4jkk6uO+4ypYv7pkvUITwIEL3uKQEZP369Ro2bJgGDBggSUpLS9PWrVu1efNmbd68WatXr9aCBY6aQrPZrE2bNl30MzMzM7Vz507VrFlTwcHB2rZtm2bOnKmjR4+qVq1a6tevn6Kjoy/6OUVF8UhJvjOj7BXE2LOIr+cRY88jxq7LSrVJkgJDnGczAnJeZ6Vb892v9s0llLgtXX+MPZjbVv36YqrbrWSBxzpz2KL1M46pRPUglW+SN6kpqsIjgiVJaSmZTu1paRZJUmh4sEuf06ZzrDrd0kgLv/xHKWcyJEnZ2dbcWRHAKJeUgAQFBSk2Njb3dWhoqJo3b67mzZvntp06dUqbNm3Sli1bLvp5u3fvVv/+/XXs2DGVL19eY8eO1WOPPaaKFSuqRo0a+uWXXzR//nzNmjVLNWrUuJSuAgAAA+SudGXK/32TKe8b1iybfnl+v9JPZav5w2UVWSFIx7alaes3JxQQ7KemD+Sd+Th9MFO/vXxA/oEmtX2mgkx+BRywCDr7Xe0FLIRgt138snzbLvU0fFxPbV6zT5++87Nb+wdcqku6B6Rz586Ki4u74DbFixdX+/bt9dhjj13089588001adJECxcuVNOmTfXoo4/q1ltv1ffff693331XP/30k9q0aaNx48ZdSjcBAIBBzKGOJV2z0m1O7dk5r8+/z0OSDqw4o1Pxmbp2SHnV/F8JlakXqno9SqnxfWX076IknYrPcNr+6OZULXk2XiY/6fqXKim8rG/dLJ2aM1sRGuZcdhaac9N4akpGnn3OdWffazXqzbu1dX28Xhw0U1lZ+c9KwQV2U+H8ucpcUgLSvXt3/fTTT9q1a9fFN3bBqlWr9OSTTyomJkYjRoxQZmamevfunXu1JCAgQI888ojWrl3rluMBAAD3Co8OlMlPSkmwOLWfOeJ4XaxS3ns1Uo85VmwqFRPi1F6mXqgk6fTB/z5r37LT+n3sAYVGBajLa1UUWcF37v046/CBk7JmW1W+snN52tnX+3cnFrjvoyO76qFhN2v5kq0a/dgMZaRbCtwWMMolJSB33XWXtmzZop49e2rUqFFatGiR4uPjL/vgwcHByshwZO2lSpXSXXfdpaAg5xNLcnKyIiIi8tsdAAB4mb/ZT6VjQ3Vg5RmnBw8e+OeMAsP8FFUz7/0JkRUcV+7PXyHr+HbHsrDhZRyL2Bxem6IVkxJUqk6IOr9aRaElfXNxmyxLtjavi1ebTrFO7W271NOZ5HTt2HIw3/3uH9xFt9/TWvNn/KVxw+cy84FC45LuARk7dqy2bdumrVu36qefftKCBQtkMpkUFham2NhY1a9fX8OHD3f589q2batXXnlFY8eOVY0aNTRmzJjc9+x2u1atWqWXX35ZnTt3vpRuAgAAA9XrUVK/vXxAf711WNWvL6bjO9K17duTatyntAKC/JSVZtXpgxaFlw1UcLEAVWgWrpK1gvXPu4fV4O5Siqxg1omdGdr6zfGc90Jktdi06sMjCgjxU2z3Uko+5HzlPrRkgE8lJLM//l3jPu6v5yb00uKFaxXbqLJ69G+r6e/8LEtmtkLDglS5RmklHDip00lpql4nWj0HtNO/Ww7qz583K6ZhRafP27/7mNJSMws4GgrEKlhucUkJSI8ePXL/32azaffu3dq6dau2bNmiuLg4zZkz55ISkFGjRumRRx7R5MmT9dZbbzm9t2jRIj399NNq166dnnrqqUvpJgAAMFB0gzC1HVZBm+cc17I3DikkKkCN7yuturc5SoRO7snQry8eUMvHo1X9+uLy8zep4+hK2jjrmLbOO6HMFKvCywaqXvdSqnOr4/kUx3akKz3JUar1+5gDeY5Z/66SanB3aeO+pJdtXLVHY5+arb6PddLod+7VicRkTX17sebP+EuSVLNueb05/QG99fw3WvLderXpVE9+fn6qXb+i3pn5SJ7PGz5gmjat2Wv01wAkSSb7ufOlV8hut+e72sXFnDp1SsWLF3dqO3nypBITExUTE+Om3km2I7Xd9lkAABRGY47X9XYXirQV9zTwdheKvP/bNNbbXShQ9Xfe9nYX8rXnyavrYv0lzYBczOUkH5LyJB+SFBUVpaioqCvsEQAAAOAmlGC5xSXdhA4AAAAAV4IEBAAAAIBh3FqCBQAAABRVJkqw3IIZEAAAAACGIQEBAAAAYBhKsAAAAABXUILlFsyAAAAAADAMCQgAAAAAw1CCBQAAALiCEiy3YAYEAAAAgGFIQAAAAAAYhhIsAAAAwAU8iNA9mAEBAAAAYBgSEAAAAACGoQQLAAAAcIXd5O0eFAnMgAAAAAAwDAkIAAAAAMNQggUAAAC4glWw3IIZEAAAAACGIQEBAAAAYBhKsAAAAAAX8CBC92AGBAAAAIBhSEAAAAAAGIYSLAAAAMAVlGC5BTMgAAAAAAxDAgIAAADAMJRgAQAAAC5gFSz3YAYEAAAAgGFIQAAAAAAYhhIsAAAAwBWUYLkFMyAAAACAj7LZbJo0aZLatWunRo0aacCAAYqPjy9w+wULFqhOnTp5fi60z/mYAQEAAAB81OTJkzVnzhyNGzdOZcuW1fjx4zVw4ED98MMPMpvNebbfsWOHWrRoobffftupPSoqyuVjMgMCAAAAuMJeSH8uk8Vi0fTp0zVo0CB16NBBMTExmjhxoo4ePaolS5bku8+///6rmJgYlS5d2unH39/f5eOSgAAAAAA+aPv27UpNTVWrVq1y2yIjIxUbG6vVq1fnu8+OHTtUs2bNKzouJVgAAADAVaxTp04XfH/p0qX5th85ckSSVK5cOaf2MmXKKCEhIc/2J0+e1PHjx7V69Wp98cUXOnXqlBo1aqRnnnlG1apVc7m/zIAAAAAALjDZC+fP5UpPT5ekPPd6BAUFKTMzM8/2//77ryTJ399fb7zxhiZOnKi0tDTdc889On78uMvHZQYEAAAAuIoVNMNxMcHBwZIc94Kc/X9JyszMVEhISJ7tW7VqpVWrVqlYsWK5bR988IE6duyo+fPn66GHHnLpuMyAAAAAAD7obOlVYmKiU3tiYqKio6Pz3efc5EOSQkNDVbFiRR09etTl45KAAAAAAD4oJiZG4eHhWrlyZW5bcnKy4uLi1KxZszzbz5o1Sy1btlRGRkZuW0pKivbt23dJN6aTgAAAAAA+yGw2q0+fPpowYYKWLl2q7du3a+jQoYqOjlaXLl1ktVp17Nix3ISjY8eOstvtGj58uHbu3KnNmzdr0KBBioqK0h133OHycUlAAAAAAB81ePBg9ejRQ88//7x69+4tf39/TZs2TWazWQkJCWrbtq0WLVokyVGy9fnnnys1NVW9e/dW//79FRERoRkzZjjdQ3IxJrvdfgX3zl9dbEdqe7sLAAB41Jjjdb3dhSJtxT0NvN2FIu//No31dhcKVGfMRG93IV87Rg/1dhcuCTMgAAAAAAxDAgIAAADAMDwHBAAAAHDBlTz0D/9hBgQAAACAYUhAAAAAABiGEiwAAADAFZRguYVPJSA3lG/k7S4AKMxMTAp7nN3m7R4UfYxjz7Lv8HYPgKseZykAAAAAhvGpGRAAAADgslGC5RbMgAAAAAAwDAkIAAAAAMNQggUAAAC4gAcRugczIAAAAAAMQwICAAAAwDCUYAEAAACuoATLLZgBAQAAAGAYEhAAAAAAhqEECwAAAHABq2C5BzMgAAAAAAxDAgIAAADAMJRgAQAAAK6gBMstmAEBAAAAYBgSEAAAAACGoQQLAAAAcAUlWG7BDAgAAAAAw5CAAAAAADAMJVgAAACAC3gQoXswAwIAAADAMCQgAAAAAAxDCRYAAADgCkqw3IIZEAAAAACGIQEBAAAAYBhKsAAAAABXUILlFsyAAAAAADAMCQgAAAAAw1CCBQAAALiABxG6BzMgAAAAAAxDAgIAAADAMJRgAQAAAK6gBMstmAEBAAAAYBgSEAAAAACGoQQLAAAAcAGrYLkHMyAAAAAADEMCAgAAAMAwlGABAAAArqAEyy2YAQEAAABgGBIQAAAAAIYhAQEAAABgGO4BAQAAAFzBPSBuwQwIAAAAAMOQgAAAAAAwDCVYAAAAgAtM3u5AEcEMCAAAAADDkIAAAAAAMAwJiJc0u6GxPlj1ur5PmamZeyer18huLu9b65rq+ilztspWKe25DhYBxNiziK/nNbuhkT5Y+Zq+PzNDM/e8r14jurm8b61rqumnjC+J8UUwjj2LMex5jGGD2Qvpz1WGBMQLYlvX1phvR2j/tkN6ufsE/TLzT90/trfuefbOi+5bvWEVjf1hlAICuX3nQoixZxFfz4ttXVtjFg7X/u2H9HKPt/TLzGW6f+zdumfUHRfdt3rDKhr7/UhifBGMY89iDHseYxhXK0adF/Qd3VO7N+zTG/3ekyStWbxBAYH+untEN817+wdZMix59gkIDFC3QTeq35hesqTnfR/OiLFnEV/P6zu6R06MP5AkrVm8MSfGt2vexB9kycjKs09AoL+6PXGT+o25ixi7gHHsWYxhz2MM42rFDIjBAs0BanhdPS1fsNKp/c95KxQaEaIG7WLy3a/FzU3UZ3RPzX5tvqaOnGlEV69axNiziK/nBZoD1LBDrJYvWOXU/uc3K3NiXDff/Rwx7q7Zry3Q1FGzjOjqVYtx7FmMYc9jDHuHyV44f642JCAGK1e9rMxBgTr072Gn9sO7jkiSKtYun+9+O1bvVt9qj2vWa/NlzbZ5vJ9XM2LsWcTX83JjvDPBqT03xrXK5bvfjtW71bf6E5o1boGs2VaP9/Nqxjj2LMaw5zGGcTUrtAnIrbfeqoSEhItveJUJKx4mSUpNTndqTzvjeB0aGZLvficOn9SZpBTPdq6IIMaeRXw9L6x4qKTLiXGSziSlerZzRQTj2LMYw57HGMbVzKv3gCxcuLDA9+Lj4/XTTz8pKipKktStWzdjOuVhfn45j7Cx5z9fZrNdhfNohQwx9izi63l+fjnXhoixxzCOPYsx7HmMYS8hrG7h1QTk5ZdfVkZGhiTJns9foDfffFOSZDKZikwCknLKcWUnNDLUqT00wnGlIvV0muF9KmqIsWcRX8/7L8bOVzBzY5xMjK8U49izGMOexxjG1cyrCcj8+fP1zDPPKCIiQm+88YbKli2b+16TJk303XffqVKlSl7sofsd3n1U1myryteMdmo/+3p/3EFvdKtIIcaeRXw9LzfGNYixpzCOPYsx7HmMYVzNvHoPSLVq1TR37lw1bNhQt99+uxYtWuTN7hgiKzNLm/7cprZ3tHRqb9+jlc4kpWj7ql1e6lnRQYw9i/h63n8xbuHU3r57S2LsJoxjz2IMex5j2Eu8/cBBHkToHgEBAXrqqaf03nvvacKECXr66ad15swZb3fLo2a9+o1iWtbUC3OfUvMbG6vfmLvV85nbNHvcAlkyLAqNCFHdlrVUrFSkt7t61SLGnkV8PW/Wa/NzYjzUEeOX71LPZ27V7HELZcnIOifGEd7u6lWLcexZjGHPYwzjauX1BOSs5s2b596UfssttygrK+8DioqKDb9t0Zgeb6linfJ6acFwdbqnnT4Z/oW+nvCdJKnmNdU06Z/X1LLrNV7u6dWLGHsW8fW8Db9t1Zieb6ti7XJ6af4z6nRPW30y/Et9/db3knJi/PdYYnwFGMeexRj2PMYwrlYme353f3vZwoULNX/+fE2YMEFlypRx2+d28evpts8CUASZCs01maLLznMHPI5x7FmMYY9bYvva210oUONBE73dhXxteG+ot7twSbx6E3pBunXrVmRWvQIAAADwHy6TAAAAADBMoZwBAQAAAAqdQnfjwtWJGRAAAAAAhiEBAQAAAGAYSrAAAAAAF5gowXILZkAAAAAAH2Wz2TRp0iS1a9dOjRo10oABAxQfH+/Svt9//73q1KmjgwcPXtIxSUAAAAAAHzV58mTNmTNHY8eO1dy5c2UymTRw4EBZLJYL7nfo0CG9/PLLl3VMEhAAAADAFfZC+nOZLBaLpk+frkGDBqlDhw6KiYnRxIkTdfToUS1ZsqTA/Ww2m4YNG6Z69epd1nFJQAAAAAAftH37dqWmpqpVq1a5bZGRkYqNjdXq1asL3O+jjz5SVlaWHn744cs6LjehAwAAAD7oyJEjkqRy5co5tZcpU0YJCQn57rNp0yZNnz5d8+bN09GjRy/ruCQgAAAAgAsK6ypYnTp1uuD7S5cuzbc9PT1dkmQ2m53ag4KCdPr06Tzbp6Wl6ZlnntEzzzyjqlWrXnYCQgkWAAAA4IOCg4MlKc8N55mZmQoJCcmz/dixY1W1alX16tXrio7LDAgAAABwFStohuNizpZeJSYmqnLlyrntiYmJiomJybP9N998I7PZrCZNmkiSrFarJOmWW27RbbfdpjFjxrh0XBIQAAAAwBWFtATrcsXExCg8PFwrV67MTUCSk5MVFxenPn365Nn+559/dnq9ceNGDRs2TB9//LFq1Kjh8nFJQAAAAAAfZDab1adPH02YMEFRUVGqUKGCxo8fr+joaHXp0kVWq1UnT55URESEgoODVaVKFaf9z97EXr58eZUsWdLl43IPCAAAAOCjBg8erB49euj5559X79695e/vr2nTpslsNishIUFt27bVokWL3HpMk91uL2KTSQXr4tfT210AUJiZuCbjcXabt3tQ9DGOPYsx7HFLbF97uwsFuubhid7uQr7WTRnq7S5cEs5SAAAAAAxDAgIAAADAMNyEDgAAALigsD6I8GrDDAgAAAAAw5CAAAAAADAMJVgAAACAKyjBcgtmQAAAAAAYhgQEAAAAgGEowQIAAABcYPKd53d7FDMgAAAAAAxDAgIAAADAMJRgAQAAAK6gAsstmAEBAAAAYBgSEAAAAACGoQQLAAAAcIGJEiy3YAYEAAAAgGFIQAAAAAAYhhIsAAAAwBWUYLkFMyAAAAAADEMCAgAAAMAwlGABAAAALmAVLPdgBgQAAACAYUhAAAAAABiGEiwAAADAFZRguQUzIAAAAAAMQwICAAAAwDCUYAEAAAAuYBUs92AGBAAAAIBhSEAAAAAAGIYSLAAAAMAVlGC5BTMgAAAAAAzjWzMgJvItAPAqzsOeZ7d5uwdFG2MYuGK+lYAAAAAAl4lVsNyDNB4AAACAYUhAAAAAABiGEiwAAADAFXZqsNyBGRAAAAAAhiEBAQAAAGAYSrAAAAAAF7AKlnswAwIAAADAMCQgAAAAAAxDCRYAAADgCkqw3IIZEAAAAACGIQEBAAAAYBhKsAAAAAAXmGze7kHRwAwIAAAAAMOQgAAAAAAwDCVYAAAAgCtYBcstmAEBAAAAYBgSEAAAAACGoQQLAAAAcIGJEiy3YAYEAAAAgGFIQAAAAAAYhhIsAAAAwBV2arDcgRkQAAAAAIYhAQEAAABgGEqwAAAAABewCpZ7MAMCAAAAwDAkIAAAAAAMQwkWAAAA4ApKsNyCGRAAAAAAhiEBAQAAAGAYSrAAAAAAF7AKlnswAwIAAADAMCQgAAAAAAxDCRYAAADgCjs1WO7ADAgAAAAAw5CAAAAAADAMJVgAAACAC1gFyz2YAQEAAABgGBIQAAAAAIahBAsAAABwBSVYbsEMCAAAAADDkIAAAAAAMAwJCAAAAOACk71w/lwJm82mSZMmqV27dmrUqJEGDBig+Pj4ArffsmWL+vXrpyZNmqhVq1YaPXq0kpOTL+mYJCAAAACAj5o8ebLmzJmjsWPHau7cuTKZTBo4cKAsFkuebRMTE3X//fercuXKWrBggSZPnqx169ZpxIgRl3RMEhAAAADAB1ksFk2fPl2DBg1Shw4dFBMTo4kTJ+ro0aNasmRJnu0PHTqkdu3a6cUXX1TVqlV1zTXXqGfPnvrnn38u6bisggUAAAC4wla0lsHavn27UlNT1apVq9y2yMhIxcbGavXq1eratavT9k2aNFGTJk1yX+/atUsLFixQmzZtLum4JCAAAADAVaxTp04XfH/p0qX5th85ckSSVK5cOaf2MmXKKCEh4YKfecMNN2jfvn2qUKGCJk+efAm9pQTLa5rd0EgfrHxN35+ZoZl73levEd1c3rfWNdX0U8aXKlultOc6WAQQY88ivp5HjD2PGHtWsxsa64NVr+v7lJmauXeyeo3s5vK+ta6prp8yZxPfi2AM40qkp6dLksxms1N7UFCQMjMzL7jvhAkTNHPmTJUuXVr33XefUlNTXT4uMyBeENu6tsYsHK4/vvpbn46eq/ptYnT/2Lvl52fSrHELLrhv9YZVNPb7kQoI5I/uQoixZxFfzyPGnkeMPSu2dW2N+XaE/pj7tz59YY7qt43R/WN7y8/PT7Nem3/Bfas3rKKxP4wivhfBGPaCQlqBVdAMx8UEBwdLctwLcvb/JSkzM1MhISEX3LdBgwaSpPfee08dOnTQkiVL1K1bN5eOy6jzgr6je2j3hn16o98HkqQ1izcqINBfd4+4XfMm/iBLRlaefQIC/dXtiZvUb8xdsqTnXZUAzoixZxFfzyPGnkeMPavv6J458X1PkrRm8Yac+HbTvLd/kCUjb/wCAgPUbdCN6jemF/F1AWMYV+ps6VViYqIqV66c256YmKiYmJg82+/evVsHDx5Uhw4dctvKlCmjYsWK6ejRoy4flxIsgwWaA9SwQ6yWL1jl1P7nNysVGhGiBu3q5rtfi5ubqM/o7pr92gJNHTXLiK5etYixZxFfzyPGnkeMPSvQHKCG19XT8gUrndr/nLciJ755f7GRzsa3p2a/Nl9TR840oqtXLcYw3CEmJkbh4eFaufK/v6vJycmKi4tTs2bN8my/bNkyDRkyRCkpKblt+/fvV1JSkmrUqOHycUlADFauelmZgwJ1aKfzjT2HdzluAqpYq1x+u2nH6t3qW/0JzRq3QNZsq8f7eTUjxp5FfD2PGHseMfas3Pj+e9ipPTe+tcvnu9+O1bvVt9rjmvXafFmzbR7v59WMMewd3n7goLsfRGg2m9WnTx9NmDBBS5cu1fbt2zV06FBFR0erS5cuslqtOnbsmDIyMiRJt99+uyIiIjRs2DDt3LlTa9as0eDBg9WwYUN17NjR5eN6NQGZN29enoecrFixQg899JBuu+02Pf3009q1a5eXeucZYcVDJUmpyelO7WlnHK9DI/OvtztxOElnkly/uceXEWPPIr6eR4w9jxh7VljxMEmXE9+TOpOUku97cMYYhrsMHjxYPXr00PPPP6/evXvL399f06ZNk9lsVkJCgtq2batFixZJkkqUKKEZM2bIZrOpd+/eevzxxxUbG6tp06bJ39/f5WN69R6QF154QR07dlTJkiUlScuXL9fAgQPVpk0btW3bVlu2bFH37t316aef6pprrvFmV93Gzy8n57Pnn67aitj60t5AjD2L+HoeMfY8YuxZfn4mx/8QX49hDMNd/P39NWzYMA0bNizPexUrVtSOHTuc2qpVq6YpU6Zc0TG9moDYz/tLM3nyZN13330aNWpUbtu4ceM0YcIEzZpVNOoUU045rjqcf2UiNMLxOjU5zfA+FTXE2LOIr+cRY88jxp71X3xDndpz43ua+F4pxrCXFJDw4dIUqntA4uPjdfvttzu13X333YqLi/NSj9zv8O6jsmZbVb5GtFN7+ZqO1/vjDnqjW0UKMfYs4ut5xNjziLFn5ca3JvH1FMYwrmZeTUBMJpPT66pVqyotzTljT0pKUkREhJHd8qiszCxt+nOb2t7Rwqm9ffeWOpOUou2ritY9L95AjD2L+HoeMfY8YuxZ/8W3pVN7+x6tiK+bMIZxNfNqAmK329WpUyfdcccdeuaZZ2Q2mzV+/HhlZTnWrV63bp1efvllp7WGi4JZr81XTMuaemHuUDW/sbH6vXyXej5zq2aPWyhLRpZCI0JUt2UtFStVdBIvoxFjzyK+nkeMPY8Ye9asV7/Jie9TjviOuVs9n7lNs8ctkCXDck58I73d1asWY9h43l7tyt2rYHmLVxOQX3/9VRMnTtSNN94om82mY8eOaevWrbJaHcvCPfDAAwoNDdXTTz/tzW663YbftmpMz7dVsXY5vTT/GXW6p60+Gf6lvn7re0lSzWuqadLfY9Wya9G48d4biLFnEV/PI8aeR4w9a8NvWzSmx1uqWKe8XlowXJ3uaadPhn+hryd8Jyknvv+8RnyvAGMYVyuT/fw7wb0sKytLgYGBkqQdO3aodu3aeUq1LlcX/7vd8jkAABRadp6f4VGmQnX7bJG0xDrX210oUMcb3vB2F/L12+IR3u7CJfHqKlj5OZt8SFKdOnW82BMAAADgHIXqsv3VizQeAAAAgGFIQAAAAAAYptCVYAEAAACFkalw3Tp91WIGBAAAAIBhSEAAAAAAGIYSLAAAAMAVrHLtFsyAAAAAADAMCQgAAAAAw1CCBQAAALiAVbDcgxkQAAAAAIYhAQEAAABgGEqwAAAAAFdQgeUWzIAAAAAAMAwJCAAAAADDUIIFAAAAuIJVsNyCGRAAAAAAhiEBAQAAAGAYSrAAAAAAF5iowHILZkAAAAAAGIYEBAAAAIBhKMECAAAAXMEqWG7BDAgAAAAAw5CAAAAAADAMJVgAAACAC0w2b/egaGAGBAAAAIBhSEAAAAAAGIYSLAAAAMAVrILlFsyAAAAAADAMCQgAAAAAw1CCBQAAALiCCiy3YAYEAAAAgGFIQAAAAAAYhhIsAAAAwAUmVsFyC2ZAAAAAABiGBAQAAACAYSjBAgAAAFxBCZZbMAMCAAAAwDAkIAAAAAAMQwkWAAAA4AqbtztQNDADAgAAAMAwJCAAAAAADEMJFgAAAOACHkToHsyAAAAAADAMCQgAAAAAw1CCBQAAALiCEiy3YAYEAAAAgGFIQAAAAAAYhhIsAAAAwBWUYLkFCQgAAEWJieIGAIUbZykAAAAAhmEGBAAAAHCFzdsdKBqYAQEAAABgGBIQAAAAAIahBAsAAABwgYlVsNyCGRAAAAAAhiEBAQAAAGAYSrAAAAAAV1CC5RbMgAAAAAAwDAkIAAAAAMNQggUAAAC4ghIst2AGBAAAAIBhSEAAAAAAGIYSLAAAAMAVlGC5BTMgAAAAAAxDAgIAAADAMJRgAQAAAK6websDRQMzIAAAAAAMQwICAAAA+CibzaZJkyapXbt2atSokQYMGKD4+PgCt9+5c6ceeughtWzZUq1bt9bgwYN1+PDhSzomCQgAAADgApPdXih/rsTkyZM1Z84cjR07VnPnzpXJZNLAgQNlsVjybJuUlKT7779fYWFhmjlzpj755BMlJSXpwQcfVGZmpsvHJAEBAAAAfJDFYtH06dM1aNAgdejQQTExMZo4caKOHj2qJUuW5Nn+l19+UXp6ul5//XXVqlVL9evX1/jx47V7926tW7fO5eOSgAAAAAA+aPv27UpNTVWrVq1y2yIjIxUbG6vVq1fn2b5169b64IMPFBQUlOe906dPu3xcVsECAAAAXFFIH0TYqVOnC76/dOnSfNuPHDkiSSpXrpxTe5kyZZSQkJBn+4oVK6pixYpObVOmTFFQUJCaN2/ucn+ZAQEAAAB8UHp6uiTJbDY7tQcFBbl0T8eMGTM0a9YsPfXUUypZsqTLx2UGBAAAALiKFTTDcTHBwcGSHPeCnP1/ScrMzFRISEiB+9ntdr377rv68MMP9fDDD6t///6XdFwSEAAAAMAVtsJZgnW5zpZeJSYmqnLlyrntiYmJiomJyXefrKwsjRo1Sj/88IOGDx+uBx544JKPSwkWAAAA4INiYmIUHh6ulStX5rYlJycrLi5OzZo1y3ef4cOH6//+7//01ltvXVbyITEDAgAAAPgks9msPn36aMKECYqKilKFChU0fvx4RUdHq0uXLrJarTp58qQiIiIUHBys+fPna9GiRRo+fLhatGihY8eO5X7W2W1cwQwIAAAA4Aq7vXD+XIHBgwerR48eev7559W7d2/5+/tr2rRpMpvNSkhIUNu2bbVo0SJJ0g8//CBJevPNN9W2bVunn7PbuMJktxfS9cQ8oIv/3d7uAgAAAC5giXWut7tQoJtqj/B2F/L1079veLsLl4QZEAAAAACG4R4QAAAAwBW+UzjkUcyAAAAAADAMCQgAAAAAw1CCBQAAALiCEiy3YAYEAAAAgGFIQAAAAAAYhhIsAAD+v717D6qy3vc4/sHL4qLg0Y6CaTqCF1yphINbK5WdDtPeXjo6u709mA0mool5OWaXbRqZpF1IC2+NHtTOmImXoqS0ocYp9ZRiJk0SWireUigqES+Ass4fHWkYabfS9Tw/1uP7NbNmWj94Wp/5DKN++f3WswDAGzUcwfIFdkAAAAAA2IYBBAAAAIBtOIIFAAAAeMNTYzqBI7ADAgAAAMA2DCAAAAAAbMMRLAAAAMAbfBChT7ADAgAAAMA2DCAAAAAAbMMRLAAAAMAbfBChT7ADYkjcvTFaunu+tpz7H609skT/+cQIr6/t0ruTtl56Q+EdW1sX0AHo2Fr0az06th4dW4t+rUfH8EcMIAa47+yqZ3Me1/GiU5p7/8v6cO0OPZQ+SqP/OfJ3r43s1VHpW55Uk6ZsXv0rdGwt+rUeHVuPjq1Fv9ajY/grfuoMePDp+3V4f7FeSFoqSdr7QYGaNG2sUU/8hzYtylXVpeprrmnStLFGPPJXJT37D1VdrLI7st+hY2vRr/Xo2Hp0bC36tR4dG8BdsHyCHRCbNXU1Ua94t3a+vafO+iebdyskNFg9B3Sv97o/DYnVmKf/pjfnv63//uc6O6L6LTq2Fv1aj46tR8fWol/r0TH8GQOIzdpGhssV2FSnvjldZ/27b89Iktp3aVvvdQfzD+vByEe0bsHbunL5iuU5/RkdW4t+rUfH1qNja9Gv9egY/sz4EayCggLt3r1bEyZMkCR99tlnWrNmjU6ePKkOHTpo3LhxiouLM5zSd5r9W4gk6Xz5xTrrF8798jwkLLje68q++8naYA5Cx9aiX+vRsfXo2Fr0az06NoQjWD5hdAdk27ZtSkxM1J49v2wfbt++XQ899JA8Ho/i4+NVXV2tpKQkbd++3WRMn2rU6P8r/40f4Bpu73bD6Nha9Gs9OrYeHVuLfq1Hx/BnRndAlixZokceeUSpqamSpOXLl+vhhx/WtGnTar9n+fLlyszM1D333GMqpk9V/Hxe0rW/mQgJ/eX5+fILtmdyGjq2Fv1aj46tR8fWol/r0TH8mdEdkOPHj2v48OG1z0+ePKl77723zvcMGzZMhw8ftjuaZb47XKIrl6/o1qiIOuu3dv7l+fHCkyZiOQodW4t+rUfH1qNja9Gv9ejYEI+nYT78jNEB5LbbbtPHH39c+7x79+4qKiqq8z1ffvmlwsPD7Y5mmerKan35ydfqP/JPddYH/q2vzv1UoaI93xpK5hx0bC36tR4dW4+OrUW/1qNj+DOjA0hKSooWLFigjIwMFRUVKTU1VUuXLlV2drb27dun1atXKy0tTQ888IDJmD63bv5biu7bWXOy/0t9/nKHkub+Q3+fOVxvLshR1aVqhYQGq3vfLmrx76Gmo/otOrYW/VqPjq1Hx9aiX+vRMfyV0QFkxIgRmj9/vrZu3aoRI0ZozJgxOnHihNLS0jR69GgtWbJEycnJGjt2rMmYPrd/+wE9+/eFat+1rZ55a6YGj+6vlY+/oY0vb5Ekde7dSZn/m66+Q3sbTuq/6Nha9Gs9OrYeHVuLfq1HxwbU1DTMh58J8HgaxsGxI0eOqLi4WBUVFWratKkiIiLkdrsVGBjos9dIaDzKZ/8vAAAA+F7elWzTEX7TX9tONh2hXltPLzUd4Q8x/jkgV0VGRioyMtJ0DAAAAAAWajADCAAAANCgNYyDQ37P6HtAAAAAANxcGEAAAAAA2IYjWAAAAIA3OILlE+yAAAAAALANAwgAAAAA23AECwAAAPBGDUewfIEdEAAAAAC2YQABAAAAYBuOYAEAAABe8HhqTEdwBHZAAAAAANiGAQQAAACAbTiCBQAAAHiDu2D5BDsgAAAAAGzDAAIAAADANhzBAgAAALzh4QiWL7ADAgAAAMA2DCAAAAAAbMMRLAAAAMAbNXwQoS+wAwIAAADANgwgAAAAAGzDESwAAADAG9wFyyfYAQEAAABgGwYQAAAAALbhCBYAAADgBQ93wfIJdkAAAAAA2IYBBAAAAIBtOIIFAAAAeIO7YPkEOyAAAAAAbMMAAgAAAMA2HMECAAAAvFHDESxfYAcEAAAAgG0YQAAAAADYhiNYAAAAgDc8fBChL7ADAgAAAMA2DCAAAAAAbMMRLAAAAMALHu6C5RPsgAAAAACwDQMIAAAAANtwBAsAAADwBnfB8gl2QAAAAADYhgEEAAAAgG0YQAAAAAAveGo8DfJxI2pqapSZmakBAwYoJiZG48aN07Fjx7y6Ljk5WYsXL/7Dr8kAAgAAANykli1bpvXr1ys9PV3Z2dkKCAhQSkqKqqqqfvOaS5cu6bHHHtPOnTuv6zUZQAAAAICbUFVVlVatWqUpU6YoPj5e0dHRWrRokUpKSpSXl1fvNfv27dPIkSNVUFCgsLCw63pdBhAAAADAG56ahvm4TkVFRTp//rz69etXuxYWFia32638/Px6r9mxY4cSEhKUk5Oj0NDQ63pdbsMLAAAA3ITOnDkjSWrbtm2d9TZt2uj06dP1XjNt2rQbfl0GEAAAAMCPDR48+F9+/aOPPqp3/eLFi5Ikl8tVZz0wMFBnz571Tbh63FQDSN6VbNMRAAAA4KfyajaajlCv3xtAfktQUJCkX94LcvW/JamyslLBwcE+yVafm2oAAQAAAJzmt3Y4fs/Vo1elpaXq0KFD7Xppaamio6N9kq0+vAkdAAAAuAlFR0erefPm2r17d+1aeXm5CgsLFRcXZ9nrsgMCAAAA3IRcLpfGjBmjjIwMtWrVSu3atdNLL72kiIgIJSQk6MqVK/rxxx8VGhpa54jWjWIHBAAAALhJTZ06Vffff79mz56txMRENW7cWFlZWXK5XDp9+rT69++v999/36evGeDxeG7s89sBAAAAwEvsgAAAAACwDQMIAAAAANswgAAAAACwDQMIAAAAANswgAAAAACwDQMIAAAAANswgAAAAACwDQMIAAAAANswgDQwNTU1yszM1IABAxQTE6Nx48bp2LFjpmM51rJly/Tggw+ajuEoP//8s55++mkNHDhQvXv3VmJiovbu3Ws6lqOUlZXpscceU79+/RQbG6sJEybo22+/NR3LkY4eParY2Fi99dZbpqM4yqlTp9StW7drHhs3bjQdzVFycnI0ZMgQ9ezZU0OHDtXWrVtNRwIkMYA0OMuWLdP69euVnp6u7OxsBQQEKCUlRVVVVaajOc6aNWuUmZlpOobjzJgxQwUFBVq4cKE2bdqk22+/XcnJyTp8+LDpaI4xadIknThxQitXrtSmTZsUFBSksWPH6uLFi6ajOUp1dbVmzpypCxcumI7iOAcPHlRgYKB27NihnTt31j6GDx9uOppjvPPOO5o1a5ZGjRql3NxcDRkyRDNmzNAXX3xhOhrAANKQVFVVadWqVZoyZYri4+MVHR2tRYsWqaSkRHl5eabjOUZJSYnGjx+vV199VZ06dTIdx1GOHTumXbt2KS0tTXFxcYqMjNRTTz2l8PBw5ebmmo7nCD/99JPat2+vefPmqWfPnoqKilJqaqq+//57ffPNN6bjOcrixYvVrFkz0zEc6dChQ+rUqZPatGmj1q1b1z6CgoJMR3MEj8ejV199VUlJSUpKSlLHjh01efJk3XXXXdqzZ4/peAADSENSVFSk8+fPq1+/frVrYWFhcrvdys/PN5jMWQ4cOKAWLVro3XffVUxMjOk4jtKyZUutWLFCPXr0qF0LCAiQx+PR2bNnDSZzjpYtW2rhwoXq0qWLJOmHH35QVlaWIiIi1LlzZ8PpnCM/P1/Z2dl64YUXTEdxpIMHD/LzaqEjR47o1KlT1+woZWVlaeLEiYZSAb9qYjoAfnXmzBlJUtu2beust2nTRqdPnzYRyZEGDRqkQYMGmY7hSGFhYYqPj6+ztnXrVh0/flz9+/c3lMq55syZow0bNsjlcmn58uUKCQkxHckRysvL9fjjj2v27NnX/HkM3zh06JBat26t0aNHq7i4WB07dlRqaqoGDBhgOpojFBcXS5IuXLig5ORkFRYWqn379po0aRJ//6FBYAekAbl6ftvlctVZDwwMVGVlpYlIwA35/PPPNWvWLA0ePJi/9CyQlJSkzZs367777tPkyZN14MAB05Ec4ZlnntEdd9zB+xEsUlVVpeLiYlVUVGj69OlasWKFevbsqZSUFH366aem4zlCRUWFJOmJJ57QsGHDtGrVKt19991KTU2lYzQI7IA0IFfPvlZVVdU5B1tZWang4GBTsYDr8uGHH2rmzJmKiYnRwoULTcdxpKtHWObNm6f9+/dr7dq1WrBggeFU/i0nJ0d79+7Vli1bTEdxLJfLpfz8fDVp0qT2F249evTQ4cOHlZWVpTvvvNNwQv/XtGlTSVJycrJGjhwpSerevbsKCwu1evVqOoZx7IA0IFe3+ktLS+usl5aWKiIiwkQk4LqsXbtWU6ZM0cCBA7Vy5UreWOpDZWVlys3N1ZUrV2rXGjVqpKioqGv+7MAft3nzZpWVlenPf/6zYmNjFRsbK0lKS0vT0KFDDadzjpCQkGt2+7t27aqSkhJDiZzl6r8ZunbtWme9c+fOOnnypIlIQB0MIA1IdHS0mjdvrt27d9eulZeXq7CwUHFxcQaTAd5bt26d5s2bpwceeECvvPLKNf/IwI0pLS3Vo48+WudONtXV1SosLFRUVJTBZM6QkZGh999/Xzk5ObUPSZo6dapWrFhhNpxDFBUVKTY29prPB/rqq694Y7qPuN1uNWvWTAUFBXXWDx06pA4dOhhKBfyKI1gNiMvl0pgxY5SRkaFWrVqpXbt2eumllxQREaGEhATT8YDfdfToUc2fP18JCQmaOHGiysrKar8WFBSk0NBQg+mcITo6Wv3799fcuXOVnp6usLAwvfbaayovL9fYsWNNx/N74eHh9a7fcsstateunc1pnKlr167q0qWL5s6dq7S0NLVs2VIbNmzQ/v37tWnTJtPxHCEoKEjjx4/X0qVLFR4erl69eum9997Trl27tGbNGtPxAAaQhmbq1Km6fPmyZs+erUuXLqlPnz7Kysrit8jwCx988IGqq6uVl5d3zWfXjBw5Us8//7yhZM4REBCgV155RS+//LKmT5+uc+fOKS4uTm+88YZuvfVW0/GA39WoUSO99tprysjI0PTp01VeXi63263Vq1erW7dupuM5RmpqqoKDg2s/TywqKkqLFy9W3759TUcDFODxeDymQwAAAAC4OfAeEAAAAAC2YQABAAAAYBsGEAAAAAC2YQABAAAAYBsGEAAAAAC2YQABAAAAYBsGEAAAAAC2YQABAAAAYBsGEADwM5WVlXK73YqNjdW8efNMxwEA4A9hAAEAPxMQEKDXX39dvXr10tq1a3X06FHTkQAA8BoDCAD4GZfLpT59+mj8+PGSpAMHDhhOBACA9xhAAMBPRUZGSpK+/vprw0kAAPAeAwgA+KmVK1dKkoqKigwnAQDAewwgAOCHdu7cqTfffFMtWrRQYWGh6TgAAHiNAQQA/Ex5eblmzZqlwYMHKzExUT/++KNKSkpMxwIAwCsMIADgZ+bOnavLly8rPT1dbrdbEsewAAD+gwEEAPzItm3blJubq+eee06tWrWqHUB4IzoAwF8wgACAn/j++++VlpamUaNG6Z577pEk3XbbbQoLC+N9IAAAv8EAAgB+Ys6cOWrRooWefPLJOuvdu3fnCBYAwG8wgACAH9i4caM++eQTvfjiiwoJCanzNbfbrePHj6uiosJQOgAAvBfg8Xg8pkMAAAAAuDmwAwIAAADANgwgAAAAAGzDAAIAAADANgwgAAAAAGzDAAIAAADANgwgAAAAAGzDAAIAAADANgwgAAAAAGzDAAIAAADANgwgAAAAAGzDAAIAAADANgwgAAAAAGzzf8yxZeYYKTFsAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/week43_43_1.png" + } + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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/FtcXNwNy7l582Zee+01evbsydNPP01gYCAAn376adpD7lfKf20ZL168yO7du6lbty758uWjS5cuzJs3jx07drB48WIef/zxG+5fRETyFqVgiYhco1GjRhw8eJDq1atTq1YtatWqRc2aNZk8eTJLly4FYODAgbz44ouAPWDp2LEj/fr1w2q1EhUVBYDZfP1T7Ny5c6lbty7t27encePGDj/du3cnOjqaP/74A7A/z7Fq1SqH0bH27dvHs88+y86dOwkNDSU8PJx9+/alzU9KSqJ///78/PPPgL0H4vTp0w5l2Lp16w3rY9u2bdhsNgYMGJAWfFit1rR0NJvNRsWKFSlUqBDLly93WHfhwoX06dOHxMREABo2bEj58uUZOXIkFy5c4MEHH7zh/kVEJG9RACIico1+/fpx/Phx+vbty7Jly1i1ahX9+/fn999/T3vGokmTJixdupQRI0awbt06Fi9ezJdffkn58uXTlgkICGDPnj1s3LiRhIQEh33s2LGD/fv3Z5qu1bZtWwoUKJD2kHe/fv24cOECffr04a+//uLPP/9k4MCB1KhRgzvuuIPOnTtTtmxZnn/+eRYsWMCqVasYMGAACQkJab0Md955J7///jvTp09n3bp1vPrqqxw7duyG9VG7dm0Ahg4dyvr161myZAlPPfUUYWFhgL0XxcPDg/79+7N48WLef/991qxZw7Rp0/jiiy/o3r17WuoaQJcuXdi4cSNNmzalZMmSN/OnERGRPEABiIjINYKDg5k2bRomk4lXX32VAQMGcObMGcaNG8ddd90FQLdu3Xj77bdZuXIlzz33HO+++y6VKlVi0qRJeHl5AdC7d2/Onj3L008/za5duxz2MWfOHDw8PBxGuvo3i8VCx44d2b59O3v37iUkJISffvoJm83GoEGDGDp0KHXr1uX777/HYrHg7+/P1KlTqVevHh999BEvvfQSiYmJ/PTTT2kPlL/xxhu0adOGkSNHMmDAAHx9fZ164WHjxo1599132bZtG3369GH48OGUKlUq7e3xV9KwevTowSeffMLmzZvp27cvkyZNonfv3rz++usO27vzzjsB9PC5iIibMhmGYeR0IURExH18//33TJgwgVWrVmGxWHK6OCIi4mJ6CF1ERFxi3rx57N+/n+nTp/Pss88q+BARcVMKQERExCXCwsKYOXMm7dq1o0+fPjldHBERySFKwRIREREREZfRQ+giIiIiIuIyCkBERERERMRlFICIiIiIiIjLKAARERERERGXcatRsDoU1qgr2cmoVCani5DnmY6czOki5GkmP7+cLkLe5686znZJyTldgjzNVkBtOLst3vJBThchU7bTVXO6CBkyB+7P6SLcFPWAiIiIiIiIyygAERERERERl3GrFCwRERERkVtlw5bTRcjQ7dajcLuVV0REREREbmMKQERERERExGWUgiUiIiIi4gSrkTtTsG63C3r1gIiIiIiIiMsoABEREREREZe53XpsRERERERyhA0jp4uQJ6gHREREREREXEYBiIiIiIiIuIxSsEREREREnJBbX0R4u1EPiIiIiIiIuIwCEBERERERcRmlYImIiIiIOMFqaBSsrKAeEBERERERcRkFICIiIiIi4jJKwRIRERERcYJeRJg11AMiIiIiIiIuowBERERERERcRilYIiIiIiJOsCoFK0uoB0RERERERFxGAYiIiIiIiLiMUrBERERERJygUbCyhnpARERERETEZRSAiIiIiIiIyygFS0RERETECVZDKVhZQT0gIiIiIiLiMgpARERERETEZZSCJSIiIiLiBFtOFyCPUA+IiIiIiIi4jAIQERERERFxGaVgiYiIiIg4waoXEWYJ9YCIiIiIiIjLKAARERERERGXUQqWiIiIiIgTrMrAyhLqAREREREREZdRACIiIiIiIi6jFCwRERERESfoRYRZQz0gIiIiIiLiMgpARERERETEZZSCJSIiIiLiBCumnC5CnqAeEBERERERcRkFICIiIiIibspms/HVV1/RsmVL6tSpQ+/evTl27Fimy4eHh/Pcc8/RqFEjmjdvzrBhw4iPj7+pfSoAERERERFxgs3InT//xddff83MmTMZNmwYs2bNwmQy0adPH5KSktIte+nSJbp37050dDQTJkxg/Pjx7Nq1ixdeeOGm9qkARERERETEDSUlJTFp0iT69+9Pq1atCA4OZvTo0URGRrJ06dJ0y8+bN4/Y2FjGjRtH7dq1qVWrFqNHj2bt2rVs3rzZ6f0qABERERERcUNhYWFcvnyZJk2apE0LCAggJCSETZs2pVv+yJEjVKxYkcKFC6dNK1myJIUKFWLjxo1O71ejYLlIg7Y16PXmgwRVK0n0uVgW/bCCWV/84dS6lesE8cWSN3g69G0iw885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RFwmV/SAiIiIiIjkdnnxRYQ5QT0gIiIiIiLiMgpARERERETEZZSCJSIiIiLihNvxpX+5kXpARERERETEZRSAiIiIiIiIyygFS0RERETECVZD9+6zgmpRRERERERcRgGIiIiIiIi4jFKwREREREScYNO9+yyhWhQREREREZdRACIiIiIiIi6jFCwRERERESfoRYRZQz0gIiIiIiLiMgpARERERETEZZSCJSIiIiLiBL2IMGuoFkVERERExGUUgIiIiIiIiMsoBUtERERExAk2jYKVJdQDIiIiIiIiLqMAREREREREXEYpWCIiIiIiTrDq3n2WUC2KiIiIiIjLKAARERERERGXUQqWiIiIiIgT9CLCrKFaFBERERERl1EAIiIiIiIiLqMULBERERERJ9h07z5LqBZFRERERMRlFICIiIiIiIjLKAVLRERERMQJVsOU00XIE9QDIiIiIiIiLqMAREREREREXEYBiIiIiIiIuIyeARERERERcYJV9+6zhGpRRERERERcRgGIiIiIiIi4jFKwREREREScYDN07z4rqBZFRERERMRlFICIiIiIiIjLKAVLRERERMQJGgUra6gWRURERETEZRSAiIiIiIiIyygFS0RERETECVbDlNNFyBPUAyIiIiIiIi6jAERERERERFxGKVgiIiIiIk6w6d59lnCrACTsw+CcLkKeZi6UmNNFyPMMo0JOFyFP87RYc7oIeV7Kad+cLkKeZ/O15XQR8rSBzZfmdBFEbnsK40RERERExGXcqgdERERERORWWQ3du88KqkUREREREXEZBSAiIiIiIuIySsESEREREXGCDb2IMCuoB0RERERERFxGAYiIiIiIiLiMUrBERERERJygUbCyhmpRRERERERcRgGIiIiIiIi4jFKwREREREScYNW9+yyhWhQREREREZdRACIiIiIiIi6jFCwRERERESfYDL2IMCuoB0RERERERFxGAYiIiIiIiLiMUrBERERERJygUbCyhmpRRERERERcRgGIiIiIiIi4jFKwREREREScYDN07z4rqBZFRERERNyUzWbjq6++omXLltSpU4fevXtz7NixTJc/c+YMgwcPpnHjxjRu3JiXXnqJ06dP39Q+FYCIiIiIiLipr7/+mpkzZzJs2DBmzZqFyWSiT58+JCUlZbj8oEGDiIiI4IcffuCHH37g9OnT9OvX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USH1PPzTzu1M2GZva41Ll2Fm50d5ZemfzPnXefilRqnn4Xz5OBZ9kR/+2crM3fY23rRMWaY/9Eim+/tiw1q+3Lgu+w/sGjZf240XygZ3l6vCoAbNqVigEJGXY/lx7za+32k/XzYpWZZZ93Tj5RWLmH0gtX69LAys35y7y1emmK8/xy9dZOKuLczc59g+GxQvxZDQltQtXpL4lGSWHDvIRxuuBimuNrD50hzZL8CR9XFsmnGRiyeTyVfEk5od81PnwQAATu5MYOE7kdzZvwjBbf0BSIqzsXHqRQ6viyMx1kpACS+qts5H7fsD8PBK/30SE5nC9L4nHbaREwZVX5Jj+76Rl7Z1z+kiZOjLerfXu55yTQASGRnJnj17aN26dbbtIycDEHeQkwGIu8jJAMQd5GQA4i5yMgBxFzkVgLiLnAxA3IUCkJt3uwUgOZ6CdUWJEiUoUaJEThdDRERERESyUa4JQEREREREcjObkePjN+UJqkUREREREXEZBSAiIiIiIuIySsESEREREXGCFQ0GkxXUAyIiIiIiIi6jAERERERERFxGKVgiIiIiIk6w6X1cWUI9ICIiIiIi4jIKQERERERExGWUgiUiIiIi4gS9iDBrqBZFRERERMRlFICIiIiIiIjLKAVLRERERMQJNr2IMEuoB0RERERERFxGAYiIiIiIiLiMUrBERERERJxg1YsIs4R6QERERERExGUUgIiIiIiIiMsoBUtERERExAl6EWHWUC2KiIiIiIjLKAARERERERGXUQqWiIiIiIgTbBoFK0uoB0RERERERFxGAYiIiIiIiLiMUrBERERERJxgQylYWUE9ICIiIiIi4jIKQERERERExGWUgiUiIiIi4gSNgpU11AMiIiIiIiIuowBERERERERcRilYIiIiIiJOsBm6d58VVIsiIiIiIuIyCkBERERERMRllIIlIiIiIuIEjYKVNdQDIiIiIiIiLqMAREREREREXEYpWCIiIiIiTrChFKysoB4QERERERFxGQUgIiIiIiLiMkrBEhERERFxgkbByhrqAREREREREZdRACIiIiIiIi6jFCwREREREScoBStrqAdERERERERcRgGIiIiIiIi4jFKwREREREScoBSsrKEeEBERERERcRkFICIiIiIibspms/HVV1/RsmVL6tSpQ+/evTl27FiGy44ZM4Zq1apl+PPGG284vU+TYRhGVh1AbrfgcN2cLoLIf1LYHJvTRcjTkvHI6SLkeVZD972yW1tfa04XIU87Z7uc00XI84qVOpnTRcjUPSsH5HQRMvT7HV/d8rpjx45l+vTpDB8+nBIlSjBy5EjCw8P57bffsFgsDstevnyZuLg4h2mzZ89m/PjxzJo1i+DgYKf2qW8CERERERE3lJSUxKRJk+jfvz+tWrUiODiY0aNHExkZydKlS9Mtny9fPooVK5b2Ex8fz7fffsvrr7/udPABCkBERERERNxSWFgYly9fpkmTJmnTAgICCAkJYdOmTTdc/5NPPqFKlSo8+uijN7VfjYIlIiIiIuIEG7lzFKy2bdted/7y5csznH769GkASpYs6TC9ePHiREREXHebO3fuZPny5UyZMgWz+eb6NNQDIiIiIiLihuLj4wHSPevh7e1NYmLiddedPHkyderUceg9cZZ6QEREREREbmOZ9XDciI+PD2B/FuTKvwESExPx9fXNdL24uDiWLl3Ke++9d0v7VQAiIiIiIuKEvPYiwiupV1FRUQQFBaVNj4qKuu5D5atWrcJms9G+fftb2q9SsERERERE3FBwcDD+/v5s2LAhbVpMTAx79uwhNDQ00/W2bNlCjRo1CAgIuKX9qgdERERERMQNWSwWevbsyWeffUbhwoUpXbo0I0eOJDAwkPbt22O1Wjl//jz58+d3SNEKCwujatWqt7xf9YCIiIiIiDjBZphy5c9/MWDAALp27crbb79N9+7d8fDwYOLEiVgsFiIiImjRogWLFi1yWOfs2bMULFjwlvepN6GL3Eb0JvTspTehZz+9CT376U3o2UtvQs9+uflN6O3/Nyini5ChpXeOzuki3BR9E4iIiIiIiMvoGRARERERESfktVGwcop6QERERERExGUUgIiIiIiIiMsoBUtERERExAlKwcoa6gERERERERGXUQAiIiIiIiIuoxQsEREREREnGErByhLqAREREREREZdRACIiIiIiIi6jFCwRERERESfYUApWVlAPiIiIiIiIuIwCEBERERERcRmlYImIiIiIOEEvIswa6gERERERERGXUQAiIiIiIiIuoxQsEREREREn6EWEWUM9ICIiIiIi4jIKQERERERExGWUgiUiIiIi4gSNgpU11AMiIiIiIiIuowBERERERERcRilYIiIiIiJO0ChYWUM9ICIi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5OYApMaC93O6CBna/cD7OV2Em5IrHkkMCsr8tlyFChWyJPgQEREREZGcp1tRIiIiIiLiMrmiB0REREREJLfL+QcX8gb1gIiIiIiIiMsoABEREREREZdRCpaIiIiIiBNux5f+5UbqAREREREREZdRACIiIiIiIi6jFCwREREREScoBStrqAdERERERERcRgGIiIiIiIi4jFKwREREREScoPcQZg31gIiIiIiIiMsoABEREREREZdRCpaIiIiIiBM0ClbWUA+IiIiIiIi4jAIQERERERFxGaVgiYiIiIg4Q8NgZQn1gIiIiIiIiMsoABEREREREZdRCpaIiIiIiBM0ClbWUA+IiIiIiIi4jAIQERERERFxGaVgiYiIiIg4wdAoWFlCPSAiIiIiIuIyCkBERERERMRlFICIiIiIiDjBMEy58ue/sNlsfPXVV7Rs2ZI6derQu3dvjh07lunyycnJjBo1ipYtW1K3bl169uzJ3r17b2qfCkBERERERNzU119/zcyZMxk2bBizZs3CZDLRp08fkpKSMlz+/fffZ/bs2Xz44YfMmTOHggUL0qdPHy5duuT0PhWAiIiIiIi4oaSkJCZNmkT//v1p1aoVwcHBjB49msjISJYuXZpu+fDwcGbPns3w4cO58847qVSpEh9//DEWi4Vdu3Y5vV+NgiUiIiIi4ow89iLCsLAwLl++TJMmTdKmBQQEEBISwqZNm7jnnnscll+9ejUBAQHccccdDsv/9ddfN7VfBSAiIiIiIrextm3bXnf+8uXLM5x++vRpAEqWLOkwvXjx4kRERKRb/ujRo5QtW5YlS5bw3XffERkZSUhICK+//jqVKlVyurxKwRIRERERcUPx8fEAWCwWh+ne3t4kJiamWz42Npbjx4/z9ddfM3jwYL755hs8PT157LHHOHfunNP7VQ+IiIiIiIgTcuuLCDPr4bgRHx8fwP4syJV/AyQmJuLr65tueS8vLy5dusTo0aPTejxGjx5Nq1atmDdvHs8884xT+1UPiIiIiIiIG7qSehUVFeUwPSoqisDAwHTLBwYG4unp6ZBu5ePjQ9myZTlx4oTT+1UAIiIiIiLihoKDg/H392fDhg1p02JiYtizZw+hoaHplg8NDSUlJYWdO3emTUtISCA8PJxy5co5vV+lYImIiIiIOCOXpmDdKovFQs+ePfnss88oXLgwpUuXZuTIkQQGBtK+fXusVivnz58nf/78+Pj4EBoaSrNmzXjttdcYOnQoBQsW5KuvvsLDw4MHHnjA6f2qB0RERERExE0NGDCArl278vbbb9O9e3c8PDyYOHEiFouFiIgIWrRowaJFi9KWHzNmDI0aNeLFF1+ka9euxMbG8uOPP1K4cGGn92kyjNz6OE3WW3C4bk4XQeQ/KWyOzeki5GnJeOR0EfI8q6H7Xtmtra81p4uQp52zXc7pIuR5xUqdzOkiZKri9I9zuggZOvzYmzldhJuiFCwREREREScYeexFhDlFt6JERERERMRlFICIiIiIiIjLKAVLRERERMQZbvPkdPZSD4iIiIiIiLiMAhAREREREXEZpWCJiIiIiDhBo2BlDfWAiIiIiIiIyygAERERERERl1EKloiIiIiIMzQKVpZQD4iIiIiIiLiMW/WAdPCNyeki5GkxRmJOFyHPCzB553QR8rRYIyGni5DnFTL75XQR8rxXI+vldBHytF1PVM3pIuR5f/6T0yWQ7OZWAYiIiIiIyK3TKFhZQSlYIiIiIiLiMgpARERERETEZZSCJSIiIiLiDI2ClSXUAyIiIiIiIi6jAERERERERFxGKVgiIiIiIs5QClaWUA+IiIiIiIi4jAIQERERERFxGaVgiYiIiIg4w9CLCLOCekBERERERMRlFICIiIiIiIjLKAVLRERERMQJhkbByhLqAREREREREZdRACIiIiIiIi6jFCwREREREWcoBStLqAdERERERERcRgGIiIiIiIi4jFKwREREREScoRcRZgn1gIiIiIiIiMsoABEREREREZdRCpaIiIiIiBNMGgUrS6gHREREREREXEYBiIiIiIiIuIxSsEREREREnKEUrCyhHhAREREREXEZBSAiIiIiIuIySsESEREREXGGXkSYJdQDIiIiIiIiLqMAREREREREXEYpWCIiIiIiztAoWFlCPSAiIiIiIuIyCkBERERERMRllIIlIiIiIuIMpWBlCfWAiIiIiIiIyygAERERERERl1EKloiIiIiIM5SClSXUAyIiIiIiIi6jAERERERERFxGKVgiIiIiIs4wTDldgjxBPSAiIiIiIuIyCkBERERERMRllIIlIiIiIuIEk0bByhLqAREREREREZdRACIiIiIiIi6jFCwREREREWcoBStLqAdERERERERcRj0gLrJ6g4mx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croIN0U9ICIiIiIi4jIKQERERERExGX0HhAREREREWe4zYML2Us9ICIiIiIi4jIKQERERERExGWUgiUiIiIi4oT/8tI/uUo9ICIiIiIi4jIKQERERERExGWUgiUiIiIi4gylYGUJ9YCIiIiIiIjLKAARERERERGXUQqWiIiIiIgTNApW1lAPiIiIiIiIuIwCEBERERERcRmlYImIiIiIOEMpWFlCPSAiIiIiIuIyCkBERERERMRllIIlIiIiIuIMpWBlCfWAiIiIiIiIyygAERERERERl1EKloiIiIiIE/QiwqyhHhAREREREXEZBSAiIiIiIuIyCkBERERERMRlFICIiIiIiIjLKAARERERERGX0ShYIiIiIiLO0ChYWUI9ICIiIiIi4jIKQERERERExGWUgiUiIiIi4gS9iDBrqAdERERERERcRgGIiIiIiIi4jFKwREREREScoRSsLOFWAcgD1VrldBHyNFt8fE4XIc8z+/rmdBHyNFtCYk4XIe8zbDldgrzPpOSG7GQyH87pIojc9nSWEhERERERl3GrHhARERERkVumFKwsoR4QERERERFxGQUgIiIiIiLiMkrBEhERERFxgl5EmDXUAyIiIiIiIi6jAERERERERFxGKVgiIiIiIs5QClaWUA+IiIiIiIi4jAIQERERERFxGaVgiYiIiIg4QaNgZQ31gIiIiIiIiMsoABEREREREZdRCpaIiIiIiDOUgpUl1AMiIiIiIiIuowBERERERERcRilYIiIiIiLOUApWllAPiIiIiIiIuIwCEBERERERcRmlYImIiIiIOEEvIswa6gERERERERGXUQAiIiIiIiIuoxQsERERERFnKAUrS6gHREREREREXEYBiIiIiIiIuIxSsEREREREnKEUrCyhHhAREREREXEZBSAiIiIiIuIySsESEREREXGCXkSYNdQDIiIiIiIiLqMAREREREREXEYpWCIiIiIizlAKVpZQD4iIiIiIiLiMAhAREREREXEZpWCJiIiIiDhBo2BlDfWAiIiIiIiIyygAERERERERl1EKloiIiIiIM5SClSXUAyIiIiIiIi6jAERERERERFxGAYiIiIiIiLiMAhAREREREWcYufTnP7DZbHz11Ve0bNmSOnXq0Lt3b44dO+bUugsXLqRatWqcOHHipvapAERERERExE19/fXXzJw5k2HD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kFzSI488okceecTsMFySr6+vQkNDrcY2bNigM2fOKDg42KSoXNeYMWP0xRdfyMPDQx999JG8vLzMDsklxMfHa9iwYRo9erTN+zEc49ixY6pQoYKeffZZnTp1StWrV9eAAQMUEhJidmgu4dSpU5Kk5ORk9e3bV5GRkQoICNCrr77K//9QILADUoDk9m97eHhYjXt6eiotLc2MkIC/5Mcff9TIkSPVpk0b/qfnBL1799aKFSvUsWNHvfbaazp8+LDZIbmE8ePH65577uF6BCdJT0/XqVOnlJiYqDfeeENz585Vo0aN1L9/f+3cudPs8FxCYmKiJGn48OHq0KGD5s+frwcffFADBgwgxygQ2AEpQHJ7X9PT0636YNPS0lSqVCmzwgLuyLfffquhQ4eqSZMmmj59utnhuKTcFpaJEydq//79WrRokSZPnmxyVIXb6tWrtXfvXn355Zdmh+KyPDw8tGfPHpUoUSLvA7eGDRvq+PHjioiIUMuWLU2OsPBzd3eXJPXt21ddunSRJDVo0ECRkZFasGABOYbp2AEpQHK3+uPi4qzG4+Li5OfnZ0ZIwB1ZtGiRBg4cqIceekjz5s3jwlIHunTpktatW6fMzMy8sWLFiql27do27x24fStWrNClS5f08MMPq2nTpmratKkkady4cWrfvr3J0bkOLy8vm93+evXqKTY21qSIXEvu3wz16tWzGq9Tp47Onj1rRkiAFQqQAiQwMFDe3t7atWtX3lh8fLwiIyPVrFkzEyMD7Ld48WJNnDhRzz33nD744AObPzLw18TFxemtt96yupNNRkaGIiMjVbt2bRMjcw3h4eFav369Vq9enfcjSYMGDdLcuXPNDc5FREVFqWnTpjbfD3To0CEuTHeQoKAglS5dWgcOHLAaP3bsmKpVq2ZSVMDvaMEqQDw8PNSzZ0+Fh4erXLly8vf317Rp0+Tn56e2bduaHR7wp06ePKl3331Xbdu21csvv6xLly7lPVayZEn5+PiYGJ1rCAwMVHBwsCZMmKBJkybJ19dXH3/8seLj4/XCCy+YHV6hV6lSpXzHy5cvL39/f4OjcU316tVT3bp1NWHCBI0bN05ly5bVF198of3792v58uVmh+cSSpYsqX79+mn27NmqVKmSGjdurK+++ko7duzQp59+anZ4AAVIQTNo0CBdv35do0ePVmpqqu6//35FRETwKTIKhY0bNyojI0ObNm2y+e6aLl26aMqUKSZF5jrc3Nz0wQcf6P3339cbb7yhhIQENWvWTJ9//rmqVKlidnjAnypWrJg+/vhjhYeH64033lB8fLyCgoK0YMEC1a9f3+zwXMaAAQNUqlSpvO8Tq127tmbNmqXmzZubHRogN4vFYjE7CAAAAABFA9eAAAAAADAMBQgAAAAAw1CAAAAAADAMBQgAAAAAw1CAAAAAADAMBQgAAAAAw1CAAAAAADAMBQgAAAAAw1CAAEAhk5aWpqCgIDVt2lQTJ040OxwAAG4LBQgAFDJubm5auHChGjdurEWLFunkyZNmhwQAgN0oQACgkPHw8ND999+vfv36SZIOHz5sckQAANiPAgQACqlatWpJko4cOWJyJAAA2I8CBAAKqXnz5kmSoqKiTI4EAAD7UYAAQCG0fft2/ec//1GZMmUUGRlpdjgAANiNAgQACpn4+HiNHDlSbdq0UY8ePXT58mXFxsaaHRYAAHahAAGAQmbChAm6fv26Jk2apKCgIEm0YQEACg8KEAAoRL7++mutW7dO77zzjsqVK5dXgHAhOgCgsKAAAYBC4sKFCxo3bpy6d++u1q1bS5KqVq0qX19frgMBABQaFCAAUEiMGTNGZcqU0YgRI6zGGzRoQAsWAKDQoAABgEJg2bJl2rp1q6ZOnSovLy+rx4KCgnTmzBklJiaaFB0AAPZzs1gsFrODAAAAAFA0sAMCAAAAwDAUIAAAAAAMQwECAAAAwDAUIAAAAAAMQwECAAAAwDAUIAAAAAAMQwECAAAAwDAUIAAAAAAMQwECAAAAwDAUIAAAAAAMQwECAAAAwDAUIAAAAAAM8//cSy9IEvdMCQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/week43_43_2.png" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "# visual representation of grid search\n", + "# uses seaborn heatmap, you can also do this with matplotlib imshow\n", + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "\n", + "train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " dnn = DNN_numpy[i][j]\n", + " \n", + " train_pred = dnn.predict(X_train) \n", + " test_pred = dnn.predict(X_test)\n", + "\n", + " train_accuracy[i][j] = accuracy_score(Y_train, train_pred)\n", + " test_accuracy[i][j] = accuracy_score(Y_test, test_pred)\n", + "\n", + " \n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Training Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "647e5296", + "metadata": { + "editable": true + }, + "source": [ + "## scikit-learn implementation\n", + "\n", + "**scikit-learn** focuses more\n", + "on traditional machine learning methods, such as regression,\n", + "clustering, decision trees, etc. As such, it has only two types of\n", + "neural networks: Multi Layer Perceptron outputting continuous values,\n", + "*MPLRegressor*, and Multi Layer Perceptron outputting labels,\n", + "*MLPClassifier*. We will see how simple it is to use these classes.\n", + "\n", + "**scikit-learn** implements a few improvements from our neural network,\n", + "such as early stopping, a varying learning rate, different\n", + "optimization methods, etc. We would therefore expect a better\n", + "performance overall." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "277402f6", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.18333333333333332\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.18611111111111112\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.13055555555555556\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.24444444444444444\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.23333333333333334\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.12777777777777777\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.1527777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.9111111111111111\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.8888888888888888\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.8722222222222222\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.8305555555555556\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.8888888888888888\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.8805555555555555\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.8944444444444445\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.975\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.9777777777777777\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.9805555555555555\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.9861111111111112\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.9805555555555555\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.9777777777777777\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.9444444444444444\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.9861111111111112\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.9888888888888889\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.9888888888888889\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.9861111111111112\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.9888888888888889\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.9722222222222222\n", + "\n", + "Learning rate = 0.01\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.9527777777777777\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.9027777777777778\n", + "\n", + "Learning rate = 0.1\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.8583333333333333\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.8722222222222222\n", + "\n", + "Learning rate = 0.1\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.9055555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.8805555555555555\n", + "\n", + "Learning rate = 0.1\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.8722222222222222\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.8666666666666667\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.08611111111111111\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.10555555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.10555555555555556\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.17777777777777778\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.08333333333333333\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.08888888888888889\n", + "\n", + "Learning rate = 1.0\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.09444444444444444\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.17222222222222222\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.11666666666666667\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.10555555555555556\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.1388888888888889\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.11388888888888889\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.10555555555555556\n", + "\n", + "Learning rate = 10.0\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.09444444444444444\n", + "\n" + ] + } + ], + "source": [ + "from sklearn.neural_network import MLPClassifier\n", + "# store models for later use\n", + "DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + "\n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n", + " alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n", + " dnn.fit(X_train, Y_train)\n", + " \n", + " DNN_scikit[i][j] = dnn\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Accuracy score on test set: \", dnn.score(X_test, Y_test))\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "id": "cfbf38a6", + "metadata": { + "editable": true + }, + "source": [ + "## Visualization" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "920c188a", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "data": { + "image/png": "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4sWL68SJE5mWnzhxQuXLl89ym61bt2rbtm169NFH1ahRI4/3lixZoi+++EIbNmxQ7dq1FRkZmeVzSdavX6+IiAjlzZtXkjsROjc6I0l79uzRyZMnM0qcnE6nx/bn7t+4mLi4OPXv319VqlTR999/r4oVK8pms+nXX3/VggULMtaLjIz0mFb5nF9//VVVq1ZVsWLF1LlzZ40cOVILFizQ+vXr1aRJk2xL5QAAORc3oQPIdU6dOqW9e/eqR48eqlWrlhwO97WYpUuXSrr4aIY/NGzYUEuXLlVycnLGsm3btl30YYbTp09XcHCw7rnnHl133XUef/r16ye73a6pU6dKct/vceDAAe3YsSNj+5SUFD322GP65ptvVL9+fUnSokWLPD5jzJgxeuWVVyRJERERiomJ8Xh/3bp1/3pse/bs0enTp3X33XercuXKstncPzsXxrpBgwb67bfflJKSkrHtjh07dP/992vTpk2S3PfO3HDDDfr+++/122+/MfoBAFcoRkAA5DqFChVSyZIl9dVXX6l48eLKmzevli1bpokTJ0q6+P0c/vDggw9q3rx56t+/v+677z7Fxsbq3XfflWEYWd7fkJKSoh9++EGtWrVSZGRkpveLFi2qZs2aad68eRo6dKi6deumSZMm6aGHHtKgQYNUsGBBffXVV0pKStJdd92lMmXKqHPnzho9erSSkpJUvXp1LVu2TAsXLsy4D6RNmzZasmSJXn31VbVv315r1671aoas8uXLKyIiQh9//LEcDoccDocWLFig6dOnSzof64cfflh33HGHBgwYoL59+yolJUXvvvuuqlevrpYtW2bsr0ePHrrjjjsUERGhjh07Xka0AQCBxggIgFxp7NixKlasmJ599lk9/vjj+vPPP/XRRx+pQoUKWrNmjaVtKVu2rMaPH6/k5GQNHDhQY8aM0YABA1SkSJGMmaz+adGiRTp9+rRuvPHGbPd56623KikpSbNmzVJERIQmT56sunXr6tVXX9WgQYOUnJysSZMmZdwcP2rUKN19992aNGmSHnjgAS1btkz/+9//MmYO6969uwYMGKB58+ZpwIABWrdund59991/PbbIyEiNHTtWpmlq0KBBGjJkiA4fPqzJkycrT548GbGuVq2aJk2aJJfLpSeeeEIjRoxQnTp1NG7cOI8nytepU0cFChRQly5dFBoaeklxBgDk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SjwrFSxuqH57u1rc6pAj6HxM1/+SpiVT0nTyiKkCRQ016eJQs5sD811KcmX9VHcrbP09VT9/lazjB13KW8hQoxuD1aybe0arvRvT9PnQBN36eKjqdnB/B5ISTC2emKStv6cp8aypAsVtqt02SE1vDc6Ir2maWjEnRWvmp+pUjEuRBQ1VrOtQ+74hypMvMAle6aATAflcyT097uxJdsUclAoUktp2dalzD/eV4O0bDL35tEP9nkpT847un8W0NGnOJJt+X2RT/FmpTEVTXXu7VKOB+/2t642MG9SzcnMfp265+19mcfCDs66ccyfx1dgPOwNfPOJh43KXfpzk1NFDUr5CUvObbGrT3X0RYtcGlz58xqleg+1q9I8YL5js0urFLiWclUpWMNSxt01V6+ec47qhfBYPiskhBq3vFegmZGnzU0cv+n52CciCBQs0cOBAbdiwQaGh5/uOQYMGKSUlRR999JHH+t9//72GDx+un3/+OSPZOHPmjNq0aaNBgwapb9++XrU3xyQgR44c0datW9WmTRu/fUYgE5DcIKclIFejQCYguUEgE5DcIpAJSG6RkxKQq1FOS0CuRiQgl+7dulMua7uNGzfqtttu08KFC1WmTJmM5b169VLVqlX18ssve6w/fPhwbdmyRd98843H8u7du6tWrVqZ1s9OjvlXVKxYMb8mHwAAAADOq1q1qiIiIrRq1aqMZbGxsdq6dasaNGiQaf2oqCjt27dPycnJGcsSExN18ODBbJ8bkpUck4AAAAAAOZnLtOXIP5crODhYffr00ejRo7V48WJt375dTzzxhIoXL64OHTrI6XTq2LFjSkpyP6XylltukSQ9/vjj2r59e8b6wcHB6tatm9efSwICAAAA5FIDBw5Ujx499MILL6hXr16y2+0aP368goODFR0drebNm2vePPfUrEWLFtXXX38t0zTVt29f3XvvvQoKCtKUKVOUN29erz8zx9wDYgXuAfEv7gHxP+4B8S/uAfE/7gHxP+4B8S/uAfG/nHwPyGPrege6CVl6v95XgW7CJeGMEQAAAPCCUzlnRrYrGWk8AAAAAMuQgAAAAACwDCVYAAAAgBdcJiVYvsAICAAAAADLkIAAAAAAsAwlWAAAAIAX/stD/3AeUQQAAABgGRIQAAAAAJahBAsAAADwgosHEfoEIyAAAAAALEMCAgAAAMAylGAB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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/week43_47_0.png" + } + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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P6lGjRrKly9fthe6r1u3TrGxsapataok65qTP0tMTPzbdq5evVqPP/64+vfvrzvvvFMlS5aUJL366qsZF7mfb3/mNp4+fVqbN29WgwYNFBMTo169emnmzJnasGGDvv/+e916661/+/4AgLyFEiwAyKRZs2bauXOnatasqbp166pu3bqqU6eOxo4dq/nz50uSHnroId13332SrISlS5cuGjJkiDwej44dOyZJcjj+uoudMWOGGjRooE6dOql58+Y+//r27av4+HjNnTtXknU9x5IlS3xmx9q+fbvuvvtubdy4UU2aNNH+/fu1ffv2jOdTU1N1//3364svvpBkjUAcOXLEpw1r167923isW7dOXq9XDzzwQEby4fF4MsrRvF6vKlWqpEKFCmnhwoU+23799dcaNGiQUlJSJElNmzZVhQoV9Nprr+nUqVPq0aPH374/ACBvIQEBgEyGDBmiffv2afDgwVqwYIGWLFmi+++/X99++23GNRYtWrTQ/Pnz9corr2jFihX6/vvv9c4776hChQoZ6+TPn19btmzRL7/8ouTkZJ/32LBhg3bs2HHRcq0OHTqoQIECGRd5DxkyRKdOndKgQYO0aNEifffdd3rooYdUu3ZttW3bVj179lTZsmX1n//8R7Nnz9aSJUv0wAMPKDk5OWOUoX379vr22281efJkrVixQo899pj27t37t/GoV6+eJGn48OH6+eefNW/ePN1xxx3atm2bJGsUxel06v7779f333+v5557TsuWLdOkSZP09ttvq2/fvhmla5LUq1cv/fLLL2rZsqVKlSp1Kb8aAEAeQAICAJnUqFFDkyZNkmEYeuyxx/TAAw/o+PHjev/993X11VdLkvr06aNnnnlGixcv1j333KNnn31WlStX1pgxYxQWFiZJGjhwoP744w/deeed2rRpk897TJ8+XU6n02emqz8LDw9Xly5d9Ouvv2rr1q2qVauWJkyYIK/Xq4cffljDhw9XgwYN9Mknnyg8PFyxsbGaOHGiGjZsqBdeeEEPPvigUlJSNGHChIwLyp988kldddVVeu211/TAAw8oKirKrxseNm/eXM8++6zWrVunQYMG6aWXXlLp0qUz7h5/vgyrX79+evnll7V69WoNHjxYY8aM0cCBA/XEE0/4vF779u0liYvPASBEGaZpmsFuBAAgdHzyySf69NNPtWTJEoWH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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/week43_47_1.png" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "# optional\n", + "# visual representation of grid search\n", + "# uses seaborn heatmap, could probably do this in matplotlib\n", + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "\n", + "train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " dnn = DNN_scikit[i][j]\n", + " \n", + " train_pred = dnn.predict(X_train) \n", + " test_pred = dnn.predict(X_test)\n", + "\n", + " train_accuracy[i][j] = accuracy_score(Y_train, train_pred)\n", + " test_accuracy[i][j] = accuracy_score(Y_test, test_pred)\n", + "\n", + " \n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Training Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "97323847", + "metadata": { + "editable": true + }, + "source": [ + "## Building neural networks in Tensorflow and Keras\n", + "\n", + "Now we want to build on the experience gained from our neural network implementation in NumPy and scikit-learn\n", + "and use it to construct a neural network in Tensorflow. Once we have constructed a neural network in NumPy\n", + "and Tensorflow, building one in Keras is really quite trivial, though the performance may suffer. \n", + "\n", + "In our previous example we used only one hidden layer, and in this we will use two. From this it should be quite\n", + "clear how to build one using an arbitrary number of hidden layers, using data structures such as Python lists or\n", + "NumPy arrays." + ] + }, + { + "cell_type": "markdown", + "id": "c2a7c615", + "metadata": { + "editable": true + }, + "source": [ + "## Tensorflow\n", + "\n", + "Tensorflow is an open source library machine learning library\n", + "developed by the Google Brain team for internal use. It was released\n", + "under the Apache 2.0 open source license in November 9, 2015.\n", + "\n", + "Tensorflow is a computational framework that allows you to construct\n", + "machine learning models at different levels of abstraction, from\n", + "high-level, object-oriented APIs like Keras, down to the C++ kernels\n", + "that Tensorflow is built upon. The higher levels of abstraction are\n", + "simpler to use, but less flexible, and our choice of implementation\n", + "should reflect the problems we are trying to solve.\n", + "\n", + "[Tensorflow uses](https://www.tensorflow.org/guide/graphs) so-called graphs to represent your computation\n", + "in terms of the dependencies between individual operations, such that you first build a Tensorflow *graph*\n", + "to represent your model, and then create a Tensorflow *session* to run the graph.\n", + "\n", + "In this guide we will analyze the same data as we did in our NumPy and\n", + "scikit-learn tutorial, gathered from the MNIST database of images. We\n", + "will give an introduction to the lower level Python Application\n", + "Program Interfaces (APIs), and see how we use them to build our graph.\n", + "Then we will build (effectively) the same graph in Keras, to see just\n", + "how simple solving a machine learning problem can be.\n", + "\n", + "To install tensorflow on Unix/Linux systems, use pip as" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "bba703cc", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (2357089093.py, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m Input \u001b[0;32mIn [14]\u001b[0;36m\u001b[0m\n\u001b[0;31m pip3 install tensorflow\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "pip3 install tensorflow" + ] + }, + { + "cell_type": "markdown", + "id": "a4068463", + "metadata": { + "editable": true + }, + "source": [ + "and/or if you use **anaconda**, just write (or install from the graphical user interface)\n", + "(current release of CPU-only TensorFlow)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "d6bd0dd0", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "conda create -n tf tensorflow\n", + "conda activate tf" + ] + }, + { + "cell_type": "markdown", + "id": "acc51b3f", + "metadata": { + "editable": true + }, + "source": [ + "To install the current release of GPU TensorFlow" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "a0672dbc", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "conda create -n tf-gpu tensorflow-gpu\n", + "conda activate tf-gpu" + ] + }, + { + "cell_type": "markdown", + "id": "63f07738", + "metadata": { + "editable": true + }, + "source": [ + "## Using Keras\n", + "\n", + "Keras is a high level [neural network](https://en.wikipedia.org/wiki/Application_programming_interface)\n", + "that supports Tensorflow, CTNK and Theano as backends. \n", + "If you have Anaconda installed you may run the following command" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "9a9dc1f6", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "conda install keras" + ] + }, + { + "cell_type": "markdown", + "id": "69b5c338", + "metadata": { + "editable": true + }, + "source": [ + "You can look up the [instructions here](https://keras.io/) for more information.\n", + "\n", + "We will to a large extent use **keras** in our examples.." + ] + }, + { + "cell_type": "markdown", + "id": "4a78e3e1", + "metadata": { + "editable": true + }, + "source": [ + "## Collect and pre-process data\n", + "\n", + "Let us look again at the MINST data set." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "08e4f938", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import tensorflow as tf\n", + "from sklearn import datasets\n", + "\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# display images in notebook\n", + "%matplotlib inline\n", + "plt.rcParams['figure.figsize'] = (12,12)\n", + "\n", + "\n", + "# download MNIST dataset\n", + "digits = datasets.load_digits()\n", + "\n", + "# define inputs and labels\n", + "inputs = digits.images\n", + "labels = digits.target\n", + "\n", + "print(\"inputs = (n_inputs, pixel_width, pixel_height) = \" + str(inputs.shape))\n", + "print(\"labels = (n_inputs) = \" + str(labels.shape))\n", + "\n", + "\n", + "# flatten the image\n", + "# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64\n", + "n_inputs = len(inputs)\n", + "inputs = inputs.reshape(n_inputs, -1)\n", + "print(\"X = (n_inputs, n_features) = \" + str(inputs.shape))\n", + "\n", + "\n", + "# choose some random images to display\n", + "indices = np.arange(n_inputs)\n", + "random_indices = np.random.choice(indices, size=5)\n", + "\n", + "for i, image in enumerate(digits.images[random_indices]):\n", + " plt.subplot(1, 5, i+1)\n", + " plt.axis('off')\n", + " plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')\n", + " plt.title(\"Label: %d\" % digits.target[random_indices[i]])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "07f3f725", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "from tensorflow.keras.layers import Input\n", + "from tensorflow.keras.models import Sequential #This allows appending layers to existing models\n", + "from tensorflow.keras.layers import Dense #This allows defining the characteristics of a particular layer\n", + "from tensorflow.keras import optimizers #This allows using whichever optimiser we want (sgd,adam,RMSprop)\n", + "from tensorflow.keras import regularizers #This allows using whichever regularizer we want (l1,l2,l1_l2)\n", + "from tensorflow.keras.utils import to_categorical #This allows using categorical cross entropy as the cost function\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "# one-hot representation of labels\n", + "labels = to_categorical(labels)\n", + "\n", + "# split into train and test data\n", + "train_size = 0.8\n", + "test_size = 1 - train_size\n", + "X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,\n", + " test_size=test_size)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "646f3c64", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "\n", + "epochs = 100\n", + "batch_size = 100\n", + "n_neurons_layer1 = 100\n", + "n_neurons_layer2 = 50\n", + "n_categories = 10\n", + "eta_vals = np.logspace(-5, 1, 7)\n", + "lmbd_vals = np.logspace(-5, 1, 7)\n", + "def create_neural_network_keras(n_neurons_layer1, n_neurons_layer2, n_categories, eta, lmbd):\n", + " model = Sequential()\n", + " model.add(Dense(n_neurons_layer1, activation='sigmoid', kernel_regularizer=regularizers.l2(lmbd)))\n", + " model.add(Dense(n_neurons_layer2, activation='sigmoid', kernel_regularizer=regularizers.l2(lmbd)))\n", + " model.add(Dense(n_categories, activation='softmax'))\n", + " \n", + " sgd = optimizers.SGD(lr=eta)\n", + " model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])\n", + " \n", + " return model" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "02e48d62", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "DNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + " \n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " DNN = create_neural_network_keras(n_neurons_layer1, n_neurons_layer2, n_categories,\n", + " eta=eta, lmbd=lmbd)\n", + " DNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0)\n", + " scores = DNN.evaluate(X_test, Y_test)\n", + " \n", + " DNN_keras[i][j] = DNN\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Test accuracy: %.3f\" % scores[1])\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "b870683f", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# optional\n", + "# visual representation of grid search\n", + "# uses seaborn heatmap, could probably do this in matplotlib\n", + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "\n", + "train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " DNN = DNN_keras[i][j]\n", + "\n", + " train_accuracy[i][j] = DNN.evaluate(X_train, Y_train)[1]\n", + " test_accuracy[i][j] = DNN.evaluate(X_test, Y_test)[1]\n", + "\n", + " \n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Training Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "854ae0f4", + "metadata": { + "editable": true + }, + "source": [ + "## The Breast Cancer Data, now with Keras" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "4ccfdbf2", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "\n", + "import tensorflow as tf\n", + "from tensorflow.keras.layers import Input\n", + "from tensorflow.keras.models import Sequential #This allows appending layers to existing models\n", + "from tensorflow.keras.layers import Dense #This allows defining the characteristics of a particular layer\n", + "from tensorflow.keras import optimizers #This allows using whichever optimiser we want (sgd,adam,RMSprop)\n", + "from tensorflow.keras import regularizers #This allows using whichever regularizer we want (l1,l2,l1_l2)\n", + "from tensorflow.keras.utils import to_categorical #This allows using categorical cross entropy as the cost function\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from sklearn.model_selection import train_test_split as splitter\n", + "from sklearn.datasets import load_breast_cancer\n", + "import pickle\n", + "import os \n", + "\n", + "\n", + "\"\"\"Load breast cancer dataset\"\"\"\n", + "\n", + "np.random.seed(0) #create same seed for random number every time\n", + "\n", + "cancer=load_breast_cancer() #Download breast cancer dataset\n", + "\n", + "inputs=cancer.data #Feature matrix of 569 rows (samples) and 30 columns (parameters)\n", + "outputs=cancer.target #Label array of 569 rows (0 for benign and 1 for malignant)\n", + "labels=cancer.feature_names[0:30]\n", + "\n", + "print('The content of the breast cancer dataset is:') #Print information about the datasets\n", + "print(labels)\n", + "print('-------------------------')\n", + "print(\"inputs = \" + str(inputs.shape))\n", + "print(\"outputs = \" + str(outputs.shape))\n", + "print(\"labels = \"+ str(labels.shape))\n", + "\n", + "x=inputs #Reassign the Feature and Label matrices to other variables\n", + "y=outputs\n", + "\n", + "#%% \n", + "\n", + "# Visualisation of dataset (for correlation analysis)\n", + "\n", + "plt.figure()\n", + "plt.scatter(x[:,0],x[:,2],s=40,c=y,cmap=plt.cm.Spectral)\n", + "plt.xlabel('Mean radius',fontweight='bold')\n", + "plt.ylabel('Mean perimeter',fontweight='bold')\n", + "plt.show()\n", + "\n", + "plt.figure()\n", + "plt.scatter(x[:,5],x[:,6],s=40,c=y, cmap=plt.cm.Spectral)\n", + "plt.xlabel('Mean compactness',fontweight='bold')\n", + "plt.ylabel('Mean concavity',fontweight='bold')\n", + "plt.show()\n", + "\n", + "\n", + "plt.figure()\n", + "plt.scatter(x[:,0],x[:,1],s=40,c=y,cmap=plt.cm.Spectral)\n", + "plt.xlabel('Mean radius',fontweight='bold')\n", + "plt.ylabel('Mean texture',fontweight='bold')\n", + "plt.show()\n", + "\n", + "plt.figure()\n", + "plt.scatter(x[:,2],x[:,1],s=40,c=y,cmap=plt.cm.Spectral)\n", + "plt.xlabel('Mean perimeter',fontweight='bold')\n", + "plt.ylabel('Mean compactness',fontweight='bold')\n", + "plt.show()\n", + "\n", + "\n", + "# Generate training and testing datasets\n", + "\n", + "#Select features relevant to classification (texture,perimeter,compactness and symmetery) \n", + "#and add to input matrix\n", + "\n", + "temp1=np.reshape(x[:,1],(len(x[:,1]),1))\n", + "temp2=np.reshape(x[:,2],(len(x[:,2]),1))\n", + "X=np.hstack((temp1,temp2)) \n", + "temp=np.reshape(x[:,5],(len(x[:,5]),1))\n", + "X=np.hstack((X,temp)) \n", + "temp=np.reshape(x[:,8],(len(x[:,8]),1))\n", + "X=np.hstack((X,temp)) \n", + "\n", + "X_train,X_test,y_train,y_test=splitter(X,y,test_size=0.1) #Split datasets into training and testing\n", + "\n", + "y_train=to_categorical(y_train) #Convert labels to categorical when using categorical cross entropy\n", + "y_test=to_categorical(y_test)\n", + "\n", + "del temp1,temp2,temp\n", + "\n", + "# %%\n", + "\n", + "# Define tunable parameters\"\n", + "\n", + "eta=np.logspace(-3,-1,3) #Define vector of learning rates (parameter to SGD optimiser)\n", + "lamda=0.01 #Define hyperparameter\n", + "n_layers=2 #Define number of hidden layers in the model\n", + "n_neuron=np.logspace(0,3,4,dtype=int) #Define number of neurons per layer\n", + "epochs=100 #Number of reiterations over the input data\n", + "batch_size=100 #Number of samples per gradient update\n", + "\n", + "# %%\n", + "\n", + "\"\"\"Define function to return Deep Neural Network model\"\"\"\n", + "\n", + "def NN_model(inputsize,n_layers,n_neuron,eta,lamda):\n", + " model=Sequential() \n", + " for i in range(n_layers): #Run loop to add hidden layers to the model\n", + " if (i==0): #First layer requires input dimensions\n", + " model.add(Dense(n_neuron,activation='relu',kernel_regularizer=regularizers.l2(lamda),input_dim=inputsize))\n", + " else: #Subsequent layers are capable of automatic shape inferencing\n", + " model.add(Dense(n_neuron,activation='relu',kernel_regularizer=regularizers.l2(lamda)))\n", + " model.add(Dense(2,activation='softmax')) #2 outputs - ordered and disordered (softmax for prob)\n", + " sgd=optimizers.SGD(lr=eta)\n", + " model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])\n", + " return model\n", + "\n", + " \n", + "Train_accuracy=np.zeros((len(n_neuron),len(eta))) #Define matrices to store accuracy scores as a function\n", + "Test_accuracy=np.zeros((len(n_neuron),len(eta))) #of learning rate and number of hidden neurons for \n", + "\n", + "for i in range(len(n_neuron)): #run loops over hidden neurons and learning rates to calculate \n", + " for j in range(len(eta)): #accuracy scores \n", + " DNN_model=NN_model(X_train.shape[1],n_layers,n_neuron[i],eta[j],lamda)\n", + " DNN_model.fit(X_train,y_train,epochs=epochs,batch_size=batch_size,verbose=1)\n", + " Train_accuracy[i,j]=DNN_model.evaluate(X_train,y_train)[1]\n", + " Test_accuracy[i,j]=DNN_model.evaluate(X_test,y_test)[1]\n", + " \n", + "\n", + "def plot_data(x,y,data,title=None):\n", + "\n", + " # plot results\n", + " fontsize=16\n", + "\n", + "\n", + " fig = plt.figure()\n", + " ax = fig.add_subplot(111)\n", + " cax = ax.matshow(data, interpolation='nearest', vmin=0, vmax=1)\n", + " \n", + " cbar=fig.colorbar(cax)\n", + " cbar.ax.set_ylabel('accuracy (%)',rotation=90,fontsize=fontsize)\n", + " cbar.set_ticks([0,.2,.4,0.6,0.8,1.0])\n", + " cbar.set_ticklabels(['0%','20%','40%','60%','80%','100%'])\n", + "\n", + " # put text on matrix elements\n", + " for i, x_val in enumerate(np.arange(len(x))):\n", + " for j, y_val in enumerate(np.arange(len(y))):\n", + " c = \"${0:.1f}\\\\%$\".format( 100*data[j,i]) \n", + " ax.text(x_val, y_val, c, va='center', ha='center')\n", + "\n", + " # convert axis vaues to to string labels\n", + " x=[str(i) for i in x]\n", + " y=[str(i) for i in y]\n", + "\n", + "\n", + " ax.set_xticklabels(['']+x)\n", + " ax.set_yticklabels(['']+y)\n", + "\n", + " ax.set_xlabel('$\\\\mathrm{learning\\\\ rate}$',fontsize=fontsize)\n", + " ax.set_ylabel('$\\\\mathrm{hidden\\\\ neurons}$',fontsize=fontsize)\n", + " if title is not None:\n", + " ax.set_title(title)\n", + "\n", + " plt.tight_layout()\n", + "\n", + " plt.show()\n", + " \n", + "plot_data(eta,n_neuron,Train_accuracy, 'training')\n", + "plot_data(eta,n_neuron,Test_accuracy, 'testing')" + ] + }, + { + "cell_type": "markdown", + "id": "9b5849c3", + "metadata": { + "editable": true + }, + "source": [ + "## Fine-tuning neural network hyperparameters\n", + "\n", + "The flexibility of neural networks is also one of their main\n", + "drawbacks: there are many hyperparameters to tweak. Not only can you\n", + "use any imaginable network topology (how neurons/nodes are interconnected),\n", + "but even in a simple FFNN you can change the number of layers, the\n", + "number of neurons per layer, the type of activation function to use in\n", + "each layer, the weight initialization logic, the stochastic gradient optmized and much more. How do you\n", + "know what combination of hyperparameters is the best for your task?\n", + "\n", + "* You can use grid search with cross-validation to find the right hyperparameters.\n", + "\n", + "However,since there are many hyperparameters to tune, and since\n", + "training a neural network on a large dataset takes a lot of time, you\n", + "will only be able to explore a tiny part of the hyperparameter space.\n", + "\n", + "* You can use randomized search.\n", + "\n", + "* Or use tools like [Oscar](http://oscar.calldesk.ai/), which implements more complex algorithms to help you find a good set of hyperparameters quickly." + ] + }, + { + "cell_type": "markdown", + "id": "d5e48e8e", + "metadata": { + "editable": true + }, + "source": [ + "## Hidden layers\n", + "\n", + "For many problems you can start with just one or two hidden layers and it will work just fine.\n", + "For the MNIST data set you ca easily get a high accuracy using just one hidden layer with a\n", + "few hundred neurons.\n", + "You can reach for this data set above 98% accuracy using two hidden layers with the same total amount of\n", + "neurons, in roughly the same amount of training time. \n", + "\n", + "For more complex problems, you can gradually\n", + "ramp up the number of hidden layers, until you start overfitting the training set. Very complex tasks, such\n", + "as large image classification or speech recognition, typically require networks with dozens of layers\n", + "and they need a huge amount\n", + "of training data. However, you will rarely have to train such networks from scratch: it is much more\n", + "common to reuse parts of a pretrained state-of-the-art network that performs a similar task." + ] + }, + { + "cell_type": "markdown", + "id": "58942375", + "metadata": { + "editable": true + }, + "source": [ + "## Which activation function should I use?\n", + "\n", + "The Back propagation algorithm we derived above works by going from\n", + "the output layer to the input layer, propagating the error gradient on\n", + "the way. Once the algorithm has computed the gradient of the cost\n", + "function with regards to each parameter in the network, it uses these\n", + "gradients to update each parameter with a Gradient Descent (GD) step.\n", + "\n", + "Unfortunately for us, the gradients often get smaller and smaller as the\n", + "algorithm progresses down to the first hidden layers. As a result, the\n", + "GD update leaves the lower layer connection weights\n", + "virtually unchanged, and training never converges to a good\n", + "solution. This is known in the literature as \n", + "**the vanishing gradients problem**. \n", + "\n", + "In other cases, the opposite can happen, namely the the gradients can grow bigger and\n", + "bigger. The result is that many of the layers get large updates of the \n", + "weights the\n", + "algorithm diverges. This is the **exploding gradients problem**, which is\n", + "mostly encountered in recurrent neural networks. More generally, deep\n", + "neural networks suffer from unstable gradients, different layers may\n", + "learn at widely different speeds" + ] + }, + { + "cell_type": "markdown", + "id": "04de1245", + "metadata": { + "editable": true + }, + "source": [ + "## Is the Logistic activation function (Sigmoid) our choice?\n", + "\n", + "Although this unfortunate behavior has been empirically observed for\n", + "quite a while (it was one of the reasons why deep neural networks were\n", + "mostly abandoned for a long time), it is only around 2010 that\n", + "significant progress was made in understanding it.\n", + "\n", + "A paper titled [Understanding the Difficulty of Training Deep\n", + "Feedforward Neural Networks by Xavier Glorot and Yoshua Bengio](http://proceedings.mlr.press/v9/glorot10a.html) found that\n", + "the problems with the popular logistic\n", + "sigmoid activation function and the weight initialization technique\n", + "that was most popular at the time, namely random initialization using\n", + "a normal distribution with a mean of 0 and a standard deviation of\n", + "1. \n", + "\n", + "They showed that with this activation function and this\n", + "initialization scheme, the variance of the outputs of each layer is\n", + "much greater than the variance of its inputs. Going forward in the\n", + "network, the variance keeps increasing after each layer until the\n", + "activation function saturates at the top layers. This is actually made\n", + "worse by the fact that the logistic function has a mean of 0.5, not 0\n", + "(the hyperbolic tangent function has a mean of 0 and behaves slightly\n", + "better than the logistic function in deep networks)." + ] + }, + { + "cell_type": "markdown", + "id": "a00515d3", + "metadata": { + "editable": true + }, + "source": [ + "## The derivative of the Logistic funtion\n", + "\n", + "Looking at the logistic activation function, when inputs become large\n", + "(negative or positive), the function saturates at 0 or 1, with a\n", + "derivative extremely close to 0. Thus when backpropagation kicks in,\n", + "it has virtually no gradient to propagate back through the network,\n", + "and what little gradient exists keeps getting diluted as\n", + "backpropagation progresses down through the top layers, so there is\n", + "really nothing left for the lower layers.\n", + "\n", + "In their paper, Glorot and Bengio propose a way to significantly\n", + "alleviate this problem. We need the signal to flow properly in both\n", + "directions: in the forward direction when making predictions, and in\n", + "the reverse direction when backpropagating gradients. We don’t want\n", + "the signal to die out, nor do we want it to explode and saturate. For\n", + "the signal to flow properly, the authors argue that we need the\n", + "variance of the outputs of each layer to be equal to the variance of\n", + "its inputs, and we also need the gradients to have equal variance\n", + "before and after flowing through a layer in the reverse direction.\n", + "\n", + "One of the insights in the 2010 paper by Glorot and Bengio was that\n", + "the vanishing/exploding gradients problems were in part due to a poor\n", + "choice of activation function. Until then most people had assumed that\n", + "if Nature had chosen to use roughly sigmoid activation functions in\n", + "biological neurons, they must be an excellent choice. But it turns out\n", + "that other activation functions behave much better in deep neural\n", + "networks, in particular the ReLU activation function, mostly because\n", + "it does not saturate for positive values (and also because it is quite\n", + "fast to compute)." + ] + }, + { + "cell_type": "markdown", + "id": "a31e0434", + "metadata": { + "editable": true + }, + "source": [ + "## The RELU function family\n", + "\n", + "The ReLU activation function suffers from a problem known as the dying\n", + "ReLUs: during training, some neurons effectively die, meaning they\n", + "stop outputting anything other than 0.\n", + "\n", + "In some cases, you may find that half of your network’s neurons are\n", + "dead, especially if you used a large learning rate. During training,\n", + "if a neuron’s weights get updated such that the weighted sum of the\n", + "neuron’s inputs is negative, it will start outputting 0. When this\n", + "happen, the neuron is unlikely to come back to life since the gradient\n", + "of the ReLU function is 0 when its input is negative.\n", + "\n", + "To solve this problem, nowadays practitioners use a variant of the ReLU\n", + "function, such as the leaky ReLU discussed above or the so-called\n", + "exponential linear unit (ELU) function" + ] + }, + { + "cell_type": "markdown", + "id": "200106bb", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "ELU(z) = \\left\\{\\begin{array}{cc} \\alpha\\left( \\exp{(z)}-1\\right) & z < 0,\\\\ z & z \\ge 0.\\end{array}\\right.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ec25493e", + "metadata": { + "editable": true + }, + "source": [ + "## Which activation function should we use?\n", + "\n", + "In general it seems that the ELU activation function is better than\n", + "the leaky ReLU function (and its variants), which is better than\n", + "ReLU. ReLU performs better than $\\tanh$ which in turn performs better\n", + "than the logistic function. \n", + "\n", + "If runtime\n", + "performance is an issue, then you may opt for the leaky ReLU function over the \n", + "ELU function If you don’t\n", + "want to tweak yet another hyperparameter, you may just use the default\n", + "$\\alpha$ of $0.01$ for the leaky ReLU, and $1$ for ELU. If you have\n", + "spare time and computing power, you can use cross-validation or\n", + "bootstrap to evaluate other activation functions." + ] + }, + { + "cell_type": "markdown", + "id": "3c158df0", + "metadata": { + "editable": true + }, + "source": [ + "## More on activation functions, output layers\n", + "\n", + "In most cases you can use the ReLU activation function in the hidden layers (or one of its variants).\n", + "\n", + "It is a bit faster to compute than other activation functions, and the gradient descent optimization does in general not get stuck.\n", + "\n", + "**For the output layer:**\n", + "\n", + "* For classification the softmax activation function is generally a good choice for classification tasks (when the classes are mutually exclusive).\n", + "\n", + "* For regression tasks, you can simply use no activation function at all." + ] + }, + { + "cell_type": "markdown", + "id": "f3320b0b", + "metadata": { + "editable": true + }, + "source": [ + "## Batch Normalization\n", + "\n", + "Batch Normalization\n", + "aims to address the vanishing/exploding gradients problems, and more generally the problem that the\n", + "distribution of each layer’s inputs changes during training, as the parameters of the previous layers change.\n", + "\n", + "The technique consists of adding an operation in the model just before the activation function of each\n", + "layer, simply zero-centering and normalizing the inputs, then scaling and shifting the result using two new\n", + "parameters per layer (one for scaling, the other for shifting). In other words, this operation lets the model\n", + "learn the optimal scale and mean of the inputs for each layer.\n", + "In order to zero-center and normalize the inputs, the algorithm needs to estimate the inputs’ mean and\n", + "standard deviation. It does so by evaluating the mean and standard deviation of the inputs over the current\n", + "mini-batch, from this the name batch normalization." + ] + }, + { + "cell_type": "markdown", + "id": "05cf40b3", + "metadata": { + "editable": true + }, + "source": [ + "## Dropout\n", + "\n", + "It is a fairly simple algorithm: at every training step, every neuron (including the input neurons but\n", + "excluding the output neurons) has a probability $p$ of being temporarily dropped out, meaning it will be\n", + "entirely ignored during this training step, but it may be active during the next step.\n", + "\n", + "The\n", + "hyperparameter $p$ is called the dropout rate, and it is typically set to 50%. After training, the neurons are not dropped anymore.\n", + " It is viewed as one of the most popular regularization techniques." + ] + }, + { + "cell_type": "markdown", + "id": "0d29278d", + "metadata": { + "editable": true + }, + "source": [ + "## Gradient Clipping\n", + "\n", + "A popular technique to lessen the exploding gradients problem is to simply clip the gradients during\n", + "backpropagation so that they never exceed some threshold (this is mostly useful for recurrent neural\n", + "networks).\n", + "\n", + "This technique is called Gradient Clipping.\n", + "\n", + "In general however, Batch\n", + "Normalization is preferred." + ] + }, + { + "cell_type": "markdown", + "id": "55e322d2", + "metadata": { + "editable": true + }, + "source": [ + "## A very nice website on Neural Networks\n", + "\n", + "You may find this [website](https://playground.tensorflow.org/#activation=tanh&batchSize=10&dataset=circle®Dataset=reg-plane&learningRate=0.03®ularizationRate=0&noise=0&networkShape=4,2&seed=0.29243&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false) very useful." + ] + }, + { + "cell_type": "markdown", + "id": "c5f566a8", + "metadata": { + "editable": true + }, + "source": [ + "## A top-down perspective on Neural networks\n", + "\n", + "The first thing we would like to do is divide the data into two or three\n", + "parts. A training set, a validation or dev (development) set, and a\n", + "test set. The test set is the data on which we want to make\n", + "predictions. The dev set is a subset of the training data we use to\n", + "check how well we are doing out-of-sample, after training the model on\n", + "the training dataset. We use the validation error as a proxy for the\n", + "test error in order to make tweaks to our model. It is crucial that we\n", + "do not use any of the test data to train the algorithm. This is a\n", + "cardinal sin in ML. Then:\n", + "\n", + "* Estimate optimal error rate\n", + "\n", + "* Minimize underfitting (bias) on training data set.\n", + "\n", + "* Make sure you are not overfitting.\n", + "\n", + "If the validation and test sets are drawn from the same distributions,\n", + "then a good performance on the validation set should lead to similarly\n", + "good performance on the test set. \n", + "\n", + "However, sometimes\n", + "the training data and test data differ in subtle ways because, for\n", + "example, they are collected using slightly different methods, or\n", + "because it is cheaper to collect data in one way versus another. In\n", + "this case, there can be a mismatch between the training and test\n", + "data. This can lead to the neural network overfitting these small\n", + "differences between the test and training sets, and a poor performance\n", + "on the test set despite having a good performance on the validation\n", + "set. To rectify this, Andrew Ng suggests making two validation or dev\n", + "sets, one constructed from the training data and one constructed from\n", + "the test data. The difference between the performance of the algorithm\n", + "on these two validation sets quantifies the train-test mismatch. This\n", + "can serve as another important diagnostic when using DNNs for\n", + "supervised learning." + ] + }, + { + "cell_type": "markdown", + "id": "baa5a3ba", + "metadata": { + "editable": true + }, + "source": [ + "## Limitations of supervised learning with deep networks\n", + "\n", + "Like all statistical methods, supervised learning using neural\n", + "networks has important limitations. This is especially important when\n", + "one seeks to apply these methods, especially to physics problems. Like\n", + "all tools, DNNs are not a universal solution. Often, the same or\n", + "better performance on a task can be achieved by using a few\n", + "hand-engineered features (or even a collection of random\n", + "features). \n", + "\n", + "Here we list some of the important limitations of supervised neural network based models. \n", + "\n", + "* **Need labeled data**. All supervised learning methods, DNNs for supervised learning require labeled data. Often, labeled data is harder to acquire than unlabeled data (e.g. one must pay for human experts to label images).\n", + "\n", + "* **Supervised neural networks are extremely data intensive.** DNNs are data hungry. They perform best when data is plentiful. This is doubly so for supervised methods where the data must also be labeled. The utility of DNNs is extremely limited if data is hard to acquire or the datasets are small (hundreds to a few thousand samples). In this case, the performance of other methods that utilize hand-engineered features can exceed that of DNNs.\n", + "\n", + "* **Homogeneous data.** Almost all DNNs deal with homogeneous data of one type. It is very hard to design architectures that mix and match data types (i.e. some continuous variables, some discrete variables, some time series). In applications beyond images, video, and language, this is often what is required. In contrast, ensemble models like random forests or gradient-boosted trees have no difficulty handling mixed data types.\n", + "\n", + "* **Many problems are not about prediction.** In natural science we are often interested in learning something about the underlying distribution that generates the data. In this case, it is often difficult to cast these ideas in a supervised learning setting. While the problems are related, it is possible to make good predictions with a *wrong* model. The model might or might not be useful for understanding the underlying science.\n", + "\n", + "Some of these remarks are particular to DNNs, others are shared by all supervised learning methods. This motivates the use of unsupervised methods which in part circumvent these problems." + ] + }, + { + "cell_type": "markdown", + "id": "9398e7b0", + "metadata": { + "editable": true + }, + "source": [ + "## Solving ODEs with Deep Learning\n", + "\n", + "The Universal Approximation Theorem states that a neural network can\n", + "approximate any function at a single hidden layer along with one input\n", + "and output layer to any given precision.\n", + "\n", + "**Book on solving differential equations with ML methods.**\n", + "\n", + "[An Introduction to Neural Network Methods for Differential Equations](https://www.springer.com/gp/book/9789401798150), by Yadav and Kumar.\n", + "\n", + "**Master thesis on applying deep learning to problems in mechanics.**\n", + "\n", + "[Using Deep Reinforcement Learning for Active Flow Control](https://www.duo.uio.no/handle/10852/79212), by Marius Holm\n", + "\n", + "**Thanks to Kristine Baluka Hein.**\n", + "\n", + "The lectures on differential equations were developed by Kristine Baluka Hein, now PhD student at IFI.\n", + "A great thanks to Kristine." + ] + }, + { + "cell_type": "markdown", + "id": "38ca5c29", + "metadata": { + "editable": true + }, + "source": [ + "## Ordinary Differential Equations\n", + "\n", + "An ordinary differential equation (ODE) is an equation involving functions having one variable.\n", + "\n", + "In general, an ordinary differential equation looks like" + ] + }, + { + "cell_type": "markdown", + "id": "0c60c696", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{ode} \\tag{1}\n", + "f\\left(x, \\, g(x), \\, g'(x), \\, g''(x), \\, \\dots \\, , \\, g^{(n)}(x)\\right) = 0\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f2583e1e", + "metadata": { + "editable": true + }, + "source": [ + "where $g(x)$ is the function to find, and $g^{(n)}(x)$ is the $n$-th derivative of $g(x)$.\n", + "\n", + "The $f\\left(x, g(x), g'(x), g''(x), \\, \\dots \\, , g^{(n)}(x)\\right)$ is just a way to write that there is an expression involving $x$ and $g(x), \\ g'(x), \\ g''(x), \\, \\dots \\, , \\text{ and } g^{(n)}(x)$ on the left side of the equality sign in ([1](#ode)).\n", + "The highest order of derivative, that is the value of $n$, determines to the order of the equation.\n", + "The equation is referred to as a $n$-th order ODE.\n", + "Along with ([1](#ode)), some additional conditions of the function $g(x)$ are typically given\n", + "for the solution to be unique." + ] + }, + { + "cell_type": "markdown", + "id": "39729d0e", + "metadata": { + "editable": true + }, + "source": [ + "## The trial solution\n", + "\n", + "Let the trial solution $g_t(x)$ be" + ] + }, + { + "cell_type": "markdown", + "id": "161e15ef", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\tg_t(x) = h_1(x) + h_2(x,N(x,P))\n", + "\\label{_auto1} \\tag{2}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f9cf300b", + "metadata": { + "editable": true + }, + "source": [ + "where $h_1(x)$ is a function that makes $g_t(x)$ satisfy a given set\n", + "of conditions, $N(x,P)$ a neural network with weights and biases\n", + "described by $P$ and $h_2(x, N(x,P))$ some expression involving the\n", + "neural network. The role of the function $h_2(x, N(x,P))$, is to\n", + "ensure that the output from $N(x,P)$ is zero when $g_t(x)$ is\n", + "evaluated at the values of $x$ where the given conditions must be\n", + "satisfied. The function $h_1(x)$ should alone make $g_t(x)$ satisfy\n", + "the conditions.\n", + "\n", + "But what about the network $N(x,P)$?\n", + "\n", + "As described previously, an optimization method could be used to minimize the parameters of a neural network, that being its weights and biases, through backward propagation." + ] + }, + { + "cell_type": "markdown", + "id": "733ed455", + "metadata": { + "editable": true + }, + "source": [ + "## Minimization process\n", + "\n", + "For the minimization to be defined, we need to have a cost function at hand to minimize.\n", + "\n", + "It is given that $f\\left(x, \\, g(x), \\, g'(x), \\, g''(x), \\, \\dots \\, , \\, g^{(n)}(x)\\right)$ should be equal to zero in ([1](#ode)).\n", + "We can choose to consider the mean squared error as the cost function for an input $x$.\n", + "Since we are looking at one input, the cost function is just $f$ squared.\n", + "The cost function $c\\left(x, P \\right)$ can therefore be expressed as" + ] + }, + { + "cell_type": "markdown", + "id": "f53e9f95", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "C\\left(x, P\\right) = \\big(f\\left(x, \\, g(x), \\, g'(x), \\, g''(x), \\, \\dots \\, , \\, g^{(n)}(x)\\right)\\big)^2\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "34517bb4", + "metadata": { + "editable": true + }, + "source": [ + "If $N$ inputs are given as a vector $\\boldsymbol{x}$ with elements $x_i$ for $i = 1,\\dots,N$,\n", + "the cost function becomes" + ] + }, + { + "cell_type": "markdown", + "id": "e02c971a", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{cost} \\tag{3}\n", + "\tC\\left(\\boldsymbol{x}, P\\right) = \\frac{1}{N} \\sum_{i=1}^N \\big(f\\left(x_i, \\, g(x_i), \\, g'(x_i), \\, g''(x_i), \\, \\dots \\, , \\, g^{(n)}(x_i)\\right)\\big)^2\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8556f292", + "metadata": { + "editable": true + }, + "source": [ + "The neural net should then find the parameters $P$ that minimizes the cost function in\n", + "([3](#cost)) for a set of $N$ training samples $x_i$." + ] + }, + { + "cell_type": "markdown", + "id": "cca6ee92", + "metadata": { + "editable": true + }, + "source": [ + "## Minimizing the cost function using gradient descent and automatic differentiation\n", + "\n", + "To perform the minimization using gradient descent, the gradient of $C\\left(\\boldsymbol{x}, P\\right)$ is needed.\n", + "It might happen so that finding an analytical expression of the gradient of $C(\\boldsymbol{x}, P)$ from ([3](#cost)) gets too messy, depending on which cost function one desires to use.\n", + "\n", + "Luckily, there exists libraries that makes the job for us through automatic differentiation.\n", + "Automatic differentiation is a method of finding the derivatives numerically with very high precision." + ] + }, + { + "cell_type": "markdown", + "id": "5c2b6a47", + "metadata": { + "editable": true + }, + "source": [ + "## Example: Exponential decay\n", + "\n", + "An exponential decay of a quantity $g(x)$ is described by the equation" + ] + }, + { + "cell_type": "markdown", + "id": "10ceefea", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{solve_expdec} \\tag{4}\n", + " g'(x) = -\\gamma g(x)\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7a6beee0", + "metadata": { + "editable": true + }, + "source": [ + "with $g(0) = g_0$ for some chosen initial value $g_0$.\n", + "\n", + "The analytical solution of ([4](#solve_expdec)) is" + ] + }, + { + "cell_type": "markdown", + "id": "53982347", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation}\n", + " g(x) = g_0 \\exp\\left(-\\gamma x\\right)\n", + "\\label{_auto2} \\tag{5}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ce561b16", + "metadata": { + "editable": true + }, + "source": [ + "Having an analytical solution at hand, it is possible to use it to compare how well a neural network finds a solution of ([4](#solve_expdec))." + ] + }, + { + "cell_type": "markdown", + "id": "b5d5314b", + "metadata": { + "editable": true + }, + "source": [ + "## The function to solve for\n", + "\n", + "The program will use a neural network to solve" + ] + }, + { + "cell_type": "markdown", + "id": "c4d67b46", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{solveode} \\tag{6}\n", + "g'(x) = -\\gamma g(x)\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "fe827114", + "metadata": { + "editable": true + }, + "source": [ + "where $g(0) = g_0$ with $\\gamma$ and $g_0$ being some chosen values.\n", + "\n", + "In this example, $\\gamma = 2$ and $g_0 = 10$." + ] + }, + { + "cell_type": "markdown", + "id": "8ffca9fa", + "metadata": { + "editable": true + }, + "source": [ + "## The trial solution\n", + "To begin with, a trial solution $g_t(t)$ must be chosen. A general trial solution for ordinary differential equations could be" + ] + }, + { + "cell_type": "markdown", + "id": "9ec1e42a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "g_t(x, P) = h_1(x) + h_2(x, N(x, P))\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "a002d557", + "metadata": { + "editable": true + }, + "source": [ + "with $h_1(x)$ ensuring that $g_t(x)$ satisfies some conditions and $h_2(x,N(x, P))$ an expression involving $x$ and the output from the neural network $N(x,P)$ with $P $ being the collection of the weights and biases for each layer. For now, it is assumed that the network consists of one input layer, one hidden layer, and one output layer." + ] + }, + { + "cell_type": "markdown", + "id": "760f494e", + "metadata": { + "editable": true + }, + "source": [ + "## Setup of Network\n", + "\n", + "In this network, there are no weights and bias at the input layer, so $P = \\{ P_{\\text{hidden}}, P_{\\text{output}} \\}$.\n", + "If there are $N_{\\text{hidden} }$ neurons in the hidden layer, then $P_{\\text{hidden}}$ is a $N_{\\text{hidden} } \\times (1 + N_{\\text{input}})$ matrix, given that there are $N_{\\text{input}}$ neurons in the input layer.\n", + "\n", + "The first column in $P_{\\text{hidden} }$ represents the bias for each neuron in the hidden layer and the second column represents the weights for each neuron in the hidden layer from the input layer.\n", + "If there are $N_{\\text{output} }$ neurons in the output layer, then $P_{\\text{output}} $ is a $N_{\\text{output} } \\times (1 + N_{\\text{hidden} })$ matrix.\n", + "\n", + "Its first column represents the bias of each neuron and the remaining columns represents the weights to each neuron.\n", + "\n", + "It is given that $g(0) = g_0$. The trial solution must fulfill this condition to be a proper solution of ([6](#solveode)). A possible way to ensure that $g_t(0, P) = g_0$, is to let $F(N(x,P)) = x \\cdot N(x,P)$ and $A(x) = g_0$. This gives the following trial solution:" + ] + }, + { + "cell_type": "markdown", + "id": "5f15f368", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{trial} \\tag{7}\n", + "g_t(x, P) = g_0 + x \\cdot N(x, P)\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c91d6d7c", + "metadata": { + "editable": true + }, + "source": [ + "## Reformulating the problem\n", + "\n", + "We wish that our neural network manages to minimize a given cost function.\n", + "\n", + "A reformulation of out equation, ([6](#solveode)), must therefore be done,\n", + "such that it describes the problem a neural network can solve for.\n", + "\n", + "The neural network must find the set of weights and biases $P$ such that the trial solution in ([7](#trial)) satisfies ([6](#solveode)).\n", + "\n", + "The trial solution" + ] + }, + { + "cell_type": "markdown", + "id": "bd6ed5a3", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "g_t(x, P) = g_0 + x \\cdot N(x, P)\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "06a70c9a", + "metadata": { + "editable": true + }, + "source": [ + "has been chosen such that it already solves the condition $g(0) = g_0$. What remains, is to find $P$ such that" + ] + }, + { + "cell_type": "markdown", + "id": "6d20f780", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{nnmin} \\tag{8}\n", + "g_t'(x, P) = - \\gamma g_t(x, P)\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "9546abd9", + "metadata": { + "editable": true + }, + "source": [ + "is fulfilled as *best as possible*." + ] + }, + { + "cell_type": "markdown", + "id": "e4073ebd", + "metadata": { + "editable": true + }, + "source": [ + "## More technicalities\n", + "\n", + "The left hand side and right hand side of ([8](#nnmin)) must be computed separately, and then the neural network must choose weights and biases, contained in $P$, such that the sides are equal as best as possible.\n", + "This means that the absolute or squared difference between the sides must be as close to zero, ideally equal to zero.\n", + "In this case, the difference squared shows to be an appropriate measurement of how erroneous the trial solution is with respect to $P$ of the neural network.\n", + "\n", + "This gives the following cost function our neural network must solve for:" + ] + }, + { + "cell_type": "markdown", + "id": "2dfb903c", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\min_{P}\\Big\\{ \\big(g_t'(x, P) - ( -\\gamma g_t(x, P) \\big)^2 \\Big\\}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b1890129", + "metadata": { + "editable": true + }, + "source": [ + "(the notation $\\min_{P}\\{ f(x, P) \\}$ means that we desire to find $P$ that yields the minimum of $f(x, P)$)\n", + "\n", + "or, in terms of weights and biases for the hidden and output layer in our network:" + ] + }, + { + "cell_type": "markdown", + "id": "a787ccbe", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\min_{P_{\\text{hidden} }, \\ P_{\\text{output} }}\\Big\\{ \\big(g_t'(x, \\{ P_{\\text{hidden} }, P_{\\text{output} }\\}) - ( -\\gamma g_t(x, \\{ P_{\\text{hidden} }, P_{\\text{output} }\\}) \\big)^2 \\Big\\}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f0a4fa04", + "metadata": { + "editable": true + }, + "source": [ + "for an input value $x$." + ] + }, + { + "cell_type": "markdown", + "id": "94e4bd68", + "metadata": { + "editable": true + }, + "source": [ + "## More details\n", + "\n", + "If the neural network evaluates $g_t(x, P)$ at more values for $x$, say $N$ values $x_i$ for $i = 1, \\dots, N$, then the *total* error to minimize becomes" + ] + }, + { + "cell_type": "markdown", + "id": "1c418fe5", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{min} \\tag{9}\n", + "\\min_{P}\\Big\\{\\frac{1}{N} \\sum_{i=1}^N \\big(g_t'(x_i, P) - ( -\\gamma g_t(x_i, P) \\big)^2 \\Big\\}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "92fee060", + "metadata": { + "editable": true + }, + "source": [ + "Letting $\\boldsymbol{x}$ be a vector with elements $x_i$ and $C(\\boldsymbol{x}, P) = \\frac{1}{N} \\sum_i \\big(g_t'(x_i, P) - ( -\\gamma g_t(x_i, P) \\big)^2$ denote the cost function, the minimization problem that our network must solve, becomes" + ] + }, + { + "cell_type": "markdown", + "id": "81b76e58", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\min_{P} C(\\boldsymbol{x}, P)\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "2d3f26a5", + "metadata": { + "editable": true + }, + "source": [ + "In terms of $P_{\\text{hidden} }$ and $P_{\\text{output} }$, this could also be expressed as\n", + "\n", + "$$\n", + "\\min_{P_{\\text{hidden} }, \\ P_{\\text{output} }} C(\\boldsymbol{x}, \\{P_{\\text{hidden} }, P_{\\text{output} }\\})\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "872160e6", + "metadata": { + "editable": true + }, + "source": [ + "## A possible implementation of a neural network\n", + "\n", + "For simplicity, it is assumed that the input is an array $\\boldsymbol{x} = (x_1, \\dots, x_N)$ with $N$ elements. It is at these points the neural network should find $P$ such that it fulfills ([9](#min)).\n", + "\n", + "First, the neural network must feed forward the inputs.\n", + "This means that $\\boldsymbol{x}s$ must be passed through an input layer, a hidden layer and a output layer. The input layer in this case, does not need to process the data any further.\n", + "The input layer will consist of $N_{\\text{input} }$ neurons, passing its element to each neuron in the hidden layer. The number of neurons in the hidden layer will be $N_{\\text{hidden} }$." + ] + }, + { + "cell_type": "markdown", + "id": "f7c201c9", + "metadata": { + "editable": true + }, + "source": [ + "## Technicalities\n", + "\n", + "For the $i$-th in the hidden layer with weight $w_i^{\\text{hidden} }$ and bias $b_i^{\\text{hidden} }$, the weighting from the $j$-th neuron at the input layer is:" + ] + }, + { + "cell_type": "markdown", + "id": "67b3b2c5", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{aligned}\n", + "z_{i,j}^{\\text{hidden}} &= b_i^{\\text{hidden}} + w_i^{\\text{hidden}}x_j \\\\\n", + "&=\n", + "\\begin{pmatrix}\n", + "b_i^{\\text{hidden}} & w_i^{\\text{hidden}}\n", + "\\end{pmatrix}\n", + "\\begin{pmatrix}\n", + "1 \\\\\n", + "x_j\n", + "\\end{pmatrix}\n", + "\\end{aligned}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4b0c1a9f", + "metadata": { + "editable": true + }, + "source": [ + "## Final technicalities I\n", + "\n", + "The result after weighting the inputs at the $i$-th hidden neuron can be written as a vector:" + ] + }, + { + "cell_type": "markdown", + "id": "7d711054", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{aligned}\n", + "\\boldsymbol{z}_{i}^{\\text{hidden}} &= \\Big( b_i^{\\text{hidden}} + w_i^{\\text{hidden}}x_1 , \\ b_i^{\\text{hidden}} + w_i^{\\text{hidden}} x_2, \\ \\dots \\, , \\ b_i^{\\text{hidden}} + w_i^{\\text{hidden}} x_N\\Big) \\\\\n", + "&=\n", + "\\begin{pmatrix}\n", + " b_i^{\\text{hidden}} & w_i^{\\text{hidden}}\n", + "\\end{pmatrix}\n", + "\\begin{pmatrix}\n", + "1 & 1 & \\dots & 1 \\\\\n", + "x_1 & x_2 & \\dots & x_N\n", + "\\end{pmatrix} \\\\\n", + "&= \\boldsymbol{p}_{i, \\text{hidden}}^T X\n", + "\\end{aligned}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "959f1555", + "metadata": { + "editable": true + }, + "source": [ + "## Final technicalities II\n", + "\n", + "The vector $\\boldsymbol{p}_{i, \\text{hidden}}^T$ constitutes each row in $P_{\\text{hidden} }$, which contains the weights for the neural network to minimize according to ([9](#min)).\n", + "\n", + "After having found $\\boldsymbol{z}_{i}^{\\text{hidden}} $ for every $i$-th neuron within the hidden layer, the vector will be sent to an activation function $a_i(\\boldsymbol{z})$.\n", + "\n", + "In this example, the sigmoid function has been chosen to be the activation function for each hidden neuron:" + ] + }, + { + "cell_type": "markdown", + "id": "0ee5702b", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f(z) = \\frac{1}{1 + \\exp{(-z)}}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "86386ed5", + "metadata": { + "editable": true + }, + "source": [ + "It is possible to use other activations functions for the hidden layer also.\n", + "\n", + "The output $\\boldsymbol{x}_i^{\\text{hidden}}$ from each $i$-th hidden neuron is:\n", + "\n", + "$$\n", + "\\boldsymbol{x}_i^{\\text{hidden} } = f\\big( \\boldsymbol{z}_{i}^{\\text{hidden}} \\big)\n", + "$$\n", + "\n", + "The outputs $\\boldsymbol{x}_i^{\\text{hidden} } $ are then sent to the output layer.\n", + "\n", + "The output layer consists of one neuron in this case, and combines the\n", + "output from each of the neurons in the hidden layers. The output layer\n", + "combines the results from the hidden layer using some weights $w_i^{\\text{output}}$\n", + "and biases $b_i^{\\text{output}}$. In this case,\n", + "it is assumes that the number of neurons in the output layer is one." + ] + }, + { + "cell_type": "markdown", + "id": "792a7767", + "metadata": { + "editable": true + }, + "source": [ + "## Final technicalities III\n", + "\n", + "The procedure of weighting the output neuron $j$ in the hidden layer to the $i$-th neuron in the output layer is similar as for the hidden layer described previously." + ] + }, + { + "cell_type": "markdown", + "id": "debfdf7d", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{aligned}\n", + "z_{1,j}^{\\text{output}} & =\n", + "\\begin{pmatrix}\n", + "b_1^{\\text{output}} & \\boldsymbol{w}_1^{\\text{output}}\n", + "\\end{pmatrix}\n", + "\\begin{pmatrix}\n", + "1 \\\\\n", + "\\boldsymbol{x}_j^{\\text{hidden}}\n", + "\\end{pmatrix}\n", + "\\end{aligned}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "cec57344", + "metadata": { + "editable": true + }, + "source": [ + "## Final technicalities IV\n", + "\n", + "Expressing $z_{1,j}^{\\text{output}}$ as a vector gives the following way of weighting the inputs from the hidden layer:" + ] + }, + { + "cell_type": "markdown", + "id": "fc406bc4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{z}_{1}^{\\text{output}} =\n", + "\\begin{pmatrix}\n", + "b_1^{\\text{output}} & \\boldsymbol{w}_1^{\\text{output}}\n", + "\\end{pmatrix}\n", + "\\begin{pmatrix}\n", + "1 & 1 & \\dots & 1 \\\\\n", + "\\boldsymbol{x}_1^{\\text{hidden}} & \\boldsymbol{x}_2^{\\text{hidden}} & \\dots & \\boldsymbol{x}_N^{\\text{hidden}}\n", + "\\end{pmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8280357c", + "metadata": { + "editable": true + }, + "source": [ + "In this case we seek a continuous range of values since we are approximating a function. This means that after computing $\\boldsymbol{z}_{1}^{\\text{output}}$ the neural network has finished its feed forward step, and $\\boldsymbol{z}_{1}^{\\text{output}}$ is the final output of the network." + ] + }, + { + "cell_type": "markdown", + "id": "e682cf5d", + "metadata": { + "editable": true + }, + "source": [ + "## Back propagation\n", + "\n", + "The next step is to decide how the parameters should be changed such that they minimize the cost function.\n", + "\n", + "The chosen cost function for this problem is" + ] + }, + { + "cell_type": "markdown", + "id": "86c630c3", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "C(\\boldsymbol{x}, P) = \\frac{1}{N} \\sum_i \\big(g_t'(x_i, P) - ( -\\gamma g_t(x_i, P) \\big)^2\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "64bc4c3a", + "metadata": { + "editable": true + }, + "source": [ + "In order to minimize the cost function, an optimization method must be chosen.\n", + "\n", + "Here, gradient descent with a constant step size has been chosen." + ] + }, + { + "cell_type": "markdown", + "id": "329b6929", + "metadata": { + "editable": true + }, + "source": [ + "## Gradient descent\n", + "\n", + "The idea of the gradient descent algorithm is to update parameters in\n", + "a direction where the cost function decreases goes to a minimum.\n", + "\n", + "In general, the update of some parameters $\\boldsymbol{\\omega}$ given a cost\n", + "function defined by some weights $\\boldsymbol{\\omega}$, $C(\\boldsymbol{x},\n", + "\\boldsymbol{\\omega})$, goes as follows:" + ] + }, + { + "cell_type": "markdown", + "id": "ffdb4b35", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{\\omega}_{\\text{new} } = \\boldsymbol{\\omega} - \\lambda \\nabla_{\\boldsymbol{\\omega}} C(\\boldsymbol{x}, \\boldsymbol{\\omega})\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "972f3fe7", + "metadata": { + "editable": true + }, + "source": [ + "for a number of iterations or until $ \\big|\\big| \\boldsymbol{\\omega}_{\\text{new} } - \\boldsymbol{\\omega} \\big|\\big|$ becomes smaller than some given tolerance.\n", + "\n", + "The value of $\\lambda$ decides how large steps the algorithm must take\n", + "in the direction of $ \\nabla_{\\boldsymbol{\\omega}} C(\\boldsymbol{x}, \\boldsymbol{\\omega})$.\n", + "The notation $\\nabla_{\\boldsymbol{\\omega}}$ express the gradient with respect\n", + "to the elements in $\\boldsymbol{\\omega}$.\n", + "\n", + "In our case, we have to minimize the cost function $C(\\boldsymbol{x}, P)$ with\n", + "respect to the two sets of weights and biases, that is for the hidden\n", + "layer $P_{\\text{hidden} }$ and for the output layer $P_{\\text{output}\n", + "}$ .\n", + "\n", + "This means that $P_{\\text{hidden} }$ and $P_{\\text{output} }$ is updated by" + ] + }, + { + "cell_type": "markdown", + "id": "26f47c23", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{aligned}\n", + "P_{\\text{hidden},\\text{new}} &= P_{\\text{hidden}} - \\lambda \\nabla_{P_{\\text{hidden}}} C(\\boldsymbol{x}, P) \\\\\n", + "P_{\\text{output},\\text{new}} &= P_{\\text{output}} - \\lambda \\nabla_{P_{\\text{output}}} C(\\boldsymbol{x}, P)\n", + "\\end{aligned}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "46e2f864", + "metadata": { + "editable": true + }, + "source": [ + "## The code for solving the ODE" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "5c9ef3e2", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "import autograd.numpy as np\n", + "from autograd import grad, elementwise_grad\n", + "import autograd.numpy.random as npr\n", + "from matplotlib import pyplot as plt\n", + "\n", + "def sigmoid(z):\n", + " return 1/(1 + np.exp(-z))\n", + "\n", + "# Assuming one input, hidden, and output layer\n", + "def neural_network(params, x):\n", + "\n", + " # Find the weights (including and biases) for the hidden and output layer.\n", + " # Assume that params is a list of parameters for each layer.\n", + " # The biases are the first element for each array in params,\n", + " # and the weights are the remaning elements in each array in params.\n", + "\n", + " w_hidden = params[0]\n", + " w_output = params[1]\n", + "\n", + " # Assumes input x being an one-dimensional array\n", + " num_values = np.size(x)\n", + " x = x.reshape(-1, num_values)\n", + "\n", + " # Assume that the input layer does nothing to the input x\n", + " x_input = x\n", + "\n", + " ## Hidden layer:\n", + "\n", + " # Add a row of ones to include bias\n", + " x_input = np.concatenate((np.ones((1,num_values)), x_input ), axis = 0)\n", + "\n", + " z_hidden = np.matmul(w_hidden, x_input)\n", + " x_hidden = sigmoid(z_hidden)\n", + "\n", + " ## Output layer:\n", + "\n", + " # Include bias:\n", + " x_hidden = np.concatenate((np.ones((1,num_values)), x_hidden ), axis = 0)\n", + "\n", + " z_output = np.matmul(w_output, x_hidden)\n", + " x_output = z_output\n", + "\n", + " return x_output\n", + "\n", + "# The trial solution using the deep neural network:\n", + "def g_trial(x,params, g0 = 10):\n", + " return g0 + x*neural_network(params,x)\n", + "\n", + "# The right side of the ODE:\n", + "def g(x, g_trial, gamma = 2):\n", + " return -gamma*g_trial\n", + "\n", + "# The cost function:\n", + "def cost_function(P, x):\n", + "\n", + " # Evaluate the trial function with the current parameters P\n", + " g_t = g_trial(x,P)\n", + "\n", + " # Find the derivative w.r.t x of the neural network\n", + " d_net_out = elementwise_grad(neural_network,1)(P,x)\n", + "\n", + " # Find the derivative w.r.t x of the trial function\n", + " d_g_t = elementwise_grad(g_trial,0)(x,P)\n", + "\n", + " # The right side of the ODE\n", + " func = g(x, g_t)\n", + "\n", + " err_sqr = (d_g_t - func)**2\n", + " cost_sum = np.sum(err_sqr)\n", + "\n", + " return cost_sum / np.size(err_sqr)\n", + "\n", + "# Solve the exponential decay ODE using neural network with one input, hidden, and output layer\n", + "def solve_ode_neural_network(x, num_neurons_hidden, num_iter, lmb):\n", + " ## Set up initial weights and biases\n", + "\n", + " # For the hidden layer\n", + " p0 = npr.randn(num_neurons_hidden, 2 )\n", + "\n", + " # For the output layer\n", + " p1 = npr.randn(1, num_neurons_hidden + 1 ) # +1 since bias is included\n", + "\n", + " P = [p0, p1]\n", + "\n", + " print('Initial cost: %g'%cost_function(P, x))\n", + "\n", + " ## Start finding the optimal weights using gradient descent\n", + "\n", + " # Find the Python function that represents the gradient of the cost function\n", + " # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer\n", + " cost_function_grad = grad(cost_function,0)\n", + "\n", + " # Let the update be done num_iter times\n", + " for i in range(num_iter):\n", + " # Evaluate the gradient at the current weights and biases in P.\n", + " # The cost_grad consist now of two arrays;\n", + " # one for the gradient w.r.t P_hidden and\n", + " # one for the gradient w.r.t P_output\n", + " cost_grad = cost_function_grad(P, x)\n", + "\n", + " P[0] = P[0] - lmb * cost_grad[0]\n", + " P[1] = P[1] - lmb * cost_grad[1]\n", + "\n", + " print('Final cost: %g'%cost_function(P, x))\n", + "\n", + " return P\n", + "\n", + "def g_analytic(x, gamma = 2, g0 = 10):\n", + " return g0*np.exp(-gamma*x)\n", + "\n", + "# Solve the given problem\n", + "if __name__ == '__main__':\n", + " # Set seed such that the weight are initialized\n", + " # with same weights and biases for every run.\n", + " npr.seed(15)\n", + "\n", + " ## Decide the vales of arguments to the function to solve\n", + " N = 10\n", + " x = np.linspace(0, 1, N)\n", + "\n", + " ## Set up the initial parameters\n", + " num_hidden_neurons = 10\n", + " num_iter = 10000\n", + " lmb = 0.001\n", + "\n", + " # Use the network\n", + " P = solve_ode_neural_network(x, num_hidden_neurons, num_iter, lmb)\n", + "\n", + " # Print the deviation from the trial solution and true solution\n", + " res = g_trial(x,P)\n", + " res_analytical = g_analytic(x)\n", + "\n", + " print('Max absolute difference: %g'%np.max(np.abs(res - res_analytical)))\n", + "\n", + " # Plot the results\n", + " plt.figure(figsize=(10,10))\n", + "\n", + " plt.title('Performance of neural network solving an ODE compared to the analytical solution')\n", + " plt.plot(x, res_analytical)\n", + " plt.plot(x, res[0,:])\n", + " plt.legend(['analytical','nn'])\n", + " plt.xlabel('x')\n", + " plt.ylabel('g(x)')\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "9541ca3b", + "metadata": { + "editable": true + }, + "source": [ + "## The network with one input layer, specified number of hidden layers, and one output layer\n", + "\n", + "It is also possible to extend the construction of our network into a more general one, allowing the network to contain more than one hidden layers.\n", + "\n", + "The number of neurons within each hidden layer are given as a list of integers in the program below." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "cb1f580a", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "import autograd.numpy as np\n", + "from autograd import grad, elementwise_grad\n", + "import autograd.numpy.random as npr\n", + "from matplotlib import pyplot as plt\n", + "\n", + "def sigmoid(z):\n", + " return 1/(1 + np.exp(-z))\n", + "\n", + "# The neural network with one input layer and one output layer,\n", + "# but with number of hidden layers specified by the user.\n", + "def deep_neural_network(deep_params, x):\n", + " # N_hidden is the number of hidden layers\n", + "\n", + " N_hidden = np.size(deep_params) - 1 # -1 since params consists of\n", + " # parameters to all the hidden\n", + " # layers AND the output layer.\n", + "\n", + " # Assumes input x being an one-dimensional array\n", + " num_values = np.size(x)\n", + " x = x.reshape(-1, num_values)\n", + "\n", + " # Assume that the input layer does nothing to the input x\n", + " x_input = x\n", + "\n", + " # Due to multiple hidden layers, define a variable referencing to the\n", + " # output of the previous layer:\n", + " x_prev = x_input\n", + "\n", + " ## Hidden layers:\n", + "\n", + " for l in range(N_hidden):\n", + " # From the list of parameters P; find the correct weigths and bias for this layer\n", + " w_hidden = deep_params[l]\n", + "\n", + " # Add a row of ones to include bias\n", + " x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0)\n", + "\n", + " z_hidden = np.matmul(w_hidden, x_prev)\n", + " x_hidden = sigmoid(z_hidden)\n", + "\n", + " # Update x_prev such that next layer can use the output from this layer\n", + " x_prev = x_hidden\n", + "\n", + " ## Output layer:\n", + "\n", + " # Get the weights and bias for this layer\n", + " w_output = deep_params[-1]\n", + "\n", + " # Include bias:\n", + " x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0)\n", + "\n", + " z_output = np.matmul(w_output, x_prev)\n", + " x_output = z_output\n", + "\n", + " return x_output\n", + "\n", + "# The trial solution using the deep neural network:\n", + "def g_trial_deep(x,params, g0 = 10):\n", + " return g0 + x*deep_neural_network(params, x)\n", + "\n", + "# The right side of the ODE:\n", + "def g(x, g_trial, gamma = 2):\n", + " return -gamma*g_trial\n", + "\n", + "# The same cost function as before, but calls deep_neural_network instead.\n", + "def cost_function_deep(P, x):\n", + "\n", + " # Evaluate the trial function with the current parameters P\n", + " g_t = g_trial_deep(x,P)\n", + "\n", + " # Find the derivative w.r.t x of the neural network\n", + " d_net_out = elementwise_grad(deep_neural_network,1)(P,x)\n", + "\n", + " # Find the derivative w.r.t x of the trial function\n", + " d_g_t = elementwise_grad(g_trial_deep,0)(x,P)\n", + "\n", + " # The right side of the ODE\n", + " func = g(x, g_t)\n", + "\n", + " err_sqr = (d_g_t - func)**2\n", + " cost_sum = np.sum(err_sqr)\n", + "\n", + " return cost_sum / np.size(err_sqr)\n", + "\n", + "# Solve the exponential decay ODE using neural network with one input and one output layer,\n", + "# but with specified number of hidden layers from the user.\n", + "def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb):\n", + " # num_hidden_neurons is now a list of number of neurons within each hidden layer\n", + "\n", + " # The number of elements in the list num_hidden_neurons thus represents\n", + " # the number of hidden layers.\n", + "\n", + " # Find the number of hidden layers:\n", + " N_hidden = np.size(num_neurons)\n", + "\n", + " ## Set up initial weights and biases\n", + "\n", + " # Initialize the list of parameters:\n", + " P = [None]*(N_hidden + 1) # + 1 to include the output layer\n", + "\n", + " P[0] = npr.randn(num_neurons[0], 2 )\n", + " for l in range(1,N_hidden):\n", + " P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias\n", + "\n", + " # For the output layer\n", + " P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included\n", + "\n", + " print('Initial cost: %g'%cost_function_deep(P, x))\n", + "\n", + " ## Start finding the optimal weights using gradient descent\n", + "\n", + " # Find the Python function that represents the gradient of the cost function\n", + " # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer\n", + " cost_function_deep_grad = grad(cost_function_deep,0)\n", + "\n", + " # Let the update be done num_iter times\n", + " for i in range(num_iter):\n", + " # Evaluate the gradient at the current weights and biases in P.\n", + " # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases\n", + " # in the hidden layers and output layers evaluated at x.\n", + " cost_deep_grad = cost_function_deep_grad(P, x)\n", + "\n", + " for l in range(N_hidden+1):\n", + " P[l] = P[l] - lmb * cost_deep_grad[l]\n", + "\n", + " print('Final cost: %g'%cost_function_deep(P, x))\n", + "\n", + " return P\n", + "\n", + "def g_analytic(x, gamma = 2, g0 = 10):\n", + " return g0*np.exp(-gamma*x)\n", + "\n", + "# Solve the given problem\n", + "if __name__ == '__main__':\n", + " npr.seed(15)\n", + "\n", + " ## Decide the vales of arguments to the function to solve\n", + " N = 10\n", + " x = np.linspace(0, 1, N)\n", + "\n", + " ## Set up the initial parameters\n", + " num_hidden_neurons = np.array([10,10])\n", + " num_iter = 10000\n", + " lmb = 0.001\n", + "\n", + " P = solve_ode_deep_neural_network(x, num_hidden_neurons, num_iter, lmb)\n", + "\n", + " res = g_trial_deep(x,P)\n", + " res_analytical = g_analytic(x)\n", + "\n", + " plt.figure(figsize=(10,10))\n", + "\n", + " plt.title('Performance of a deep neural network solving an ODE compared to the analytical solution')\n", + " plt.plot(x, res_analytical)\n", + " plt.plot(x, res[0,:])\n", + " plt.legend(['analytical','dnn'])\n", + " plt.ylabel('g(x)')\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "1ce3dba0", + "metadata": { + "editable": true + }, + "source": [ + "## Example: Population growth\n", + "\n", + "A logistic model of population growth assumes that a population converges toward an equilibrium.\n", + "The population growth can be modeled by" + ] + }, + { + "cell_type": "markdown", + "id": "bd8d79a2", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{log} \\tag{10}\n", + "\tg'(t) = \\alpha g(t)(A - g(t))\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3a2583e3", + "metadata": { + "editable": true + }, + "source": [ + "where $g(t)$ is the population density at time $t$, $\\alpha > 0$ the growth rate and $A > 0$ is the maximum population number in the environment.\n", + "Also, at $t = 0$ the population has the size $g(0) = g_0$, where $g_0$ is some chosen constant.\n", + "\n", + "In this example, similar network as for the exponential decay using Autograd has been used to solve the equation. However, as the implementation might suffer from e.g numerical instability\n", + "and high execution time (this might be more apparent in the examples solving PDEs),\n", + "using a library like TensorFlow is recommended.\n", + "Here, we stay with a more simple approach and implement for comparison, the simple forward Euler method." + ] + }, + { + "cell_type": "markdown", + "id": "bda6ba67", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the problem\n", + "\n", + "Here, we will model a population $g(t)$ in an environment having carrying capacity $A$.\n", + "The population follows the model" + ] + }, + { + "cell_type": "markdown", + "id": "1483f8e7", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{solveode_population} \\tag{11}\n", + "g'(t) = \\alpha g(t)(A - g(t))\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "82aa5d57", + "metadata": { + "editable": true + }, + "source": [ + "where $g(0) = g_0$.\n", + "\n", + "In this example, we let $\\alpha = 2$, $A = 1$, and $g_0 = 1.2$." + ] + }, + { + "cell_type": "markdown", + "id": "ba1d1722", + "metadata": { + "editable": true + }, + "source": [ + "## The trial solution\n", + "\n", + "We will get a slightly different trial solution, as the boundary conditions are different\n", + "compared to the case for exponential decay.\n", + "\n", + "A possible trial solution satisfying the condition $g(0) = g_0$ could be\n", + "\n", + "$$\n", + "h_1(t) = g_0 + t \\cdot N(t,P)\n", + "$$\n", + "\n", + "with $N(t,P)$ being the output from the neural network with weights and biases for each layer collected in the set $P$.\n", + "\n", + "The analytical solution is\n", + "\n", + "$$\n", + "g(t) = \\frac{Ag_0}{g_0 + (A - g_0)\\exp(-\\alpha A t)}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "58ccc1eb", + "metadata": { + "editable": true + }, + "source": [ + "## The program using Autograd\n", + "\n", + "The network will be the similar as for the exponential decay example, but with some small modifications for our problem." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "0a4c20d1", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "import autograd.numpy as np\n", + "from autograd import grad, elementwise_grad\n", + "import autograd.numpy.random as npr\n", + "from matplotlib import pyplot as plt\n", + "\n", + "def sigmoid(z):\n", + " return 1/(1 + np.exp(-z))\n", + "\n", + "# Function to get the parameters.\n", + "# Done such that one can easily change the paramaters after one's liking.\n", + "def get_parameters():\n", + " alpha = 2\n", + " A = 1\n", + " g0 = 1.2\n", + " return alpha, A, g0\n", + "\n", + "def deep_neural_network(P, x):\n", + " # N_hidden is the number of hidden layers\n", + " N_hidden = np.size(P) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer\n", + "\n", + " # Assumes input x being an one-dimensional array\n", + " num_values = np.size(x)\n", + " x = x.reshape(-1, num_values)\n", + "\n", + " # Assume that the input layer does nothing to the input x\n", + " x_input = x\n", + "\n", + " # Due to multiple hidden layers, define a variable referencing to the\n", + " # output of the previous layer:\n", + " x_prev = x_input\n", + "\n", + " ## Hidden layers:\n", + "\n", + " for l in range(N_hidden):\n", + " # From the list of parameters P; find the correct weigths and bias for this layer\n", + " w_hidden = P[l]\n", + "\n", + " # Add a row of ones to include bias\n", + " x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0)\n", + "\n", + " z_hidden = np.matmul(w_hidden, x_prev)\n", + " x_hidden = sigmoid(z_hidden)\n", + "\n", + " # Update x_prev such that next layer can use the output from this layer\n", + " x_prev = x_hidden\n", + "\n", + " ## Output layer:\n", + "\n", + " # Get the weights and bias for this layer\n", + " w_output = P[-1]\n", + "\n", + " # Include bias:\n", + " x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0)\n", + "\n", + " z_output = np.matmul(w_output, x_prev)\n", + " x_output = z_output\n", + "\n", + " return x_output\n", + "\n", + "\n", + "def cost_function_deep(P, x):\n", + "\n", + " # Evaluate the trial function with the current parameters P\n", + " g_t = g_trial_deep(x,P)\n", + "\n", + " # Find the derivative w.r.t x of the trial function\n", + " d_g_t = elementwise_grad(g_trial_deep,0)(x,P)\n", + "\n", + " # The right side of the ODE\n", + " func = f(x, g_t)\n", + "\n", + " err_sqr = (d_g_t - func)**2\n", + " cost_sum = np.sum(err_sqr)\n", + "\n", + " return cost_sum / np.size(err_sqr)\n", + "\n", + "# The right side of the ODE:\n", + "def f(x, g_trial):\n", + " alpha,A, g0 = get_parameters()\n", + " return alpha*g_trial*(A - g_trial)\n", + "\n", + "# The trial solution using the deep neural network:\n", + "def g_trial_deep(x, params):\n", + " alpha,A, g0 = get_parameters()\n", + " return g0 + x*deep_neural_network(params,x)\n", + "\n", + "# The analytical solution:\n", + "def g_analytic(t):\n", + " alpha,A, g0 = get_parameters()\n", + " return A*g0/(g0 + (A - g0)*np.exp(-alpha*A*t))\n", + "\n", + "def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb):\n", + " # num_hidden_neurons is now a list of number of neurons within each hidden layer\n", + "\n", + " # Find the number of hidden layers:\n", + " N_hidden = np.size(num_neurons)\n", + "\n", + " ## Set up initial weigths and biases\n", + "\n", + " # Initialize the list of parameters:\n", + " P = [None]*(N_hidden + 1) # + 1 to include the output layer\n", + "\n", + " P[0] = npr.randn(num_neurons[0], 2 )\n", + " for l in range(1,N_hidden):\n", + " P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias\n", + "\n", + " # For the output layer\n", + " P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included\n", + "\n", + " print('Initial cost: %g'%cost_function_deep(P, x))\n", + "\n", + " ## Start finding the optimal weigths using gradient descent\n", + "\n", + " # Find the Python function that represents the gradient of the cost function\n", + " # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer\n", + " cost_function_deep_grad = grad(cost_function_deep,0)\n", + "\n", + " # Let the update be done num_iter times\n", + " for i in range(num_iter):\n", + " # Evaluate the gradient at the current weights and biases in P.\n", + " # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases\n", + " # in the hidden layers and output layers evaluated at x.\n", + " cost_deep_grad = cost_function_deep_grad(P, x)\n", + "\n", + " for l in range(N_hidden+1):\n", + " P[l] = P[l] - lmb * cost_deep_grad[l]\n", + "\n", + " print('Final cost: %g'%cost_function_deep(P, x))\n", + "\n", + " return P\n", + "\n", + "if __name__ == '__main__':\n", + " npr.seed(4155)\n", + "\n", + " ## Decide the vales of arguments to the function to solve\n", + " Nt = 10\n", + " T = 1\n", + " t = np.linspace(0,T, Nt)\n", + "\n", + " ## Set up the initial parameters\n", + " num_hidden_neurons = [100, 50, 25]\n", + " num_iter = 1000\n", + " lmb = 1e-3\n", + "\n", + " P = solve_ode_deep_neural_network(t, num_hidden_neurons, num_iter, lmb)\n", + "\n", + " g_dnn_ag = g_trial_deep(t,P)\n", + " g_analytical = g_analytic(t)\n", + "\n", + " # Find the maximum absolute difference between the solutons:\n", + " diff_ag = np.max(np.abs(g_dnn_ag - g_analytical))\n", + " print(\"The max absolute difference between the solutions is: %g\"%diff_ag)\n", + "\n", + " plt.figure(figsize=(10,10))\n", + "\n", + " plt.title('Performance of neural network solving an ODE compared to the analytical solution')\n", + " plt.plot(t, g_analytical)\n", + " plt.plot(t, g_dnn_ag[0,:])\n", + " plt.legend(['analytical','nn'])\n", + " plt.xlabel('t')\n", + " plt.ylabel('g(t)')\n", + "\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "97450de8", + "metadata": { + "editable": true + }, + "source": [ + "## Using forward Euler to solve the ODE\n", + "\n", + "A straightforward way of solving an ODE numerically, is to use Euler's method.\n", + "\n", + "Euler's method uses Taylor series to approximate the value at a function $f$ at a step $\\Delta x$ from $x$:\n", + "\n", + "$$\n", + "f(x + \\Delta x) \\approx f(x) + \\Delta x f'(x)\n", + "$$\n", + "\n", + "In our case, using Euler's method to approximate the value of $g$ at a step $\\Delta t$ from $t$ yields" + ] + }, + { + "cell_type": "markdown", + "id": "89c1f1e5", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{aligned}\n", + " g(t + \\Delta t) &\\approx g(t) + \\Delta t g'(t) \\\\\n", + " &= g(t) + \\Delta t \\big(\\alpha g(t)(A - g(t))\\big)\n", + "\\end{aligned}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "fa3644af", + "metadata": { + "editable": true + }, + "source": [ + "along with the condition that $g(0) = g_0$.\n", + "\n", + "Let $t_i = i \\cdot \\Delta t$ where $\\Delta t = \\frac{T}{N_t-1}$ where $T$ is the final time our solver must solve for and $N_t$ the number of values for $t \\in [0, T]$ for $i = 0, \\dots, N_t-1$.\n", + "\n", + "For $i \\geq 1$, we have that" + ] + }, + { + "cell_type": "markdown", + "id": "107bef62", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{aligned}\n", + "t_i &= i\\Delta t \\\\\n", + "&= (i - 1)\\Delta t + \\Delta t \\\\\n", + "&= t_{i-1} + \\Delta t\n", + "\\end{aligned}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "65796f1d", + "metadata": { + "editable": true + }, + "source": [ + "Now, if $g_i = g(t_i)$ then" + ] + }, + { + "cell_type": "markdown", + "id": "fdb684ca", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation}\n", + " \\begin{aligned}\n", + " g_i &= g(t_i) \\\\\n", + " &= g(t_{i-1} + \\Delta t) \\\\\n", + " &\\approx g(t_{i-1}) + \\Delta t \\big(\\alpha g(t_{i-1})(A - g(t_{i-1}))\\big) \\\\\n", + " &= g_{i-1} + \\Delta t \\big(\\alpha g_{i-1}(A - g_{i-1})\\big)\n", + " \\end{aligned}\n", + "\\end{equation} \\label{odenum} \\tag{12}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "405eb53d", + "metadata": { + "editable": true + }, + "source": [ + "for $i \\geq 1$ and $g_0 = g(t_0) = g(0) = g_0$.\n", + "\n", + "Equation ([12](#odenum)) could be implemented in the following way,\n", + "extending the program that uses the network using Autograd:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "a903f1cf", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# Assume that all function definitions from the example program using Autograd\n", + "# are located here.\n", + "\n", + "if __name__ == '__main__':\n", + " npr.seed(4155)\n", + "\n", + " ## Decide the vales of arguments to the function to solve\n", + " Nt = 10\n", + " T = 1\n", + " t = np.linspace(0,T, Nt)\n", + "\n", + " ## Set up the initial parameters\n", + " num_hidden_neurons = [100,50,25]\n", + " num_iter = 1000\n", + " lmb = 1e-3\n", + "\n", + " P = solve_ode_deep_neural_network(t, num_hidden_neurons, num_iter, lmb)\n", + "\n", + " g_dnn_ag = g_trial_deep(t,P)\n", + " g_analytical = g_analytic(t)\n", + "\n", + " # Find the maximum absolute difference between the solutons:\n", + " diff_ag = np.max(np.abs(g_dnn_ag - g_analytical))\n", + " print(\"The max absolute difference between the solutions is: %g\"%diff_ag)\n", + "\n", + " plt.figure(figsize=(10,10))\n", + "\n", + " plt.title('Performance of neural network solving an ODE compared to the analytical solution')\n", + " plt.plot(t, g_analytical)\n", + " plt.plot(t, g_dnn_ag[0,:])\n", + " plt.legend(['analytical','nn'])\n", + " plt.xlabel('t')\n", + " plt.ylabel('g(t)')\n", + "\n", + " ## Find an approximation to the funtion using forward Euler\n", + "\n", + " alpha, A, g0 = get_parameters()\n", + " dt = T/(Nt - 1)\n", + "\n", + " # Perform forward Euler to solve the ODE\n", + " g_euler = np.zeros(Nt)\n", + " g_euler[0] = g0\n", + "\n", + " for i in range(1,Nt):\n", + " g_euler[i] = g_euler[i-1] + dt*(alpha*g_euler[i-1]*(A - g_euler[i-1]))\n", + "\n", + " # Print the errors done by each method\n", + " diff1 = np.max(np.abs(g_euler - g_analytical))\n", + " diff2 = np.max(np.abs(g_dnn_ag[0,:] - g_analytical))\n", + "\n", + " print('Max absolute difference between Euler method and analytical: %g'%diff1)\n", + " print('Max absolute difference between deep neural network and analytical: %g'%diff2)\n", + "\n", + " # Plot results\n", + " plt.figure(figsize=(10,10))\n", + "\n", + " plt.plot(t,g_euler)\n", + " plt.plot(t,g_analytical)\n", + " plt.plot(t,g_dnn_ag[0,:])\n", + "\n", + " plt.legend(['euler','analytical','dnn'])\n", + " plt.xlabel('Time t')\n", + " plt.ylabel('g(t)')\n", + "\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "f79a730a", + "metadata": { + "editable": true + }, + "source": [ + "## Example: Solving the one dimensional Poisson equation\n", + "\n", + "The Poisson equation for $g(x)$ in one dimension is" + ] + }, + { + "cell_type": "markdown", + "id": "28015c61", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{poisson} \\tag{13}\n", + " -g''(x) = f(x)\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "54ab04bb", + "metadata": { + "editable": true + }, + "source": [ + "where $f(x)$ is a given function for $x \\in (0,1)$.\n", + "\n", + "The conditions that $g(x)$ is chosen to fulfill, are" + ] + }, + { + "cell_type": "markdown", + "id": "9cc20be6", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{align*}\n", + " g(0) &= 0 \\\\\n", + " g(1) &= 0\n", + "\\end{align*}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7af7511b", + "metadata": { + "editable": true + }, + "source": [ + "This equation can be solved numerically using programs where e.g Autograd and TensorFlow are used.\n", + "The results from the networks can then be compared to the analytical solution.\n", + "In addition, it could be interesting to see how a typical method for numerically solving second order ODEs compares to the neural networks." + ] + }, + { + "cell_type": "markdown", + "id": "96856fc2", + "metadata": { + "editable": true + }, + "source": [ + "## The specific equation to solve for\n", + "\n", + "Here, the function $g(x)$ to solve for follows the equation" + ] + }, + { + "cell_type": "markdown", + "id": "1cf407bd", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "-g''(x) = f(x),\\qquad x \\in (0,1)\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "493a79a2", + "metadata": { + "editable": true + }, + "source": [ + "where $f(x)$ is a given function, along with the chosen conditions" + ] + }, + { + "cell_type": "markdown", + "id": "8b735b17", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "g(0) = g(1) = 0\n", + "\\end{aligned}\\label{cond} \\tag{14}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "39ddedfe", + "metadata": { + "editable": true + }, + "source": [ + "In this example, we consider the case when $f(x) = (3x + x^2)\\exp(x)$.\n", + "\n", + "For this case, a possible trial solution satisfying the conditions could be" + ] + }, + { + "cell_type": "markdown", + "id": "46bba0f0", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "g_t(x) = x \\cdot (1-x) \\cdot N(P,x)\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "1ba4c8b3", + "metadata": { + "editable": true + }, + "source": [ + "The analytical solution for this problem is" + ] + }, + { + "cell_type": "markdown", + "id": "e8faf0e1", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "g(x) = x(1 - x)\\exp(x)\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e4ce498c", + "metadata": { + "editable": true + }, + "source": [ + "## Solving the equation using Autograd" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "1d1cb692", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "import autograd.numpy as np\n", + "from autograd import grad, elementwise_grad\n", + "import autograd.numpy.random as npr\n", + "from matplotlib import pyplot as plt\n", + "\n", + "def sigmoid(z):\n", + " return 1/(1 + np.exp(-z))\n", + "\n", + "def deep_neural_network(deep_params, x):\n", + " # N_hidden is the number of hidden layers\n", + " N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer\n", + "\n", + " # Assumes input x being an one-dimensional array\n", + " num_values = np.size(x)\n", + " x = x.reshape(-1, num_values)\n", + "\n", + " # Assume that the input layer does nothing to the input x\n", + " x_input = x\n", + "\n", + " # Due to multiple hidden layers, define a variable referencing to the\n", + " # output of the previous layer:\n", + " x_prev = x_input\n", + "\n", + " ## Hidden layers:\n", + "\n", + " for l in range(N_hidden):\n", + " # From the list of parameters P; find the correct weigths and bias for this layer\n", + " w_hidden = deep_params[l]\n", + "\n", + " # Add a row of ones to include bias\n", + " x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0)\n", + "\n", + " z_hidden = np.matmul(w_hidden, x_prev)\n", + " x_hidden = sigmoid(z_hidden)\n", + "\n", + " # Update x_prev such that next layer can use the output from this layer\n", + " x_prev = x_hidden\n", + "\n", + " ## Output layer:\n", + "\n", + " # Get the weights and bias for this layer\n", + " w_output = deep_params[-1]\n", + "\n", + " # Include bias:\n", + " x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0)\n", + "\n", + " z_output = np.matmul(w_output, x_prev)\n", + " x_output = z_output\n", + "\n", + " return x_output\n", + "\n", + "def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb):\n", + " # num_hidden_neurons is now a list of number of neurons within each hidden layer\n", + "\n", + " # Find the number of hidden layers:\n", + " N_hidden = np.size(num_neurons)\n", + "\n", + " ## Set up initial weigths and biases\n", + "\n", + " # Initialize the list of parameters:\n", + " P = [None]*(N_hidden + 1) # + 1 to include the output layer\n", + "\n", + " P[0] = npr.randn(num_neurons[0], 2 )\n", + " for l in range(1,N_hidden):\n", + " P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias\n", + "\n", + " # For the output layer\n", + " P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included\n", + "\n", + " print('Initial cost: %g'%cost_function_deep(P, x))\n", + "\n", + " ## Start finding the optimal weigths using gradient descent\n", + "\n", + " # Find the Python function that represents the gradient of the cost function\n", + " # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer\n", + " cost_function_deep_grad = grad(cost_function_deep,0)\n", + "\n", + " # Let the update be done num_iter times\n", + " for i in range(num_iter):\n", + " # Evaluate the gradient at the current weights and biases in P.\n", + " # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases\n", + " # in the hidden layers and output layers evaluated at x.\n", + " cost_deep_grad = cost_function_deep_grad(P, x)\n", + "\n", + " for l in range(N_hidden+1):\n", + " P[l] = P[l] - lmb * cost_deep_grad[l]\n", + "\n", + " print('Final cost: %g'%cost_function_deep(P, x))\n", + "\n", + " return P\n", + "\n", + "## Set up the cost function specified for this Poisson equation:\n", + "\n", + "# The right side of the ODE\n", + "def f(x):\n", + " return (3*x + x**2)*np.exp(x)\n", + "\n", + "def cost_function_deep(P, x):\n", + "\n", + " # Evaluate the trial function with the current parameters P\n", + " g_t = g_trial_deep(x,P)\n", + "\n", + " # Find the derivative w.r.t x of the trial function\n", + " d2_g_t = elementwise_grad(elementwise_grad(g_trial_deep,0))(x,P)\n", + "\n", + " right_side = f(x)\n", + "\n", + " err_sqr = (-d2_g_t - right_side)**2\n", + " cost_sum = np.sum(err_sqr)\n", + "\n", + " return cost_sum/np.size(err_sqr)\n", + "\n", + "# The trial solution:\n", + "def g_trial_deep(x,P):\n", + " return x*(1-x)*deep_neural_network(P,x)\n", + "\n", + "# The analytic solution;\n", + "def g_analytic(x):\n", + " return x*(1-x)*np.exp(x)\n", + "\n", + "if __name__ == '__main__':\n", + " npr.seed(4155)\n", + "\n", + " ## Decide the vales of arguments to the function to solve\n", + " Nx = 10\n", + " x = np.linspace(0,1, Nx)\n", + "\n", + " ## Set up the initial parameters\n", + " num_hidden_neurons = [200,100]\n", + " num_iter = 1000\n", + " lmb = 1e-3\n", + "\n", + " P = solve_ode_deep_neural_network(x, num_hidden_neurons, num_iter, lmb)\n", + "\n", + " g_dnn_ag = g_trial_deep(x,P)\n", + " g_analytical = g_analytic(x)\n", + "\n", + " # Find the maximum absolute difference between the solutons:\n", + " max_diff = np.max(np.abs(g_dnn_ag - g_analytical))\n", + " print(\"The max absolute difference between the solutions is: %g\"%max_diff)\n", + "\n", + " plt.figure(figsize=(10,10))\n", + "\n", + " plt.title('Performance of neural network solving an ODE compared to the analytical solution')\n", + " plt.plot(x, g_analytical)\n", + " plt.plot(x, g_dnn_ag[0,:])\n", + " plt.legend(['analytical','nn'])\n", + " plt.xlabel('x')\n", + " plt.ylabel('g(x)')\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "16aa2193", + "metadata": { + "editable": true + }, + "source": [ + "## Comparing with a numerical scheme\n", + "\n", + "The Poisson equation is possible to solve using Taylor series to approximate the second derivative.\n", + "\n", + "Using Taylor series, the second derivative can be expressed as\n", + "\n", + "$$\n", + "g''(x) = \\frac{g(x + \\Delta x) - 2g(x) + g(x-\\Delta x)}{\\Delta x^2} + E_{\\Delta x}(x)\n", + "$$\n", + "\n", + "where $\\Delta x$ is a small step size and $E_{\\Delta x}(x)$ being the error term.\n", + "\n", + "Looking away from the error terms gives an approximation to the second derivative:" + ] + }, + { + "cell_type": "markdown", + "id": "b3ef1c2b", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{approx} \\tag{15}\n", + "g''(x) \\approx \\frac{g(x + \\Delta x) - 2g(x) + g(x-\\Delta x)}{\\Delta x^2}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "0e1c476f", + "metadata": { + "editable": true + }, + "source": [ + "If $x_i = i \\Delta x = x_{i-1} + \\Delta x$ and $g_i = g(x_i)$ for $i = 1,\\dots N_x - 2$ with $N_x$ being the number of values for $x$, ([15](#approx)) becomes" + ] + }, + { + "cell_type": "markdown", + "id": "7b2ad33d", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{aligned}\n", + "g''(x_i) &\\approx \\frac{g(x_i + \\Delta x) - 2g(x_i) + g(x_i -\\Delta x)}{\\Delta x^2} \\\\\n", + "&= \\frac{g_{i+1} - 2g_i + g_{i-1}}{\\Delta x^2}\n", + "\\end{aligned}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "1c57f992", + "metadata": { + "editable": true + }, + "source": [ + "Since we know from our problem that" + ] + }, + { + "cell_type": "markdown", + "id": "99e9dc9f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{aligned}\n", + "-g''(x) &= f(x) \\\\\n", + "&= (3x + x^2)\\exp(x)\n", + "\\end{aligned}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ecc62734", + "metadata": { + "editable": true + }, + "source": [ + "along with the conditions $g(0) = g(1) = 0$,\n", + "the following scheme can be used to find an approximate solution for $g(x)$ numerically:" + ] + }, + { + "cell_type": "markdown", + "id": "2d467ec2", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation}\n", + " \\begin{aligned}\n", + " -\\Big( \\frac{g_{i+1} - 2g_i + g_{i-1}}{\\Delta x^2} \\Big) &= f(x_i) \\\\\n", + " -g_{i+1} + 2g_i - g_{i-1} &= \\Delta x^2 f(x_i)\n", + " \\end{aligned}\n", + "\\end{equation} \\label{odesys} \\tag{16}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "2de58f3a", + "metadata": { + "editable": true + }, + "source": [ + "for $i = 1, \\dots, N_x - 2$ where $g_0 = g_{N_x - 1} = 0$ and $f(x_i) = (3x_i + x_i^2)\\exp(x_i)$, which is given for our specific problem.\n", + "\n", + "The equation can be rewritten into a matrix equation:" + ] + }, + { + "cell_type": "markdown", + "id": "0182bb77", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{aligned}\n", + "\\begin{pmatrix}\n", + "2 & -1 & 0 & \\dots & 0 \\\\\n", + "-1 & 2 & -1 & \\dots & 0 \\\\\n", + "\\vdots & & \\ddots & & \\vdots \\\\\n", + "0 & \\dots & -1 & 2 & -1 \\\\\n", + "0 & \\dots & 0 & -1 & 2\\\\\n", + "\\end{pmatrix}\n", + "\\begin{pmatrix}\n", + "g_1 \\\\\n", + "g_2 \\\\\n", + "\\vdots \\\\\n", + "g_{N_x - 3} \\\\\n", + "g_{N_x - 2}\n", + "\\end{pmatrix}\n", + "&=\n", + "\\Delta x^2\n", + "\\begin{pmatrix}\n", + "f(x_1) \\\\\n", + "f(x_2) \\\\\n", + "\\vdots \\\\\n", + "f(x_{N_x - 3}) \\\\\n", + "f(x_{N_x - 2})\n", + "\\end{pmatrix} \\\\\n", + "\\boldsymbol{A}\\boldsymbol{g} &= \\boldsymbol{f},\n", + "\\end{aligned}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7ef6f3b0", + "metadata": { + "editable": true + }, + "source": [ + "which makes it possible to solve for the vector $\\boldsymbol{g}$." + ] + }, + { + "cell_type": "markdown", + "id": "6414011b", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the code\n", + "\n", + "We can then compare the result from this numerical scheme with the output from our network using Autograd:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "dc3a8d10", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "import autograd.numpy as np\n", + "from autograd import grad, elementwise_grad\n", + "import autograd.numpy.random as npr\n", + "from matplotlib import pyplot as plt\n", + "\n", + "def sigmoid(z):\n", + " return 1/(1 + np.exp(-z))\n", + "\n", + "def deep_neural_network(deep_params, x):\n", + " # N_hidden is the number of hidden layers\n", + " N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer\n", + "\n", + " # Assumes input x being an one-dimensional array\n", + " num_values = np.size(x)\n", + " x = x.reshape(-1, num_values)\n", + "\n", + " # Assume that the input layer does nothing to the input x\n", + " x_input = x\n", + "\n", + " # Due to multiple hidden layers, define a variable referencing to the\n", + " # output of the previous layer:\n", + " x_prev = x_input\n", + "\n", + " ## Hidden layers:\n", + "\n", + " for l in range(N_hidden):\n", + " # From the list of parameters P; find the correct weigths and bias for this layer\n", + " w_hidden = deep_params[l]\n", + "\n", + " # Add a row of ones to include bias\n", + " x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0)\n", + "\n", + " z_hidden = np.matmul(w_hidden, x_prev)\n", + " x_hidden = sigmoid(z_hidden)\n", + "\n", + " # Update x_prev such that next layer can use the output from this layer\n", + " x_prev = x_hidden\n", + "\n", + " ## Output layer:\n", + "\n", + " # Get the weights and bias for this layer\n", + " w_output = deep_params[-1]\n", + "\n", + " # Include bias:\n", + " x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0)\n", + "\n", + " z_output = np.matmul(w_output, x_prev)\n", + " x_output = z_output\n", + "\n", + " return x_output\n", + "\n", + "def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb):\n", + " # num_hidden_neurons is now a list of number of neurons within each hidden layer\n", + "\n", + " # Find the number of hidden layers:\n", + " N_hidden = np.size(num_neurons)\n", + "\n", + " ## Set up initial weigths and biases\n", + "\n", + " # Initialize the list of parameters:\n", + " P = [None]*(N_hidden + 1) # + 1 to include the output layer\n", + "\n", + " P[0] = npr.randn(num_neurons[0], 2 )\n", + " for l in range(1,N_hidden):\n", + " P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias\n", + "\n", + " # For the output layer\n", + " P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included\n", + "\n", + " print('Initial cost: %g'%cost_function_deep(P, x))\n", + "\n", + " ## Start finding the optimal weigths using gradient descent\n", + "\n", + " # Find the Python function that represents the gradient of the cost function\n", + " # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer\n", + " cost_function_deep_grad = grad(cost_function_deep,0)\n", + "\n", + " # Let the update be done num_iter times\n", + " for i in range(num_iter):\n", + " # Evaluate the gradient at the current weights and biases in P.\n", + " # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases\n", + " # in the hidden layers and output layers evaluated at x.\n", + " cost_deep_grad = cost_function_deep_grad(P, x)\n", + "\n", + " for l in range(N_hidden+1):\n", + " P[l] = P[l] - lmb * cost_deep_grad[l]\n", + "\n", + " print('Final cost: %g'%cost_function_deep(P, x))\n", + "\n", + " return P\n", + "\n", + "## Set up the cost function specified for this Poisson equation:\n", + "\n", + "# The right side of the ODE\n", + "def f(x):\n", + " return (3*x + x**2)*np.exp(x)\n", + "\n", + "def cost_function_deep(P, x):\n", + "\n", + " # Evaluate the trial function with the current parameters P\n", + " g_t = g_trial_deep(x,P)\n", + "\n", + " # Find the derivative w.r.t x of the trial function\n", + " d2_g_t = elementwise_grad(elementwise_grad(g_trial_deep,0))(x,P)\n", + "\n", + " right_side = f(x)\n", + "\n", + " err_sqr = (-d2_g_t - right_side)**2\n", + " cost_sum = np.sum(err_sqr)\n", + "\n", + " return cost_sum/np.size(err_sqr)\n", + "\n", + "# The trial solution:\n", + "def g_trial_deep(x,P):\n", + " return x*(1-x)*deep_neural_network(P,x)\n", + "\n", + "# The analytic solution;\n", + "def g_analytic(x):\n", + " return x*(1-x)*np.exp(x)\n", + "\n", + "if __name__ == '__main__':\n", + " npr.seed(4155)\n", + "\n", + " ## Decide the vales of arguments to the function to solve\n", + " Nx = 10\n", + " x = np.linspace(0,1, Nx)\n", + "\n", + " ## Set up the initial parameters\n", + " num_hidden_neurons = [200,100]\n", + " num_iter = 1000\n", + " lmb = 1e-3\n", + "\n", + " P = solve_ode_deep_neural_network(x, num_hidden_neurons, num_iter, lmb)\n", + "\n", + " g_dnn_ag = g_trial_deep(x,P)\n", + " g_analytical = g_analytic(x)\n", + "\n", + " # Find the maximum absolute difference between the solutons:\n", + "\n", + " plt.figure(figsize=(10,10))\n", + "\n", + " plt.title('Performance of neural network solving an ODE compared to the analytical solution')\n", + " plt.plot(x, g_analytical)\n", + " plt.plot(x, g_dnn_ag[0,:])\n", + " plt.legend(['analytical','nn'])\n", + " plt.xlabel('x')\n", + " plt.ylabel('g(x)')\n", + "\n", + " ## Perform the computation using the numerical scheme\n", + "\n", + " dx = 1/(Nx - 1)\n", + "\n", + " # Set up the matrix A\n", + " A = np.zeros((Nx-2,Nx-2))\n", + "\n", + " A[0,0] = 2\n", + " A[0,1] = -1\n", + "\n", + " for i in range(1,Nx-3):\n", + " A[i,i-1] = -1\n", + " A[i,i] = 2\n", + " A[i,i+1] = -1\n", + "\n", + " A[Nx - 3, Nx - 4] = -1\n", + " A[Nx - 3, Nx - 3] = 2\n", + "\n", + " # Set up the vector f\n", + " f_vec = dx**2 * f(x[1:-1])\n", + "\n", + " # Solve the equation\n", + " g_res = np.linalg.solve(A,f_vec)\n", + "\n", + " g_vec = np.zeros(Nx)\n", + " g_vec[1:-1] = g_res\n", + "\n", + " # Print the differences between each method\n", + " max_diff1 = np.max(np.abs(g_dnn_ag - g_analytical))\n", + " max_diff2 = np.max(np.abs(g_vec - g_analytical))\n", + " print(\"The max absolute difference between the analytical solution and DNN Autograd: %g\"%max_diff1)\n", + " print(\"The max absolute difference between the analytical solution and numerical scheme: %g\"%max_diff2)\n", + "\n", + " # Plot the results\n", + " plt.figure(figsize=(10,10))\n", + "\n", + " plt.plot(x,g_vec)\n", + " plt.plot(x,g_analytical)\n", + " plt.plot(x,g_dnn_ag[0,:])\n", + "\n", + " plt.legend(['numerical scheme','analytical','dnn'])\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "4b05b79c", + "metadata": { + "editable": true + }, + "source": [ + "## Partial Differential Equations\n", + "\n", + "A partial differential equation (PDE) has a solution here the function\n", + "is defined by multiple variables. The equation may involve all kinds\n", + "of combinations of which variables the function is differentiated with\n", + "respect to.\n", + "\n", + "In general, a partial differential equation for a function $g(x_1,\\dots,x_N)$ with $N$ variables may be expressed as" + ] + }, + { + "cell_type": "markdown", + "id": "0f1b8d34", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{PDE} \\tag{17}\n", + " f\\left(x_1, \\, \\dots \\, , x_N, \\frac{\\partial g(x_1,\\dots,x_N) }{\\partial x_1}, \\dots , \\frac{\\partial g(x_1,\\dots,x_N) }{\\partial x_N}, \\frac{\\partial g(x_1,\\dots,x_N) }{\\partial x_1\\partial x_2}, \\, \\dots \\, , \\frac{\\partial^n g(x_1,\\dots,x_N) }{\\partial x_N^n} \\right) = 0\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "358a4063", + "metadata": { + "editable": true + }, + "source": [ + "where $f$ is an expression involving all kinds of possible mixed derivatives of $g(x_1,\\dots,x_N)$ up to an order $n$. In order for the solution to be unique, some additional conditions must also be given." + ] + }, + { + "cell_type": "markdown", + "id": "e4009b2b", + "metadata": { + "editable": true + }, + "source": [ + "## Type of problem\n", + "\n", + "The problem our network must solve for, is similar to the ODE case.\n", + "We must have a trial solution $g_t$ at hand.\n", + "\n", + "For instance, the trial solution could be expressed as" + ] + }, + { + "cell_type": "markdown", + "id": "c5a9ee8a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{align*}\n", + " g_t(x_1,\\dots,x_N) = h_1(x_1,\\dots,x_N) + h_2(x_1,\\dots,x_N,N(x_1,\\dots,x_N,P))\n", + "\\end{align*}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b300ac7d", + "metadata": { + "editable": true + }, + "source": [ + "where $h_1(x_1,\\dots,x_N)$ is a function that ensures $g_t(x_1,\\dots,x_N)$ satisfies some given conditions.\n", + "The neural network $N(x_1,\\dots,x_N,P)$ has weights and biases described by $P$ and $h_2(x_1,\\dots,x_N,N(x_1,\\dots,x_N,P))$ is an expression using the output from the neural network in some way.\n", + "\n", + "The role of the function $h_2(x_1,\\dots,x_N,N(x_1,\\dots,x_N,P))$, is to ensure that the output of $N(x_1,\\dots,x_N,P)$ is zero when $g_t(x_1,\\dots,x_N)$ is evaluated at the values of $x_1,\\dots,x_N$ where the given conditions must be satisfied. The function $h_1(x_1,\\dots,x_N)$ should alone make $g_t(x_1,\\dots,x_N)$ satisfy the conditions." + ] + }, + { + "cell_type": "markdown", + "id": "ee3d4dba", + "metadata": { + "editable": true + }, + "source": [ + "## Network requirements\n", + "\n", + "The network tries then the minimize the cost function following the\n", + "same ideas as described for the ODE case, but now with more than one\n", + "variables to consider. The concept still remains the same; find a set\n", + "of parameters $P$ such that the expression $f$ in ([17](#PDE)) is as\n", + "close to zero as possible.\n", + "\n", + "As for the ODE case, the cost function is the mean squared error that\n", + "the network must try to minimize. The cost function for the network to\n", + "minimize is" + ] + }, + { + "cell_type": "markdown", + "id": "73ef05ff", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "C\\left(x_1, \\dots, x_N, P\\right) = \\left( f\\left(x_1, \\, \\dots \\, , x_N, \\frac{\\partial g(x_1,\\dots,x_N) }{\\partial x_1}, \\dots , \\frac{\\partial g(x_1,\\dots,x_N) }{\\partial x_N}, \\frac{\\partial g(x_1,\\dots,x_N) }{\\partial x_1\\partial x_2}, \\, \\dots \\, , \\frac{\\partial^n g(x_1,\\dots,x_N) }{\\partial x_N^n} \\right) \\right)^2\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "bc7a6597", + "metadata": { + "editable": true + }, + "source": [ + "## More details\n", + "\n", + "If we let $\\boldsymbol{x} = \\big( x_1, \\dots, x_N \\big)$ be an array containing the values for $x_1, \\dots, x_N$ respectively, the cost function can be reformulated into the following:" + ] + }, + { + "cell_type": "markdown", + "id": "a158dec6", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "C\\left(\\boldsymbol{x}, P\\right) = f\\left( \\left( \\boldsymbol{x}, \\frac{\\partial g(\\boldsymbol{x}) }{\\partial x_1}, \\dots , \\frac{\\partial g(\\boldsymbol{x}) }{\\partial x_N}, \\frac{\\partial g(\\boldsymbol{x}) }{\\partial x_1\\partial x_2}, \\, \\dots \\, , \\frac{\\partial^n g(\\boldsymbol{x}) }{\\partial x_N^n} \\right) \\right)^2\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "6cbfa1b1", + "metadata": { + "editable": true + }, + "source": [ + "If we also have $M$ different sets of values for $x_1, \\dots, x_N$, that is $\\boldsymbol{x}_i = \\big(x_1^{(i)}, \\dots, x_N^{(i)}\\big)$ for $i = 1,\\dots,M$ being the rows in matrix $X$, the cost function can be generalized into" + ] + }, + { + "cell_type": "markdown", + "id": "a3af3492", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "C\\left(X, P \\right) = \\sum_{i=1}^M f\\left( \\left( \\boldsymbol{x}_i, \\frac{\\partial g(\\boldsymbol{x}_i) }{\\partial x_1}, \\dots , \\frac{\\partial g(\\boldsymbol{x}_i) }{\\partial x_N}, \\frac{\\partial g(\\boldsymbol{x}_i) }{\\partial x_1\\partial x_2}, \\, \\dots \\, , \\frac{\\partial^n g(\\boldsymbol{x}_i) }{\\partial x_N^n} \\right) \\right)^2.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ccd61199", + "metadata": { + "editable": true + }, + "source": [ + "## Example: The diffusion equation\n", + "\n", + "In one spatial dimension, the equation reads" + ] + }, + { + "cell_type": "markdown", + "id": "dc36a5cb", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial g(x,t)}{\\partial t} = \\frac{\\partial^2 g(x,t)}{\\partial x^2}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "a8b26da0", + "metadata": { + "editable": true + }, + "source": [ + "where a possible choice of conditions are" + ] + }, + { + "cell_type": "markdown", + "id": "41406843", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{align*}\n", + "g(0,t) &= 0 ,\\qquad t \\geq 0 \\\\\n", + "g(1,t) &= 0, \\qquad t \\geq 0 \\\\\n", + "g(x,0) &= u(x),\\qquad x\\in [0,1]\n", + "\\end{align*}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f45dd83f", + "metadata": { + "editable": true + }, + "source": [ + "with $u(x)$ being some given function." + ] + }, + { + "cell_type": "markdown", + "id": "e30bdb98", + "metadata": { + "editable": true + }, + "source": [ + "## Defining the problem\n", + "\n", + "For this case, we want to find $g(x,t)$ such that" + ] + }, + { + "cell_type": "markdown", + "id": "f9cdb4e5", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation}\n", + " \\frac{\\partial g(x,t)}{\\partial t} = \\frac{\\partial^2 g(x,t)}{\\partial x^2}\n", + "\\end{equation} \\label{diffonedim} \\tag{18}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "16dc73b3", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "ee4dbc98", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{align*}\n", + "g(0,t) &= 0 ,\\qquad t \\geq 0 \\\\\n", + "g(1,t) &= 0, \\qquad t \\geq 0 \\\\\n", + "g(x,0) &= u(x),\\qquad x\\in [0,1]\n", + "\\end{align*}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "13748484", + "metadata": { + "editable": true + }, + "source": [ + "with $u(x) = \\sin(\\pi x)$.\n", + "\n", + "First, let us set up the deep neural network.\n", + "The deep neural network will follow the same structure as discussed in the examples solving the ODEs.\n", + "First, we will look into how Autograd could be used in a network tailored to solve for bivariate functions." + ] + }, + { + "cell_type": "markdown", + "id": "4b26b938", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the network using Autograd\n", + "\n", + "The only change to do here, is to extend our network such that\n", + "functions of multiple parameters are correctly handled. In this case\n", + "we have two variables in our function to solve for, that is time $t$\n", + "and position $x$. The variables will be represented by a\n", + "one-dimensional array in the program. The program will evaluate the\n", + "network at each possible pair $(x,t)$, given an array for the desired\n", + "$x$-values and $t$-values to approximate the solution at." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "9e3bba2f", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "def sigmoid(z):\n", + " return 1/(1 + np.exp(-z))\n", + "\n", + "def deep_neural_network(deep_params, x):\n", + " # x is now a point and a 1D numpy array; make it a column vector\n", + " num_coordinates = np.size(x,0)\n", + " x = x.reshape(num_coordinates,-1)\n", + "\n", + " num_points = np.size(x,1)\n", + "\n", + " # N_hidden is the number of hidden layers\n", + " N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer\n", + "\n", + " # Assume that the input layer does nothing to the input x\n", + " x_input = x\n", + " x_prev = x_input\n", + "\n", + " ## Hidden layers:\n", + "\n", + " for l in range(N_hidden):\n", + " # From the list of parameters P; find the correct weigths and bias for this layer\n", + " w_hidden = deep_params[l]\n", + "\n", + " # Add a row of ones to include bias\n", + " x_prev = np.concatenate((np.ones((1,num_points)), x_prev ), axis = 0)\n", + "\n", + " z_hidden = np.matmul(w_hidden, x_prev)\n", + " x_hidden = sigmoid(z_hidden)\n", + "\n", + " # Update x_prev such that next layer can use the output from this layer\n", + " x_prev = x_hidden\n", + "\n", + " ## Output layer:\n", + "\n", + " # Get the weights and bias for this layer\n", + " w_output = deep_params[-1]\n", + "\n", + " # Include bias:\n", + " x_prev = np.concatenate((np.ones((1,num_points)), x_prev), axis = 0)\n", + "\n", + " z_output = np.matmul(w_output, x_prev)\n", + " x_output = z_output\n", + "\n", + " return x_output[0][0]" + ] + }, + { + "cell_type": "markdown", + "id": "c4fffb7e", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the network using Autograd; The trial solution\n", + "\n", + "The cost function must then iterate through the given arrays\n", + "containing values for $x$ and $t$, defines a point $(x,t)$ the deep\n", + "neural network and the trial solution is evaluated at, and then finds\n", + "the Jacobian of the trial solution.\n", + "\n", + "A possible trial solution for this PDE is\n", + "\n", + "$$\n", + "g_t(x,t) = h_1(x,t) + x(1-x)tN(x,t,P)\n", + "$$\n", + "\n", + "with $A(x,t)$ being a function ensuring that $g_t(x,t)$ satisfies our given conditions, and $N(x,t,P)$ being the output from the deep neural network using weights and biases for each layer from $P$.\n", + "\n", + "To fulfill the conditions, $A(x,t)$ could be:\n", + "\n", + "$$\n", + "h_1(x,t) = (1-t)\\Big(u(x) - \\big((1-x)u(0) + x u(1)\\big)\\Big) = (1-t)u(x) = (1-t)\\sin(\\pi x)\n", + "$$\n", + "since $(0) = u(1) = 0$ and $u(x) = \\sin(\\pi x)$." + ] + }, + { + "cell_type": "markdown", + "id": "3ee8799d", + "metadata": { + "editable": true + }, + "source": [ + "## Why the jacobian?\n", + "\n", + "The Jacobian is used because the program must find the derivative of\n", + "the trial solution with respect to $x$ and $t$.\n", + "\n", + "This gives the necessity of computing the Jacobian matrix, as we want\n", + "to evaluate the gradient with respect to $x$ and $t$ (note that the\n", + "Jacobian of a scalar-valued multivariate function is simply its\n", + "gradient).\n", + "\n", + "In Autograd, the differentiation is by default done with respect to\n", + "the first input argument of your Python function. Since the points is\n", + "an array representing $x$ and $t$, the Jacobian is calculated using\n", + "the values of $x$ and $t$.\n", + "\n", + "To find the second derivative with respect to $x$ and $t$, the\n", + "Jacobian can be found for the second time. The result is a Hessian\n", + "matrix, which is the matrix containing all the possible second order\n", + "mixed derivatives of $g(x,t)$." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "8a2377ff", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# Set up the trial function:\n", + "def u(x):\n", + " return np.sin(np.pi*x)\n", + "\n", + "def g_trial(point,P):\n", + " x,t = point\n", + " return (1-t)*u(x) + x*(1-x)*t*deep_neural_network(P,point)\n", + "\n", + "# The right side of the ODE:\n", + "def f(point):\n", + " return 0.\n", + "\n", + "# The cost function:\n", + "def cost_function(P, x, t):\n", + " cost_sum = 0\n", + "\n", + " g_t_jacobian_func = jacobian(g_trial)\n", + " g_t_hessian_func = hessian(g_trial)\n", + "\n", + " for x_ in x:\n", + " for t_ in t:\n", + " point = np.array([x_,t_])\n", + "\n", + " g_t = g_trial(point,P)\n", + " g_t_jacobian = g_t_jacobian_func(point,P)\n", + " g_t_hessian = g_t_hessian_func(point,P)\n", + "\n", + " g_t_dt = g_t_jacobian[1]\n", + " g_t_d2x = g_t_hessian[0][0]\n", + "\n", + " func = f(point)\n", + "\n", + " err_sqr = ( (g_t_dt - g_t_d2x) - func)**2\n", + " cost_sum += err_sqr\n", + "\n", + " return cost_sum" + ] + }, + { + "cell_type": "markdown", + "id": "8dbd62e1", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the network using Autograd; The full program\n", + "\n", + "Having set up the network, along with the trial solution and cost function, we can now see how the deep neural network performs by comparing the results to the analytical solution.\n", + "\n", + "The analytical solution of our problem is\n", + "\n", + "$$\n", + "g(x,t) = \\exp(-\\pi^2 t)\\sin(\\pi x)\n", + "$$\n", + "\n", + "A possible way to implement a neural network solving the PDE, is given below.\n", + "Be aware, though, that it is fairly slow for the parameters used.\n", + "A better result is possible, but requires more iterations, and thus longer time to complete.\n", + "\n", + "Indeed, the program below is not optimal in its implementation, but rather serves as an example on how to implement and use a neural network to solve a PDE.\n", + "Using TensorFlow results in a much better execution time. Try it!" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "61b77dd3", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "import autograd.numpy as np\n", + "from autograd import jacobian,hessian,grad\n", + "import autograd.numpy.random as npr\n", + "from matplotlib import cm\n", + "from matplotlib import pyplot as plt\n", + "from mpl_toolkits.mplot3d import axes3d\n", + "\n", + "## Set up the network\n", + "\n", + "def sigmoid(z):\n", + " return 1/(1 + np.exp(-z))\n", + "\n", + "def deep_neural_network(deep_params, x):\n", + " # x is now a point and a 1D numpy array; make it a column vector\n", + " num_coordinates = np.size(x,0)\n", + " x = x.reshape(num_coordinates,-1)\n", + "\n", + " num_points = np.size(x,1)\n", + "\n", + " # N_hidden is the number of hidden layers\n", + " N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer\n", + "\n", + " # Assume that the input layer does nothing to the input x\n", + " x_input = x\n", + " x_prev = x_input\n", + "\n", + " ## Hidden layers:\n", + "\n", + " for l in range(N_hidden):\n", + " # From the list of parameters P; find the correct weigths and bias for this layer\n", + " w_hidden = deep_params[l]\n", + "\n", + " # Add a row of ones to include bias\n", + " x_prev = np.concatenate((np.ones((1,num_points)), x_prev ), axis = 0)\n", + "\n", + " z_hidden = np.matmul(w_hidden, x_prev)\n", + " x_hidden = sigmoid(z_hidden)\n", + "\n", + " # Update x_prev such that next layer can use the output from this layer\n", + " x_prev = x_hidden\n", + "\n", + " ## Output layer:\n", + "\n", + " # Get the weights and bias for this layer\n", + " w_output = deep_params[-1]\n", + "\n", + " # Include bias:\n", + " x_prev = np.concatenate((np.ones((1,num_points)), x_prev), axis = 0)\n", + "\n", + " z_output = np.matmul(w_output, x_prev)\n", + " x_output = z_output\n", + "\n", + " return x_output[0][0]\n", + "\n", + "## Define the trial solution and cost function\n", + "def u(x):\n", + " return np.sin(np.pi*x)\n", + "\n", + "def g_trial(point,P):\n", + " x,t = point\n", + " return (1-t)*u(x) + x*(1-x)*t*deep_neural_network(P,point)\n", + "\n", + "# The right side of the ODE:\n", + "def f(point):\n", + " return 0.\n", + "\n", + "# The cost function:\n", + "def cost_function(P, x, t):\n", + " cost_sum = 0\n", + "\n", + " g_t_jacobian_func = jacobian(g_trial)\n", + " g_t_hessian_func = hessian(g_trial)\n", + "\n", + " for x_ in x:\n", + " for t_ in t:\n", + " point = np.array([x_,t_])\n", + "\n", + " g_t = g_trial(point,P)\n", + " g_t_jacobian = g_t_jacobian_func(point,P)\n", + " g_t_hessian = g_t_hessian_func(point,P)\n", + "\n", + " g_t_dt = g_t_jacobian[1]\n", + " g_t_d2x = g_t_hessian[0][0]\n", + "\n", + " func = f(point)\n", + "\n", + " err_sqr = ( (g_t_dt - g_t_d2x) - func)**2\n", + " cost_sum += err_sqr\n", + "\n", + " return cost_sum /( np.size(x)*np.size(t) )\n", + "\n", + "## For comparison, define the analytical solution\n", + "def g_analytic(point):\n", + " x,t = point\n", + " return np.exp(-np.pi**2*t)*np.sin(np.pi*x)\n", + "\n", + "## Set up a function for training the network to solve for the equation\n", + "def solve_pde_deep_neural_network(x,t, num_neurons, num_iter, lmb):\n", + " ## Set up initial weigths and biases\n", + " N_hidden = np.size(num_neurons)\n", + "\n", + " ## Set up initial weigths and biases\n", + "\n", + " # Initialize the list of parameters:\n", + " P = [None]*(N_hidden + 1) # + 1 to include the output layer\n", + "\n", + " P[0] = npr.randn(num_neurons[0], 2 + 1 ) # 2 since we have two points, +1 to include bias\n", + " for l in range(1,N_hidden):\n", + " P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias\n", + "\n", + " # For the output layer\n", + " P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included\n", + "\n", + " print('Initial cost: ',cost_function(P, x, t))\n", + "\n", + " cost_function_grad = grad(cost_function,0)\n", + "\n", + " # Let the update be done num_iter times\n", + " for i in range(num_iter):\n", + " cost_grad = cost_function_grad(P, x , t)\n", + "\n", + " for l in range(N_hidden+1):\n", + " P[l] = P[l] - lmb * cost_grad[l]\n", + "\n", + " print('Final cost: ',cost_function(P, x, t))\n", + "\n", + " return P\n", + "\n", + "if __name__ == '__main__':\n", + " ### Use the neural network:\n", + " npr.seed(15)\n", + "\n", + " ## Decide the vales of arguments to the function to solve\n", + " Nx = 10; Nt = 10\n", + " x = np.linspace(0, 1, Nx)\n", + " t = np.linspace(0,1,Nt)\n", + "\n", + " ## Set up the parameters for the network\n", + " num_hidden_neurons = [100, 25]\n", + " num_iter = 250\n", + " lmb = 0.01\n", + "\n", + " P = solve_pde_deep_neural_network(x,t, num_hidden_neurons, num_iter, lmb)\n", + "\n", + " ## Store the results\n", + " g_dnn_ag = np.zeros((Nx, Nt))\n", + " G_analytical = np.zeros((Nx, Nt))\n", + " for i,x_ in enumerate(x):\n", + " for j, t_ in enumerate(t):\n", + " point = np.array([x_, t_])\n", + " g_dnn_ag[i,j] = g_trial(point,P)\n", + "\n", + " G_analytical[i,j] = g_analytic(point)\n", + "\n", + " # Find the map difference between the analytical and the computed solution\n", + " diff_ag = np.abs(g_dnn_ag - G_analytical)\n", + " print('Max absolute difference between the analytical solution and the network: %g'%np.max(diff_ag))\n", + "\n", + " ## Plot the solutions in two dimensions, that being in position and time\n", + "\n", + " T,X = np.meshgrid(t,x)\n", + "\n", + " fig = plt.figure(figsize=(10,10))\n", + " ax = fig.gca(projection='3d')\n", + " ax.set_title('Solution from the deep neural network w/ %d layer'%len(num_hidden_neurons))\n", + " s = ax.plot_surface(T,X,g_dnn_ag,linewidth=0,antialiased=False,cmap=cm.viridis)\n", + " ax.set_xlabel('Time $t$')\n", + " ax.set_ylabel('Position $x$');\n", + "\n", + "\n", + " fig = plt.figure(figsize=(10,10))\n", + " ax = fig.gca(projection='3d')\n", + " ax.set_title('Analytical solution')\n", + " s = ax.plot_surface(T,X,G_analytical,linewidth=0,antialiased=False,cmap=cm.viridis)\n", + " ax.set_xlabel('Time $t$')\n", + " ax.set_ylabel('Position $x$');\n", + "\n", + " fig = plt.figure(figsize=(10,10))\n", + " ax = fig.gca(projection='3d')\n", + " ax.set_title('Difference')\n", + " s = ax.plot_surface(T,X,diff_ag,linewidth=0,antialiased=False,cmap=cm.viridis)\n", + " ax.set_xlabel('Time $t$')\n", + " ax.set_ylabel('Position $x$');\n", + "\n", + " ## Take some slices of the 3D plots just to see the solutions at particular times\n", + " indx1 = 0\n", + " indx2 = int(Nt/2)\n", + " indx3 = Nt-1\n", + "\n", + " t1 = t[indx1]\n", + " t2 = t[indx2]\n", + " t3 = t[indx3]\n", + "\n", + " # Slice the results from the DNN\n", + " res1 = g_dnn_ag[:,indx1]\n", + " res2 = g_dnn_ag[:,indx2]\n", + " res3 = g_dnn_ag[:,indx3]\n", + "\n", + " # Slice the analytical results\n", + " res_analytical1 = G_analytical[:,indx1]\n", + " res_analytical2 = G_analytical[:,indx2]\n", + " res_analytical3 = G_analytical[:,indx3]\n", + "\n", + " # Plot the slices\n", + " plt.figure(figsize=(10,10))\n", + " plt.title(\"Computed solutions at time = %g\"%t1)\n", + " plt.plot(x, res1)\n", + " plt.plot(x,res_analytical1)\n", + " plt.legend(['dnn','analytical'])\n", + "\n", + " plt.figure(figsize=(10,10))\n", + " plt.title(\"Computed solutions at time = %g\"%t2)\n", + " plt.plot(x, res2)\n", + " plt.plot(x,res_analytical2)\n", + " plt.legend(['dnn','analytical'])\n", + "\n", + " plt.figure(figsize=(10,10))\n", + " plt.title(\"Computed solutions at time = %g\"%t3)\n", + " plt.plot(x, res3)\n", + " plt.plot(x,res_analytical3)\n", + " plt.legend(['dnn','analytical'])\n", + "\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "41169c76", + "metadata": { + "editable": true + }, + "source": [ + "## Example: Solving the wave equation with Neural Networks\n", + "\n", + "The wave equation is" + ] + }, + { + "cell_type": "markdown", + "id": "3bc273de", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial^2 g(x,t)}{\\partial t^2} = c^2\\frac{\\partial^2 g(x,t)}{\\partial x^2}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "37896dc3", + "metadata": { + "editable": true + }, + "source": [ + "with $c$ being the specified wave speed.\n", + "\n", + "Here, the chosen conditions are" + ] + }, + { + "cell_type": "markdown", + "id": "09477c51", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{align*}\n", + "\tg(0,t) &= 0 \\\\\n", + "\tg(1,t) &= 0 \\\\\n", + "\tg(x,0) &= u(x) \\\\\n", + "\t\\frac{\\partial g(x,t)}{\\partial t} \\Big |_{t = 0} &= v(x)\n", + "\\end{align*}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "93579057", + "metadata": { + "editable": true + }, + "source": [ + "where $\\frac{\\partial g(x,t)}{\\partial t} \\Big |_{t = 0}$ means the derivative of $g(x,t)$ with respect to $t$ is evaluated at $t = 0$, and $u(x)$ and $v(x)$ being given functions." + ] + }, + { + "cell_type": "markdown", + "id": "dcbb82f6", + "metadata": { + "editable": true + }, + "source": [ + "## The problem to solve for\n", + "\n", + "The wave equation to solve for, is" + ] + }, + { + "cell_type": "markdown", + "id": "f91e973a", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \\label{wave} \\tag{19}\n", + "\\frac{\\partial^2 g(x,t)}{\\partial t^2} = c^2 \\frac{\\partial^2 g(x,t)}{\\partial x^2}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e13ab50c", + "metadata": { + "editable": true + }, + "source": [ + "where $c$ is the given wave speed.\n", + "The chosen conditions for this equation are" + ] + }, + { + "cell_type": "markdown", + "id": "fca02e71", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "g(0,t) &= 0, &t \\geq 0 \\\\\n", + "g(1,t) &= 0, &t \\geq 0 \\\\\n", + "g(x,0) &= u(x), &x\\in[0,1] \\\\\n", + "\\frac{\\partial g(x,t)}{\\partial t}\\Big |_{t = 0} &= v(x), &x \\in [0,1]\n", + "\\end{aligned} \\label{condwave} \\tag{20}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4bb32ee3", + "metadata": { + "editable": true + }, + "source": [ + "In this example, let $c = 1$ and $u(x) = \\sin(\\pi x)$ and $v(x) = -\\pi\\sin(\\pi x)$." + ] + }, + { + "cell_type": "markdown", + "id": "feea59f2", + "metadata": { + "editable": true + }, + "source": [ + "## The trial solution\n", + "Setting up the network is done in similar matter as for the example of solving the diffusion equation.\n", + "The only things we have to change, is the trial solution such that it satisfies the conditions from ([20](#condwave)) and the cost function.\n", + "\n", + "The trial solution becomes slightly different since we have other conditions than in the example of solving the diffusion equation. Here, a possible trial solution $g_t(x,t)$ is\n", + "\n", + "$$\n", + "g_t(x,t) = h_1(x,t) + x(1-x)t^2N(x,t,P)\n", + "$$\n", + "\n", + "where\n", + "\n", + "$$\n", + "h_1(x,t) = (1-t^2)u(x) + tv(x)\n", + "$$\n", + "\n", + "Note that this trial solution satisfies the conditions only if $u(0) = v(0) = u(1) = v(1) = 0$, which is the case in this example." + ] + }, + { + "cell_type": "markdown", + "id": "880753aa", + "metadata": { + "editable": true + }, + "source": [ + "## The analytical solution\n", + "\n", + "The analytical solution for our specific problem, is\n", + "\n", + "$$\n", + "g(x,t) = \\sin(\\pi x)\\cos(\\pi t) - \\sin(\\pi x)\\sin(\\pi t)\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "42a69cb7", + "metadata": { + "editable": true + }, + "source": [ + "## Solving the wave equation - the full program using Autograd" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "1b321e14", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "import autograd.numpy as np\n", + "from autograd import hessian,grad\n", + "import autograd.numpy.random as npr\n", + "from matplotlib import cm\n", + "from matplotlib import pyplot as plt\n", + "from mpl_toolkits.mplot3d import axes3d\n", + "\n", + "## Set up the trial function:\n", + "def u(x):\n", + " return np.sin(np.pi*x)\n", + "\n", + "def v(x):\n", + " return -np.pi*np.sin(np.pi*x)\n", + "\n", + "def h1(point):\n", + " x,t = point\n", + " return (1 - t**2)*u(x) + t*v(x)\n", + "\n", + "def g_trial(point,P):\n", + " x,t = point\n", + " return h1(point) + x*(1-x)*t**2*deep_neural_network(P,point)\n", + "\n", + "## Define the cost function\n", + "def cost_function(P, x, t):\n", + " cost_sum = 0\n", + "\n", + " g_t_hessian_func = hessian(g_trial)\n", + "\n", + " for x_ in x:\n", + " for t_ in t:\n", + " point = np.array([x_,t_])\n", + "\n", + " g_t_hessian = g_t_hessian_func(point,P)\n", + "\n", + " g_t_d2x = g_t_hessian[0][0]\n", + " g_t_d2t = g_t_hessian[1][1]\n", + "\n", + " err_sqr = ( (g_t_d2t - g_t_d2x) )**2\n", + " cost_sum += err_sqr\n", + "\n", + " return cost_sum / (np.size(t) * np.size(x))\n", + "\n", + "## The neural network\n", + "def sigmoid(z):\n", + " return 1/(1 + np.exp(-z))\n", + "\n", + "def deep_neural_network(deep_params, x):\n", + " # x is now a point and a 1D numpy array; make it a column vector\n", + " num_coordinates = np.size(x,0)\n", + " x = x.reshape(num_coordinates,-1)\n", + "\n", + " num_points = np.size(x,1)\n", + "\n", + " # N_hidden is the number of hidden layers\n", + " N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer\n", + "\n", + " # Assume that the input layer does nothing to the input x\n", + " x_input = x\n", + " x_prev = x_input\n", + "\n", + " ## Hidden layers:\n", + "\n", + " for l in range(N_hidden):\n", + " # From the list of parameters P; find the correct weigths and bias for this layer\n", + " w_hidden = deep_params[l]\n", + "\n", + " # Add a row of ones to include bias\n", + " x_prev = np.concatenate((np.ones((1,num_points)), x_prev ), axis = 0)\n", + "\n", + " z_hidden = np.matmul(w_hidden, x_prev)\n", + " x_hidden = sigmoid(z_hidden)\n", + "\n", + " # Update x_prev such that next layer can use the output from this layer\n", + " x_prev = x_hidden\n", + "\n", + " ## Output layer:\n", + "\n", + " # Get the weights and bias for this layer\n", + " w_output = deep_params[-1]\n", + "\n", + " # Include bias:\n", + " x_prev = np.concatenate((np.ones((1,num_points)), x_prev), axis = 0)\n", + "\n", + " z_output = np.matmul(w_output, x_prev)\n", + " x_output = z_output\n", + "\n", + " return x_output[0][0]\n", + "\n", + "## The analytical solution\n", + "def g_analytic(point):\n", + " x,t = point\n", + " return np.sin(np.pi*x)*np.cos(np.pi*t) - np.sin(np.pi*x)*np.sin(np.pi*t)\n", + "\n", + "def solve_pde_deep_neural_network(x,t, num_neurons, num_iter, lmb):\n", + " ## Set up initial weigths and biases\n", + " N_hidden = np.size(num_neurons)\n", + "\n", + " ## Set up initial weigths and biases\n", + "\n", + " # Initialize the list of parameters:\n", + " P = [None]*(N_hidden + 1) # + 1 to include the output layer\n", + "\n", + " P[0] = npr.randn(num_neurons[0], 2 + 1 ) # 2 since we have two points, +1 to include bias\n", + " for l in range(1,N_hidden):\n", + " P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias\n", + "\n", + " # For the output layer\n", + " P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included\n", + "\n", + " print('Initial cost: ',cost_function(P, x, t))\n", + "\n", + " cost_function_grad = grad(cost_function,0)\n", + "\n", + " # Let the update be done num_iter times\n", + " for i in range(num_iter):\n", + " cost_grad = cost_function_grad(P, x , t)\n", + "\n", + " for l in range(N_hidden+1):\n", + " P[l] = P[l] - lmb * cost_grad[l]\n", + "\n", + "\n", + " print('Final cost: ',cost_function(P, x, t))\n", + "\n", + " return P\n", + "\n", + "if __name__ == '__main__':\n", + " ### Use the neural network:\n", + " npr.seed(15)\n", + "\n", + " ## Decide the vales of arguments to the function to solve\n", + " Nx = 10; Nt = 10\n", + " x = np.linspace(0, 1, Nx)\n", + " t = np.linspace(0,1,Nt)\n", + "\n", + " ## Set up the parameters for the network\n", + " num_hidden_neurons = [50,20]\n", + " num_iter = 1000\n", + " lmb = 0.01\n", + "\n", + " P = solve_pde_deep_neural_network(x,t, num_hidden_neurons, num_iter, lmb)\n", + "\n", + " ## Store the results\n", + " res = np.zeros((Nx, Nt))\n", + " res_analytical = np.zeros((Nx, Nt))\n", + " for i,x_ in enumerate(x):\n", + " for j, t_ in enumerate(t):\n", + " point = np.array([x_, t_])\n", + " res[i,j] = g_trial(point,P)\n", + "\n", + " res_analytical[i,j] = g_analytic(point)\n", + "\n", + " diff = np.abs(res - res_analytical)\n", + " print(\"Max difference between analytical and solution from nn: %g\"%np.max(diff))\n", + "\n", + " ## Plot the solutions in two dimensions, that being in position and time\n", + "\n", + " T,X = np.meshgrid(t,x)\n", + "\n", + " fig = plt.figure(figsize=(10,10))\n", + " ax = fig.gca(projection='3d')\n", + " ax.set_title('Solution from the deep neural network w/ %d layer'%len(num_hidden_neurons))\n", + " s = ax.plot_surface(T,X,res,linewidth=0,antialiased=False,cmap=cm.viridis)\n", + " ax.set_xlabel('Time $t$')\n", + " ax.set_ylabel('Position $x$');\n", + "\n", + "\n", + " fig = plt.figure(figsize=(10,10))\n", + " ax = fig.gca(projection='3d')\n", + " ax.set_title('Analytical solution')\n", + " s = ax.plot_surface(T,X,res_analytical,linewidth=0,antialiased=False,cmap=cm.viridis)\n", + " ax.set_xlabel('Time $t$')\n", + " ax.set_ylabel('Position $x$');\n", + "\n", + "\n", + " fig = plt.figure(figsize=(10,10))\n", + " ax = fig.gca(projection='3d')\n", + " ax.set_title('Difference')\n", + " s = ax.plot_surface(T,X,diff,linewidth=0,antialiased=False,cmap=cm.viridis)\n", + " ax.set_xlabel('Time $t$')\n", + " ax.set_ylabel('Position $x$');\n", + "\n", + " ## Take some slices of the 3D plots just to see the solutions at particular times\n", + " indx1 = 0\n", + " indx2 = int(Nt/2)\n", + " indx3 = Nt-1\n", + "\n", + " t1 = t[indx1]\n", + " t2 = t[indx2]\n", + " t3 = t[indx3]\n", + "\n", + " # Slice the results from the DNN\n", + " res1 = res[:,indx1]\n", + " res2 = res[:,indx2]\n", + " res3 = res[:,indx3]\n", + "\n", + " # Slice the analytical results\n", + " res_analytical1 = res_analytical[:,indx1]\n", + " res_analytical2 = res_analytical[:,indx2]\n", + " res_analytical3 = res_analytical[:,indx3]\n", + "\n", + " # Plot the slices\n", + " plt.figure(figsize=(10,10))\n", + " plt.title(\"Computed solutions at time = %g\"%t1)\n", + " plt.plot(x, res1)\n", + " plt.plot(x,res_analytical1)\n", + " plt.legend(['dnn','analytical'])\n", + "\n", + " plt.figure(figsize=(10,10))\n", + " plt.title(\"Computed solutions at time = %g\"%t2)\n", + " plt.plot(x, res2)\n", + " plt.plot(x,res_analytical2)\n", + " plt.legend(['dnn','analytical'])\n", + "\n", + " plt.figure(figsize=(10,10))\n", + " plt.title(\"Computed solutions at time = %g\"%t3)\n", + " plt.plot(x, res3)\n", + " plt.plot(x,res_analytical3)\n", + " plt.legend(['dnn','analytical'])\n", + "\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c81c7c8a", + "metadata": { + "editable": true + }, + "source": [ + "## Resources on differential equations and deep learning\n", + "\n", + "1. [Artificial neural networks for solving ordinary and partial differential equations by I.E. Lagaris et al](https://pdfs.semanticscholar.org/d061/df393e0e8fbfd0ea24976458b7d42419040d.pdf)\n", + "\n", + "2. [Neural networks for solving differential equations by A. Honchar](https://becominghuman.ai/neural-networks-for-solving-differential-equations-fa230ac5e04c)\n", + "\n", + "3. [Solving differential equations using neural networks by M.M Chiaramonte and M. Kiener](http://cs229.stanford.edu/proj2013/ChiaramonteKiener-SolvingDifferentialEquationsUsingNeuralNetworks.pdf)\n", + "\n", + "4. [Introduction to Partial Differential Equations by A. Tveito, R. Winther](https://www.springer.com/us/book/9783540225515)" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/doc/LectureNotes/_build/jupyter_execute/week43.py b/doc/LectureNotes/_build/jupyter_execute/week43.py new file mode 100644 index 000000000..1ceb69343 --- /dev/null +++ b/doc/LectureNotes/_build/jupyter_execute/week43.py @@ -0,0 +1,4183 @@ +#!/usr/bin/env python +# coding: utf-8 + +# +# + +# # Week 43: Deep Learning: Constructing a Neural Network code and solving differential equations +# **Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and Facility for Rare Isotope Beams, Michigan State University +# +# Date: **Oct 23, 2023** +# +# Copyright 1999-2023, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license + +# ## Plans for week 43 +# +# **Material for the active learning sessions on Tuesday and Wednesday.** +# +# * Exercise on writing your own neural network code, application to the OR and XOR gates +# +# * The exercises this week will be continued next week as well +# +# * Discussion of project 2 +# +# +# +# **Material for the lecture on Thursday October 26, 2023.** +# +# * Building our own Feed-forward Neural Network and discussion of project 2, continuation from last week +# +# * Solving differential equations with Neural Networks and intro to **Tensorflow** with examples. +# +# * Readings and Videos: +# +# * These lecture notes +# +# * [Aurelien Geron's chapters 10-11](https://github.com/CompPhysics/MachineLearning/blob/master/doc/Textbooks/TensorflowML.pdf) +# +# * For a more in depth discussion on neural networks we recommend Goodfellow et al chapters 6 and 7. +# +# * [Neural Networks demystified](https://www.youtube.com/watch?v=bxe2T-V8XRs&list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&ab_channel=WelchLabs) +# +# * [Building Neural Networks from scratch](https://www.youtube.com/watch?v=Wo5dMEP_BbI&list=PLQVvvaa0QuDcjD5BAw2DxE6OF2tius3V3&ab_channel=sentdex) +# +# * [Video on Neural Networks](https://www.youtube.com/watch?v=CqOfi41LfDw) +# +# * [Video on the back propagation algorithm](https://www.youtube.com/watch?v=Ilg3gGewQ5U) +# +# I also recommend Michael Nielsen's intuitive approach to the neural networks and the universal approximation theorem, see the slides at . + +# ## Using Automatic differentiation +# a +# In our discussions of ordinary differential equations +# we will also study the usage of [Autograd](https://www.youtube.com/watch?v=fRf4l5qaX1M&ab_channel=AlexSmola) in computing gradients for deep learning. For the documentation of Autograd and examples see the lectures slides from [week 39](https://compphysics.github.io/MachineLearning/doc/pub/week39/html/week39.html) and the [Autograd documentation](https://github.com/HIPS/autograd). +# t + +# ## Back propagation and automatic differentiation +# +# For more details on the back propagation algorithm and automatic differentiation see +# 1. +# +# 2. +# +# 3. Slides 12-44 at URL":http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture4.pdf" + +# ## Material for exercises week 43 and week 44 + +# ## Writing our first neural network code, testing it for the OR and XOR gates +# +# During week 41 we discussed three different types of gates, the +# so-called XOR, the OR and the AND gates. In order to develop a code +# for neural networks, it can be useful to set up a simpler system with +# only two inputs and one output. This can make it easier to debug and +# study the feed forward pass and the back propagation part. In the +# exercise this and next week, we propose to study this system with just +# one hidden layer and two hidden nodes. There is only one output node +# and we can choose to use either a simple regression case (fitting a +# line) or just a binary classification case with the corss-entropy as +# cost function. +# +# Their inputs and outputs can be +# summarized using the following tables, first for the OR gate with +# inputs $x_1$ and $x_2$ and outputs $y$: +# +# +# +# +# +# +# +# +# +# +# +#
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 1
    1 0 1
    1 1 1
    + +# ## The AND and XOR Gates +# +# The AND gate is defined as +# +# +# +# +# +# +# +# +# +# +# +#
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 0
    1 0 0
    1 1 1
    +# +# And finally we have the XOR gate +# +# +# +# +# +# +# +# +# +# +# +#
    $x_1$ $x_2$ $y$
    0 0 0
    0 1 1
    1 0 1
    1 1 0
    + +# ## Representing the Data Sets +# +# Our design matrix is defined by the input values $x_1$ and $x_2$. Since we have four possible outputs, our design matrix reads + +# $$ +# \boldsymbol{X}=\begin{bmatrix} 0 & 0 \\ +# 0 & 1 \\ +# 1 & 0 \\ +# 1 & 1 \end{bmatrix}, +# $$ + +# while the vector of outputs is $\boldsymbol{y}^T=[0,1,1,0]$ for the XOR gate, $\boldsymbol{y}^T=[0,0,0,1]$ for the AND gate and $\boldsymbol{y}^T=[0,1,1,1]$ for the OR gate. + +# ## Setting up the Neural Network +# +# We define first our design matrix and the various output vectors for the different gates. + +# In[1]: + + +get_ipython().run_line_magic('matplotlib', 'inline') + +""" +Simple code that tests XOR, OR and AND gates with linear regression +""" + +# import necessary packages +import numpy as np +import matplotlib.pyplot as plt +from sklearn import datasets + +def sigmoid(x): + return 1/(1 + np.exp(-x)) + +def feed_forward(X): + # weighted sum of inputs to the hidden layer + z_h = np.matmul(X, hidden_weights) + hidden_bias + # activation in the hidden layer + a_h = sigmoid(z_h) + + # weighted sum of inputs to the output layer + z_o = np.matmul(a_h, output_weights) + output_bias + # softmax output + # axis 0 holds each input and axis 1 the probabilities of each category + probabilities = sigmoid(z_o) + return probabilities + +# we obtain a prediction by taking the class with the highest likelihood +def predict(X): + probabilities = feed_forward(X) + return np.argmax(probabilities, axis=1) + +# ensure the same random numbers appear every time +np.random.seed(0) + +# Design matrix +X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64) + +# The XOR gate +yXOR = np.array( [ 0, 1 ,1, 0]) +# The OR gate +yOR = np.array( [ 0, 1 ,1, 1]) +# The AND gate +yAND = np.array( [ 0, 0 ,0, 1]) + +# Defining the neural network +n_inputs, n_features = X.shape +n_hidden_neurons = 2 +n_categories = 2 +n_features = 2 + +# we make the weights normally distributed using numpy.random.randn + +# weights and bias in the hidden layer +hidden_weights = np.random.randn(n_features, n_hidden_neurons) +hidden_bias = np.zeros(n_hidden_neurons) + 0.01 + +# weights and bias in the output layer +output_weights = np.random.randn(n_hidden_neurons, n_categories) +output_bias = np.zeros(n_categories) + 0.01 + +probabilities = feed_forward(X) +print(probabilities) + + +predictions = predict(X) +print(predictions) + + +# Not an impressive result, but this was our first forward pass with randomly assigned weights. Let us now add the full network with the back-propagation algorithm discussed above. + +# ## The Code using Scikit-Learn + +# In[2]: + + +# import necessary packages +import numpy as np +import matplotlib.pyplot as plt +from sklearn.neural_network import MLPClassifier +from sklearn.metrics import accuracy_score +import seaborn as sns + +# ensure the same random numbers appear every time +np.random.seed(0) + +# Design matrix +X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64) + +# The XOR gate +yXOR = np.array( [ 0, 1 ,1, 0]) +# The OR gate +yOR = np.array( [ 0, 1 ,1, 1]) +# The AND gate +yAND = np.array( [ 0, 0 ,0, 1]) + +# Defining the neural network +n_inputs, n_features = X.shape +n_hidden_neurons = 2 +n_categories = 2 +n_features = 2 + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +# store models for later use +DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) +epochs = 100 + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic', + alpha=lmbd, learning_rate_init=eta, max_iter=epochs) + dnn.fit(X, yXOR) + DNN_scikit[i][j] = dnn + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Accuracy score on data set: ", dnn.score(X, yXOR)) + print() + +sns.set() +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + dnn = DNN_scikit[i][j] + test_pred = dnn.predict(X) + test_accuracy[i][j] = accuracy_score(yXOR, test_pred) + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + + +# How do we interpret these results? + +# ## Lecture Thursday October 26 + +# ## Developing a code for doing neural networks with back propagation +# +# We repeat some of the elements discussed last week. The first part of +# the material for Thursday was contained in the slides for last +# week as well. We will repeat some of the topics here before we move into +# applications to differential equations and other examples. +# +# One can identify a set of key steps when using neural networks to solve supervised learning problems: +# +# 1. Collect and pre-process data +# +# 2. Define model and architecture +# +# 3. Choose cost function and optimizer +# +# 4. Train the model +# +# 5. Evaluate model performance on test data +# +# 6. Adjust hyperparameters (if necessary, network architecture) + +# ## Collect and pre-process data +# +# Here we will be using the MNIST dataset, which is readily available through the **scikit-learn** +# package. You may also find it for example [here](http://yann.lecun.com/exdb/mnist/). +# The *MNIST* (Modified National Institute of Standards and Technology) database is a large database +# of handwritten digits that is commonly used for training various image processing systems. +# The MNIST dataset consists of 70 000 images of size $28\times 28$ pixels, each labeled from 0 to 9. +# The scikit-learn dataset we will use consists of a selection of 1797 images of size $8\times 8$ collected and processed from this database. +# +# To feed data into a feed-forward neural network we need to represent +# the inputs as a design/feature matrix $X = (n_{inputs}, n_{features})$. Each +# row represents an *input*, in this case a handwritten digit, and +# each column represents a *feature*, in this case a pixel. The +# correct answers, also known as *labels* or *targets* are +# represented as a 1D array of integers +# $Y = (n_{inputs}) = (5, 3, 1, 8,...)$. +# +# As an example, say we want to build a neural network using supervised learning to predict Body-Mass Index (BMI) from +# measurements of height (in m) +# and weight (in kg). If we have measurements of 5 people the design/feature matrix could be for example: +# +# $$ X = \begin{bmatrix} +# 1.85 & 81\\ +# 1.71 & 65\\ +# 1.95 & 103\\ +# 1.55 & 42\\ +# 1.63 & 56 +# \end{bmatrix} ,$$ +# +# and the targets would be: +# +# $$ Y = (23.7, 22.2, 27.1, 17.5, 21.1) $$ +# +# Since each input image is a 2D matrix, we need to flatten the image +# (i.e. "unravel" the 2D matrix into a 1D array) to turn the data into a +# design/feature matrix. This means we lose all spatial information in the +# image, such as locality and translational invariance. More complicated +# architectures such as Convolutional Neural Networks can take advantage +# of such information, and are most commonly applied when analyzing +# images. + +# In[3]: + + +# import necessary packages +import numpy as np +import matplotlib.pyplot as plt +from sklearn import datasets + + +# ensure the same random numbers appear every time +np.random.seed(0) + +# display images in notebook +get_ipython().run_line_magic('matplotlib', 'inline') +plt.rcParams['figure.figsize'] = (12,12) + + +# download MNIST dataset +digits = datasets.load_digits() + +# define inputs and labels +inputs = digits.images +labels = digits.target + +print("inputs = (n_inputs, pixel_width, pixel_height) = " + str(inputs.shape)) +print("labels = (n_inputs) = " + str(labels.shape)) + + +# flatten the image +# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64 +n_inputs = len(inputs) +inputs = inputs.reshape(n_inputs, -1) +print("X = (n_inputs, n_features) = " + str(inputs.shape)) + + +# choose some random images to display +indices = np.arange(n_inputs) +random_indices = np.random.choice(indices, size=5) + +for i, image in enumerate(digits.images[random_indices]): + plt.subplot(1, 5, i+1) + plt.axis('off') + plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest') + plt.title("Label: %d" % digits.target[random_indices[i]]) +plt.show() + + +# ## Train and test datasets +# +# Performing analysis before partitioning the dataset is a major error, that can lead to incorrect conclusions. +# +# We will reserve $80 \%$ of our dataset for training and $20 \%$ for testing. +# +# It is important that the train and test datasets are drawn randomly from our dataset, to ensure +# no bias in the sampling. +# Say you are taking measurements of weather data to predict the weather in the coming 5 days. +# You don't want to train your model on measurements taken from the hours 00.00 to 12.00, and then test it on data +# collected from 12.00 to 24.00. + +# In[4]: + + +from sklearn.model_selection import train_test_split + +# one-liner from scikit-learn library +train_size = 0.8 +test_size = 1 - train_size +X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size, + test_size=test_size) + +# equivalently in numpy +def train_test_split_numpy(inputs, labels, train_size, test_size): + n_inputs = len(inputs) + inputs_shuffled = inputs.copy() + labels_shuffled = labels.copy() + + np.random.shuffle(inputs_shuffled) + np.random.shuffle(labels_shuffled) + + train_end = int(n_inputs*train_size) + X_train, X_test = inputs_shuffled[:train_end], inputs_shuffled[train_end:] + Y_train, Y_test = labels_shuffled[:train_end], labels_shuffled[train_end:] + + return X_train, X_test, Y_train, Y_test + +#X_train, X_test, Y_train, Y_test = train_test_split_numpy(inputs, labels, train_size, test_size) + +print("Number of training images: " + str(len(X_train))) +print("Number of test images: " + str(len(X_test))) + + +# ## Define model and architecture +# +# Our simple feed-forward neural network will consist of an *input* layer, a single *hidden* layer and an *output* layer. The activation $y$ of each neuron is a weighted sum of inputs, passed through an activation function. In case of the simple perceptron model we have +# +# $$ z = \sum_{i=1}^n w_i a_i ,$$ +# +# $$ y = f(z) ,$$ +# +# where $f$ is the activation function, $a_i$ represents input from neuron $i$ in the preceding layer +# and $w_i$ is the weight to input $i$. +# The activation of the neurons in the input layer is just the features (e.g. a pixel value). +# +# The simplest activation function for a neuron is the *Heaviside* function: +# +# $$ f(z) = +# \begin{cases} +# 1, & z > 0\\ +# 0, & \text{otherwise} +# \end{cases} +# $$ +# +# A feed-forward neural network with this activation is known as a *perceptron*. +# For a binary classifier (i.e. two classes, 0 or 1, dog or not-dog) we can also use this in our output layer. +# This activation can be generalized to $k$ classes (using e.g. the *one-against-all* strategy), +# and we call these architectures *multiclass perceptrons*. +# +# However, it is now common to use the terms Single Layer Perceptron (SLP) (1 hidden layer) and +# Multilayer Perceptron (MLP) (2 or more hidden layers) to refer to feed-forward neural networks with any activation function. +# +# Typical choices for activation functions include the sigmoid function, hyperbolic tangent, and Rectified Linear Unit (ReLU). +# We will be using the sigmoid function $\sigma(x)$: +# +# $$ f(x) = \sigma(x) = \frac{1}{1 + e^{-x}} ,$$ +# +# which is inspired by probability theory (see logistic regression) and was most commonly used until about 2011. See the discussion below concerning other activation functions. + +# ## Layers +# +# * Input +# +# Since each input image has 8x8 = 64 pixels or features, we have an input layer of 64 neurons. +# +# * Hidden layer +# +# We will use 50 neurons in the hidden layer receiving input from the neurons in the input layer. +# Since each neuron in the hidden layer is connected to the 64 inputs we have 64x50 = 3200 weights to the hidden layer. +# +# * Output +# +# If we were building a binary classifier, it would be sufficient with a single neuron in the output layer, +# which could output 0 or 1 according to the Heaviside function. This would be an example of a *hard* classifier, meaning it outputs the class of the input directly. However, if we are dealing with noisy data it is often beneficial to use a *soft* classifier, which outputs the probability of being in class 0 or 1. +# +# For a soft binary classifier, we could use a single neuron and interpret the output as either being the probability of being in class 0 or the probability of being in class 1. Alternatively we could use 2 neurons, and interpret each neuron as the probability of being in each class. +# +# Since we are doing multiclass classification, with 10 categories, it is natural to use 10 neurons in the output layer. We number the neurons $j = 0,1,...,9$. The activation of each output neuron $j$ will be according to the *softmax* function: +# +# $$ P(\text{class $j$} \mid \text{input $\boldsymbol{a}$}) = \frac{\exp{(\boldsymbol{a}^T \boldsymbol{w}_j)}} +# {\sum_{c=0}^{9} \exp{(\boldsymbol{a}^T \boldsymbol{w}_c)}} ,$$ +# +# i.e. each neuron $j$ outputs the probability of being in class $j$ given an input from the hidden layer $\boldsymbol{a}$, with $\boldsymbol{w}_j$ the weights of neuron $j$ to the inputs. +# The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1. +# The exponent is just the weighted sum of inputs as before: +# +# $$ z_j = \sum_{i=1}^n w_ {ij} a_i+b_j.$$ +# +# Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500 +# weights to the output layer. + +# ## Weights and biases +# +# Typically weights are initialized with small values distributed around zero, drawn from a uniform +# or normal distribution. Setting all weights to zero means all neurons give the same output, making the network useless. +# +# Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range +# of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron $j$, $b_j$: +# +# $$ z_j = \sum_{i=1}^n w_ {ij} a_i + b_j.$$ +# +# The bias weights $\boldsymbol{b}$ are often initialized to zero, but a small value like $0.01$ ensures all neurons have some output which can be backpropagated in the first training cycle. + +# In[5]: + + +# building our neural network + +n_inputs, n_features = X_train.shape +n_hidden_neurons = 50 +n_categories = 10 + +# we make the weights normally distributed using numpy.random.randn + +# weights and bias in the hidden layer +hidden_weights = np.random.randn(n_features, n_hidden_neurons) +hidden_bias = np.zeros(n_hidden_neurons) + 0.01 + +# weights and bias in the output layer +output_weights = np.random.randn(n_hidden_neurons, n_categories) +output_bias = np.zeros(n_categories) + 0.01 + + +# ## Feed-forward pass +# +# Denote $F$ the number of features, $H$ the number of hidden neurons and $C$ the number of categories. +# For each input image we calculate a weighted sum of input features (pixel values) to each neuron $j$ in the hidden layer $l$: +# +# $$ z_{j}^{l} = \sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},$$ +# +# this is then passed through our activation function +# +# $$ a_{j}^{l} = f(z_{j}^{l}) .$$ +# +# We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron $j$ in the output layer: +# +# $$ z_{j}^{L} = \sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.$$ +# +# Finally we calculate the output of neuron $j$ in the output layer using the softmax function: +# +# $$ a_{j}^{L} = \frac{\exp{(z_j^{L})}} +# {\sum_{c=0}^{C-1} \exp{(z_c^{L})}} .$$ + +# ## Matrix multiplications +# +# Since our data has the dimensions $X = (n_{inputs}, n_{features})$ and our weights to the hidden +# layer have the dimensions +# $W_{hidden} = (n_{features}, n_{hidden})$, +# we can easily feed the network all our training data in one go by taking the matrix product +# +# $$ X W^{h} = (n_{inputs}, n_{hidden}),$$ +# +# and obtain a matrix that holds the weighted sum of inputs to the hidden layer +# for each input image and each hidden neuron. +# We also add the bias to obtain a matrix of weighted sums to the hidden layer $Z^{h}$: +# +# $$ \boldsymbol{z}^{l} = \boldsymbol{X} \boldsymbol{W}^{l} + \boldsymbol{b}^{l} ,$$ +# +# meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image. +# This is then passed through the activation: +# +# $$ \boldsymbol{a}^{l} = f(\boldsymbol{z}^l) .$$ +# +# This is fed to the output layer: +# +# $$ \boldsymbol{z}^{L} = \boldsymbol{a}^{L} \boldsymbol{W}^{L} + \boldsymbol{b}^{L} .$$ +# +# Finally we receive our output values for each image and each category by passing it through the softmax function: +# +# $$ output = softmax (\boldsymbol{z}^{L}) = (n_{inputs}, n_{categories}) .$$ + +# In[6]: + + +# setup the feed-forward pass, subscript h = hidden layer + +def sigmoid(x): + return 1/(1 + np.exp(-x)) + +def feed_forward(X): + # weighted sum of inputs to the hidden layer + z_h = np.matmul(X, hidden_weights) + hidden_bias + # activation in the hidden layer + a_h = sigmoid(z_h) + + # weighted sum of inputs to the output layer + z_o = np.matmul(a_h, output_weights) + output_bias + # softmax output + # axis 0 holds each input and axis 1 the probabilities of each category + exp_term = np.exp(z_o) + probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True) + + return probabilities + +probabilities = feed_forward(X_train) +print("probabilities = (n_inputs, n_categories) = " + str(probabilities.shape)) +print("probability that image 0 is in category 0,1,2,...,9 = \n" + str(probabilities[0])) +print("probabilities sum up to: " + str(probabilities[0].sum())) +print() + +# we obtain a prediction by taking the class with the highest likelihood +def predict(X): + probabilities = feed_forward(X) + return np.argmax(probabilities, axis=1) + +predictions = predict(X_train) +print("predictions = (n_inputs) = " + str(predictions.shape)) +print("prediction for image 0: " + str(predictions[0])) +print("correct label for image 0: " + str(Y_train[0])) + + +# ## Choose cost function and optimizer +# +# To measure how well our neural network is doing we need to introduce a cost function. +# We will call the function that gives the error of a single sample output the *loss* function, and the function +# that gives the total error of our network across all samples the *cost* function. +# A typical choice for multiclass classification is the *cross-entropy* loss, also known as the negative log likelihood. +# +# In *multiclass* classification it is common to treat each integer label as a so called *one-hot* vector: +# +# $$ y = 5 \quad \rightarrow \quad \boldsymbol{y} = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ,$$ +# +# $$ y = 1 \quad \rightarrow \quad \boldsymbol{y} = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ,$$ +# +# i.e. a binary bit string of length $C$, where $C = 10$ is the number of classes in the MNIST dataset. +# +# Let $y_{ic}$ denote the $c$-th component of the $i$-th one-hot vector. +# We define the cost function $\mathcal{C}$ as a sum over the cross-entropy loss for each point $\boldsymbol{x}_i$ in the dataset. +# +# In the one-hot representation only one of the terms in the loss function is non-zero, namely the +# probability of the correct category $c'$ +# (i.e. the category $c'$ such that $y_{ic'} = 1$). This means that the cross entropy loss only punishes you for how wrong +# you got the correct label. The probability of category $c$ is given by the softmax function. The vector $\boldsymbol{\theta}$ represents the parameters of our network, i.e. all the weights and biases. + +# ## Optimizing the cost function +# +# The network is trained by finding the weights and biases that minimize the cost function. One of the most widely used classes of methods is *gradient descent* and its generalizations. The idea behind gradient descent +# is simply to adjust the weights in the direction where the gradient of the cost function is large and negative. This ensures we flow toward a *local* minimum of the cost function. +# Each parameter $\theta$ is iteratively adjusted according to the rule +# +# $$ \theta_{i+1} = \theta_i - \eta \nabla \mathcal{C}(\theta_i) ,$$ +# +# where $\eta$ is known as the *learning rate*, which controls how big a step we take towards the minimum. +# This update can be repeated for any number of iterations, or until we are satisfied with the result. +# +# A simple and effective improvement is a variant called *Batch Gradient Descent*. +# Instead of calculating the gradient on the whole dataset, we calculate an approximation of the gradient +# on a subset of the data called a *minibatch*. +# If there are $N$ data points and we have a minibatch size of $M$, the total number of batches +# is $N/M$. +# We denote each minibatch $B_k$, with $k = 1, 2,...,N/M$. The gradient then becomes: +# +# $$ \nabla \mathcal{C}(\theta) = \frac{1}{N} \sum_{i=1}^N \nabla \mathcal{L}_i(\theta) \quad \rightarrow \quad +# \frac{1}{M} \sum_{i \in B_k} \nabla \mathcal{L}_i(\theta) ,$$ +# +# i.e. instead of averaging the loss over the entire dataset, we average over a minibatch. +# +# This has two important benefits: +# 1. Introducing stochasticity decreases the chance that the algorithm becomes stuck in a local minima. +# +# 2. It significantly speeds up the calculation, since we do not have to use the entire dataset to calculate the gradient. +# +# The various optmization methods, with codes and algorithms, are discussed in our lectures on [Gradient descent approaches](https://compphysics.github.io/MachineLearning/doc/pub/Splines/html/Splines-bs.html). + +# ## Regularization +# +# It is common to add an extra term to the cost function, proportional +# to the size of the weights. This is equivalent to constraining the +# size of the weights, so that they do not grow out of control. +# Constraining the size of the weights means that the weights cannot +# grow arbitrarily large to fit the training data, and in this way +# reduces *overfitting*. +# +# We will measure the size of the weights using the so called *L2-norm*, meaning our cost function becomes: +# +# $$ \mathcal{C}(\theta) = \frac{1}{N} \sum_{i=1}^N \mathcal{L}_i(\theta) \quad \rightarrow \quad +# \frac{1}{N} \sum_{i=1}^N \mathcal{L}_i(\theta) + \lambda \lvert \lvert \boldsymbol{w} \rvert \rvert_2^2 +# = \frac{1}{N} \sum_{i=1}^N \mathcal{L}(\theta) + \lambda \sum_{ij} w_{ij}^2,$$ +# +# i.e. we sum up all the weights squared. The factor $\lambda$ is known as a regularization parameter. +# +# In order to train the model, we need to calculate the derivative of +# the cost function with respect to every bias and weight in the +# network. In total our network has $(64 + 1)\times 50=3250$ weights in +# the hidden layer and $(50 + 1)\times 10=510$ weights to the output +# layer ($+1$ for the bias), and the gradient must be calculated for +# every parameter. We use the *backpropagation* algorithm discussed +# above. This is a clever use of the chain rule that allows us to +# calculate the gradient efficently. + +# ## Matrix multiplication +# +# To more efficently train our network these equations are implemented using matrix operations. +# The error in the output layer is calculated simply as, with $\boldsymbol{t}$ being our targets, +# +# $$ \delta_L = \boldsymbol{t} - \boldsymbol{y} = (n_{inputs}, n_{categories}) .$$ +# +# The gradient for the output weights is calculated as +# +# $$ \nabla W_{L} = \boldsymbol{a}^T \delta_L = (n_{hidden}, n_{categories}) ,$$ +# +# where $\boldsymbol{a} = (n_{inputs}, n_{hidden})$. This simply means that we are summing up the gradients for each input. +# Since we are going backwards we have to transpose the activation matrix. +# +# The gradient with respect to the output bias is then +# +# $$ \nabla \boldsymbol{b}_{L} = \sum_{i=1}^{n_{inputs}} \delta_L = (n_{categories}) .$$ +# +# The error in the hidden layer is +# +# $$ \Delta_h = \delta_L W_{L}^T \circ f'(z_{h}) = \delta_L W_{L}^T \circ a_{h} \circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,$$ +# +# where $f'(a_{h})$ is the derivative of the activation in the hidden layer. The matrix products mean +# that we are summing up the products for each neuron in the output layer. The symbol $\circ$ denotes +# the *Hadamard product*, meaning element-wise multiplication. +# +# This again gives us the gradients in the hidden layer: +# +# $$ \nabla W_{h} = X^T \delta_h = (n_{features}, n_{hidden}) ,$$ +# +# $$ \nabla b_{h} = \sum_{i=1}^{n_{inputs}} \delta_h = (n_{hidden}) .$$ + +# In[7]: + + +# to categorical turns our integer vector into a onehot representation +from sklearn.metrics import accuracy_score + +# one-hot in numpy +def to_categorical_numpy(integer_vector): + n_inputs = len(integer_vector) + n_categories = np.max(integer_vector) + 1 + onehot_vector = np.zeros((n_inputs, n_categories)) + onehot_vector[range(n_inputs), integer_vector] = 1 + + return onehot_vector + +#Y_train_onehot, Y_test_onehot = to_categorical(Y_train), to_categorical(Y_test) +Y_train_onehot, Y_test_onehot = to_categorical_numpy(Y_train), to_categorical_numpy(Y_test) + +def feed_forward_train(X): + # weighted sum of inputs to the hidden layer + z_h = np.matmul(X, hidden_weights) + hidden_bias + # activation in the hidden layer + a_h = sigmoid(z_h) + + # weighted sum of inputs to the output layer + z_o = np.matmul(a_h, output_weights) + output_bias + # softmax output + # axis 0 holds each input and axis 1 the probabilities of each category + exp_term = np.exp(z_o) + probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True) + + # for backpropagation need activations in hidden and output layers + return a_h, probabilities + +def backpropagation(X, Y): + a_h, probabilities = feed_forward_train(X) + + # error in the output layer + error_output = probabilities - Y + # error in the hidden layer + error_hidden = np.matmul(error_output, output_weights.T) * a_h * (1 - a_h) + + # gradients for the output layer + output_weights_gradient = np.matmul(a_h.T, error_output) + output_bias_gradient = np.sum(error_output, axis=0) + + # gradient for the hidden layer + hidden_weights_gradient = np.matmul(X.T, error_hidden) + hidden_bias_gradient = np.sum(error_hidden, axis=0) + + return output_weights_gradient, output_bias_gradient, hidden_weights_gradient, hidden_bias_gradient + +print("Old accuracy on training data: " + str(accuracy_score(predict(X_train), Y_train))) + +eta = 0.01 +lmbd = 0.01 +for i in range(1000): + # calculate gradients + dWo, dBo, dWh, dBh = backpropagation(X_train, Y_train_onehot) + + # regularization term gradients + dWo += lmbd * output_weights + dWh += lmbd * hidden_weights + + # update weights and biases + output_weights -= eta * dWo + output_bias -= eta * dBo + hidden_weights -= eta * dWh + hidden_bias -= eta * dBh + +print("New accuracy on training data: " + str(accuracy_score(predict(X_train), Y_train))) + + +# ## Improving performance +# +# As we can see the network does not seem to be learning at all. It seems to be just guessing the label for each image. +# In order to obtain a network that does something useful, we will have to do a bit more work. +# +# The choice of *hyperparameters* such as learning rate and regularization parameter is hugely influential for the performance of the network. Typically a *grid-search* is performed, wherein we test different hyperparameters separated by orders of magnitude. For example we could test the learning rates $\eta = 10^{-6}, 10^{-5},...,10^{-1}$ with different regularization parameters $\lambda = 10^{-6},...,10^{-0}$. +# +# Next, we haven't implemented minibatching yet, which introduces stochasticity and is though to act as an important regularizer on the weights. We call a feed-forward + backward pass with a minibatch an *iteration*, and a full training period +# going through the entire dataset ($n/M$ batches) an *epoch*. +# +# If this does not improve network performance, you may want to consider altering the network architecture, adding more neurons or hidden layers. +# Andrew Ng goes through some of these considerations in this [video](https://youtu.be/F1ka6a13S9I). You can find a summary of the video [here](https://kevinzakka.github.io/2016/09/26/applying-deep-learning/). + +# ## Full object-oriented implementation +# +# It is very natural to think of the network as an object, with specific instances of the network +# being realizations of this object with different hyperparameters. An implementation using Python classes provides a clean structure and interface, and the full implementation of our neural network is given below. + +# In[8]: + + +class NeuralNetwork: + def __init__( + self, + X_data, + Y_data, + n_hidden_neurons=50, + n_categories=10, + epochs=10, + batch_size=100, + eta=0.1, + lmbd=0.0): + + self.X_data_full = X_data + self.Y_data_full = Y_data + + self.n_inputs = X_data.shape[0] + self.n_features = X_data.shape[1] + self.n_hidden_neurons = n_hidden_neurons + self.n_categories = n_categories + + self.epochs = epochs + self.batch_size = batch_size + self.iterations = self.n_inputs // self.batch_size + self.eta = eta + self.lmbd = lmbd + + self.create_biases_and_weights() + + def create_biases_and_weights(self): + self.hidden_weights = np.random.randn(self.n_features, self.n_hidden_neurons) + self.hidden_bias = np.zeros(self.n_hidden_neurons) + 0.01 + + self.output_weights = np.random.randn(self.n_hidden_neurons, self.n_categories) + self.output_bias = np.zeros(self.n_categories) + 0.01 + + def feed_forward(self): + # feed-forward for training + self.z_h = np.matmul(self.X_data, self.hidden_weights) + self.hidden_bias + self.a_h = sigmoid(self.z_h) + + self.z_o = np.matmul(self.a_h, self.output_weights) + self.output_bias + + exp_term = np.exp(self.z_o) + self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True) + + def feed_forward_out(self, X): + # feed-forward for output + z_h = np.matmul(X, self.hidden_weights) + self.hidden_bias + a_h = sigmoid(z_h) + + z_o = np.matmul(a_h, self.output_weights) + self.output_bias + + exp_term = np.exp(z_o) + probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True) + return probabilities + + def backpropagation(self): + error_output = self.probabilities - self.Y_data + error_hidden = np.matmul(error_output, self.output_weights.T) * self.a_h * (1 - self.a_h) + + self.output_weights_gradient = np.matmul(self.a_h.T, error_output) + self.output_bias_gradient = np.sum(error_output, axis=0) + + self.hidden_weights_gradient = np.matmul(self.X_data.T, error_hidden) + self.hidden_bias_gradient = np.sum(error_hidden, axis=0) + + if self.lmbd > 0.0: + self.output_weights_gradient += self.lmbd * self.output_weights + self.hidden_weights_gradient += self.lmbd * self.hidden_weights + + self.output_weights -= self.eta * self.output_weights_gradient + self.output_bias -= self.eta * self.output_bias_gradient + self.hidden_weights -= self.eta * self.hidden_weights_gradient + self.hidden_bias -= self.eta * self.hidden_bias_gradient + + def predict(self, X): + probabilities = self.feed_forward_out(X) + return np.argmax(probabilities, axis=1) + + def predict_probabilities(self, X): + probabilities = self.feed_forward_out(X) + return probabilities + + def train(self): + data_indices = np.arange(self.n_inputs) + + for i in range(self.epochs): + for j in range(self.iterations): + # pick datapoints with replacement + chosen_datapoints = np.random.choice( + data_indices, size=self.batch_size, replace=False + ) + + # minibatch training data + self.X_data = self.X_data_full[chosen_datapoints] + self.Y_data = self.Y_data_full[chosen_datapoints] + + self.feed_forward() + self.backpropagation() + + +# ## Evaluate model performance on test data +# +# To measure the performance of our network we evaluate how well it does it data it has never seen before, i.e. the test data. +# We measure the performance of the network using the *accuracy* score. +# The accuracy is as you would expect just the number of images correctly labeled divided by the total number of images. A perfect classifier will have an accuracy score of $1$. +# +# $$ \text{Accuracy} = \frac{\sum_{i=1}^n I(\tilde{y}_i = y_i)}{n} ,$$ +# +# where $I$ is the indicator function, $1$ if $\tilde{y}_i = y_i$ and $0$ otherwise. + +# In[9]: + + +epochs = 100 +batch_size = 100 + +dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size, + n_hidden_neurons=n_hidden_neurons, n_categories=n_categories) +dnn.train() +test_predict = dnn.predict(X_test) + +# accuracy score from scikit library +print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict)) + +# equivalent in numpy +def accuracy_score_numpy(Y_test, Y_pred): + return np.sum(Y_test == Y_pred) / len(Y_test) + +#print("Accuracy score on test set: ", accuracy_score_numpy(Y_test, test_predict)) + + +# ## Adjust hyperparameters +# +# We now perform a grid search to find the optimal hyperparameters for the network. +# Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around $98\%$ ($2\%$ error rate). + +# In[10]: + + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +# store the models for later use +DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +# grid search +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size, + n_hidden_neurons=n_hidden_neurons, n_categories=n_categories) + dnn.train() + + DNN_numpy[i][j] = dnn + + test_predict = dnn.predict(X_test) + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict)) + print() + + +# ## Visualization + +# In[11]: + + +# visual representation of grid search +# uses seaborn heatmap, you can also do this with matplotlib imshow +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + dnn = DNN_numpy[i][j] + + train_pred = dnn.predict(X_train) + test_pred = dnn.predict(X_test) + + train_accuracy[i][j] = accuracy_score(Y_train, train_pred) + test_accuracy[i][j] = accuracy_score(Y_test, test_pred) + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + + +# ## scikit-learn implementation +# +# **scikit-learn** focuses more +# on traditional machine learning methods, such as regression, +# clustering, decision trees, etc. As such, it has only two types of +# neural networks: Multi Layer Perceptron outputting continuous values, +# *MPLRegressor*, and Multi Layer Perceptron outputting labels, +# *MLPClassifier*. We will see how simple it is to use these classes. +# +# **scikit-learn** implements a few improvements from our neural network, +# such as early stopping, a varying learning rate, different +# optimization methods, etc. We would therefore expect a better +# performance overall. + +# In[12]: + + +from sklearn.neural_network import MLPClassifier +# store models for later use +DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic', + alpha=lmbd, learning_rate_init=eta, max_iter=epochs) + dnn.fit(X_train, Y_train) + + DNN_scikit[i][j] = dnn + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Accuracy score on test set: ", dnn.score(X_test, Y_test)) + print() + + +# ## Visualization + +# In[13]: + + +# optional +# visual representation of grid search +# uses seaborn heatmap, could probably do this in matplotlib +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + dnn = DNN_scikit[i][j] + + train_pred = dnn.predict(X_train) + test_pred = dnn.predict(X_test) + + train_accuracy[i][j] = accuracy_score(Y_train, train_pred) + test_accuracy[i][j] = accuracy_score(Y_test, test_pred) + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + + +# ## Building neural networks in Tensorflow and Keras +# +# Now we want to build on the experience gained from our neural network implementation in NumPy and scikit-learn +# and use it to construct a neural network in Tensorflow. Once we have constructed a neural network in NumPy +# and Tensorflow, building one in Keras is really quite trivial, though the performance may suffer. +# +# In our previous example we used only one hidden layer, and in this we will use two. From this it should be quite +# clear how to build one using an arbitrary number of hidden layers, using data structures such as Python lists or +# NumPy arrays. + +# ## Tensorflow +# +# Tensorflow is an open source library machine learning library +# developed by the Google Brain team for internal use. It was released +# under the Apache 2.0 open source license in November 9, 2015. +# +# Tensorflow is a computational framework that allows you to construct +# machine learning models at different levels of abstraction, from +# high-level, object-oriented APIs like Keras, down to the C++ kernels +# that Tensorflow is built upon. The higher levels of abstraction are +# simpler to use, but less flexible, and our choice of implementation +# should reflect the problems we are trying to solve. +# +# [Tensorflow uses](https://www.tensorflow.org/guide/graphs) so-called graphs to represent your computation +# in terms of the dependencies between individual operations, such that you first build a Tensorflow *graph* +# to represent your model, and then create a Tensorflow *session* to run the graph. +# +# In this guide we will analyze the same data as we did in our NumPy and +# scikit-learn tutorial, gathered from the MNIST database of images. We +# will give an introduction to the lower level Python Application +# Program Interfaces (APIs), and see how we use them to build our graph. +# Then we will build (effectively) the same graph in Keras, to see just +# how simple solving a machine learning problem can be. +# +# To install tensorflow on Unix/Linux systems, use pip as + +# In[14]: + + +pip3 install tensorflow + + +# and/or if you use **anaconda**, just write (or install from the graphical user interface) +# (current release of CPU-only TensorFlow) + +# In[15]: + + +conda create -n tf tensorflow +conda activate tf + + +# To install the current release of GPU TensorFlow + +# In[16]: + + +conda create -n tf-gpu tensorflow-gpu +conda activate tf-gpu + + +# ## Using Keras +# +# Keras is a high level [neural network](https://en.wikipedia.org/wiki/Application_programming_interface) +# that supports Tensorflow, CTNK and Theano as backends. +# If you have Anaconda installed you may run the following command + +# In[17]: + + +conda install keras + + +# You can look up the [instructions here](https://keras.io/) for more information. +# +# We will to a large extent use **keras** in our examples.. + +# ## Collect and pre-process data +# +# Let us look again at the MINST data set. + +# In[18]: + + +# import necessary packages +import numpy as np +import matplotlib.pyplot as plt +import tensorflow as tf +from sklearn import datasets + + +# ensure the same random numbers appear every time +np.random.seed(0) + +# display images in notebook +get_ipython().run_line_magic('matplotlib', 'inline') +plt.rcParams['figure.figsize'] = (12,12) + + +# download MNIST dataset +digits = datasets.load_digits() + +# define inputs and labels +inputs = digits.images +labels = digits.target + +print("inputs = (n_inputs, pixel_width, pixel_height) = " + str(inputs.shape)) +print("labels = (n_inputs) = " + str(labels.shape)) + + +# flatten the image +# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64 +n_inputs = len(inputs) +inputs = inputs.reshape(n_inputs, -1) +print("X = (n_inputs, n_features) = " + str(inputs.shape)) + + +# choose some random images to display +indices = np.arange(n_inputs) +random_indices = np.random.choice(indices, size=5) + +for i, image in enumerate(digits.images[random_indices]): + plt.subplot(1, 5, i+1) + plt.axis('off') + plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest') + plt.title("Label: %d" % digits.target[random_indices[i]]) +plt.show() + + +# In[19]: + + +from tensorflow.keras.layers import Input +from tensorflow.keras.models import Sequential #This allows appending layers to existing models +from tensorflow.keras.layers import Dense #This allows defining the characteristics of a particular layer +from tensorflow.keras import optimizers #This allows using whichever optimiser we want (sgd,adam,RMSprop) +from tensorflow.keras import regularizers #This allows using whichever regularizer we want (l1,l2,l1_l2) +from tensorflow.keras.utils import to_categorical #This allows using categorical cross entropy as the cost function + +from sklearn.model_selection import train_test_split + +# one-hot representation of labels +labels = to_categorical(labels) + +# split into train and test data +train_size = 0.8 +test_size = 1 - train_size +X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size, + test_size=test_size) + + +# In[20]: + + + +epochs = 100 +batch_size = 100 +n_neurons_layer1 = 100 +n_neurons_layer2 = 50 +n_categories = 10 +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +def create_neural_network_keras(n_neurons_layer1, n_neurons_layer2, n_categories, eta, lmbd): + model = Sequential() + model.add(Dense(n_neurons_layer1, activation='sigmoid', kernel_regularizer=regularizers.l2(lmbd))) + model.add(Dense(n_neurons_layer2, activation='sigmoid', kernel_regularizer=regularizers.l2(lmbd))) + model.add(Dense(n_categories, activation='softmax')) + + sgd = optimizers.SGD(lr=eta) + model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) + + return model + + +# In[21]: + + +DNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + DNN = create_neural_network_keras(n_neurons_layer1, n_neurons_layer2, n_categories, + eta=eta, lmbd=lmbd) + DNN.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, verbose=0) + scores = DNN.evaluate(X_test, Y_test) + + DNN_keras[i][j] = DNN + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Test accuracy: %.3f" % scores[1]) + print() + + +# In[22]: + + +# optional +# visual representation of grid search +# uses seaborn heatmap, could probably do this in matplotlib +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + DNN = DNN_keras[i][j] + + train_accuracy[i][j] = DNN.evaluate(X_train, Y_train)[1] + test_accuracy[i][j] = DNN.evaluate(X_test, Y_test)[1] + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + + +# ## The Breast Cancer Data, now with Keras + +# In[23]: + + + +import tensorflow as tf +from tensorflow.keras.layers import Input +from tensorflow.keras.models import Sequential #This allows appending layers to existing models +from tensorflow.keras.layers import Dense #This allows defining the characteristics of a particular layer +from tensorflow.keras import optimizers #This allows using whichever optimiser we want (sgd,adam,RMSprop) +from tensorflow.keras import regularizers #This allows using whichever regularizer we want (l1,l2,l1_l2) +from tensorflow.keras.utils import to_categorical #This allows using categorical cross entropy as the cost function +import numpy as np +import matplotlib.pyplot as plt +import seaborn as sns +from sklearn.model_selection import train_test_split as splitter +from sklearn.datasets import load_breast_cancer +import pickle +import os + + +"""Load breast cancer dataset""" + +np.random.seed(0) #create same seed for random number every time + +cancer=load_breast_cancer() #Download breast cancer dataset + +inputs=cancer.data #Feature matrix of 569 rows (samples) and 30 columns (parameters) +outputs=cancer.target #Label array of 569 rows (0 for benign and 1 for malignant) +labels=cancer.feature_names[0:30] + +print('The content of the breast cancer dataset is:') #Print information about the datasets +print(labels) +print('-------------------------') +print("inputs = " + str(inputs.shape)) +print("outputs = " + str(outputs.shape)) +print("labels = "+ str(labels.shape)) + +x=inputs #Reassign the Feature and Label matrices to other variables +y=outputs + +#%% + +# Visualisation of dataset (for correlation analysis) + +plt.figure() +plt.scatter(x[:,0],x[:,2],s=40,c=y,cmap=plt.cm.Spectral) +plt.xlabel('Mean radius',fontweight='bold') +plt.ylabel('Mean perimeter',fontweight='bold') +plt.show() + +plt.figure() +plt.scatter(x[:,5],x[:,6],s=40,c=y, cmap=plt.cm.Spectral) +plt.xlabel('Mean compactness',fontweight='bold') +plt.ylabel('Mean concavity',fontweight='bold') +plt.show() + + +plt.figure() +plt.scatter(x[:,0],x[:,1],s=40,c=y,cmap=plt.cm.Spectral) +plt.xlabel('Mean radius',fontweight='bold') +plt.ylabel('Mean texture',fontweight='bold') +plt.show() + +plt.figure() +plt.scatter(x[:,2],x[:,1],s=40,c=y,cmap=plt.cm.Spectral) +plt.xlabel('Mean perimeter',fontweight='bold') +plt.ylabel('Mean compactness',fontweight='bold') +plt.show() + + +# Generate training and testing datasets + +#Select features relevant to classification (texture,perimeter,compactness and symmetery) +#and add to input matrix + +temp1=np.reshape(x[:,1],(len(x[:,1]),1)) +temp2=np.reshape(x[:,2],(len(x[:,2]),1)) +X=np.hstack((temp1,temp2)) +temp=np.reshape(x[:,5],(len(x[:,5]),1)) +X=np.hstack((X,temp)) +temp=np.reshape(x[:,8],(len(x[:,8]),1)) +X=np.hstack((X,temp)) + +X_train,X_test,y_train,y_test=splitter(X,y,test_size=0.1) #Split datasets into training and testing + +y_train=to_categorical(y_train) #Convert labels to categorical when using categorical cross entropy +y_test=to_categorical(y_test) + +del temp1,temp2,temp + +# %% + +# Define tunable parameters" + +eta=np.logspace(-3,-1,3) #Define vector of learning rates (parameter to SGD optimiser) +lamda=0.01 #Define hyperparameter +n_layers=2 #Define number of hidden layers in the model +n_neuron=np.logspace(0,3,4,dtype=int) #Define number of neurons per layer +epochs=100 #Number of reiterations over the input data +batch_size=100 #Number of samples per gradient update + +# %% + +"""Define function to return Deep Neural Network model""" + +def NN_model(inputsize,n_layers,n_neuron,eta,lamda): + model=Sequential() + for i in range(n_layers): #Run loop to add hidden layers to the model + if (i==0): #First layer requires input dimensions + model.add(Dense(n_neuron,activation='relu',kernel_regularizer=regularizers.l2(lamda),input_dim=inputsize)) + else: #Subsequent layers are capable of automatic shape inferencing + model.add(Dense(n_neuron,activation='relu',kernel_regularizer=regularizers.l2(lamda))) + model.add(Dense(2,activation='softmax')) #2 outputs - ordered and disordered (softmax for prob) + sgd=optimizers.SGD(lr=eta) + model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy']) + return model + + +Train_accuracy=np.zeros((len(n_neuron),len(eta))) #Define matrices to store accuracy scores as a function +Test_accuracy=np.zeros((len(n_neuron),len(eta))) #of learning rate and number of hidden neurons for + +for i in range(len(n_neuron)): #run loops over hidden neurons and learning rates to calculate + for j in range(len(eta)): #accuracy scores + DNN_model=NN_model(X_train.shape[1],n_layers,n_neuron[i],eta[j],lamda) + DNN_model.fit(X_train,y_train,epochs=epochs,batch_size=batch_size,verbose=1) + Train_accuracy[i,j]=DNN_model.evaluate(X_train,y_train)[1] + Test_accuracy[i,j]=DNN_model.evaluate(X_test,y_test)[1] + + +def plot_data(x,y,data,title=None): + + # plot results + fontsize=16 + + + fig = plt.figure() + ax = fig.add_subplot(111) + cax = ax.matshow(data, interpolation='nearest', vmin=0, vmax=1) + + cbar=fig.colorbar(cax) + cbar.ax.set_ylabel('accuracy (%)',rotation=90,fontsize=fontsize) + cbar.set_ticks([0,.2,.4,0.6,0.8,1.0]) + cbar.set_ticklabels(['0%','20%','40%','60%','80%','100%']) + + # put text on matrix elements + for i, x_val in enumerate(np.arange(len(x))): + for j, y_val in enumerate(np.arange(len(y))): + c = "${0:.1f}\\%$".format( 100*data[j,i]) + ax.text(x_val, y_val, c, va='center', ha='center') + + # convert axis vaues to to string labels + x=[str(i) for i in x] + y=[str(i) for i in y] + + + ax.set_xticklabels(['']+x) + ax.set_yticklabels(['']+y) + + ax.set_xlabel('$\\mathrm{learning\\ rate}$',fontsize=fontsize) + ax.set_ylabel('$\\mathrm{hidden\\ neurons}$',fontsize=fontsize) + if title is not None: + ax.set_title(title) + + plt.tight_layout() + + plt.show() + +plot_data(eta,n_neuron,Train_accuracy, 'training') +plot_data(eta,n_neuron,Test_accuracy, 'testing') + + +# ## Fine-tuning neural network hyperparameters +# +# The flexibility of neural networks is also one of their main +# drawbacks: there are many hyperparameters to tweak. Not only can you +# use any imaginable network topology (how neurons/nodes are interconnected), +# but even in a simple FFNN you can change the number of layers, the +# number of neurons per layer, the type of activation function to use in +# each layer, the weight initialization logic, the stochastic gradient optmized and much more. How do you +# know what combination of hyperparameters is the best for your task? +# +# * You can use grid search with cross-validation to find the right hyperparameters. +# +# However,since there are many hyperparameters to tune, and since +# training a neural network on a large dataset takes a lot of time, you +# will only be able to explore a tiny part of the hyperparameter space. +# +# * You can use randomized search. +# +# * Or use tools like [Oscar](http://oscar.calldesk.ai/), which implements more complex algorithms to help you find a good set of hyperparameters quickly. + +# ## Hidden layers +# +# For many problems you can start with just one or two hidden layers and it will work just fine. +# For the MNIST data set you ca easily get a high accuracy using just one hidden layer with a +# few hundred neurons. +# You can reach for this data set above 98% accuracy using two hidden layers with the same total amount of +# neurons, in roughly the same amount of training time. +# +# For more complex problems, you can gradually +# ramp up the number of hidden layers, until you start overfitting the training set. Very complex tasks, such +# as large image classification or speech recognition, typically require networks with dozens of layers +# and they need a huge amount +# of training data. However, you will rarely have to train such networks from scratch: it is much more +# common to reuse parts of a pretrained state-of-the-art network that performs a similar task. + +# ## Which activation function should I use? +# +# The Back propagation algorithm we derived above works by going from +# the output layer to the input layer, propagating the error gradient on +# the way. Once the algorithm has computed the gradient of the cost +# function with regards to each parameter in the network, it uses these +# gradients to update each parameter with a Gradient Descent (GD) step. +# +# Unfortunately for us, the gradients often get smaller and smaller as the +# algorithm progresses down to the first hidden layers. As a result, the +# GD update leaves the lower layer connection weights +# virtually unchanged, and training never converges to a good +# solution. This is known in the literature as +# **the vanishing gradients problem**. +# +# In other cases, the opposite can happen, namely the the gradients can grow bigger and +# bigger. The result is that many of the layers get large updates of the +# weights the +# algorithm diverges. This is the **exploding gradients problem**, which is +# mostly encountered in recurrent neural networks. More generally, deep +# neural networks suffer from unstable gradients, different layers may +# learn at widely different speeds + +# ## Is the Logistic activation function (Sigmoid) our choice? +# +# Although this unfortunate behavior has been empirically observed for +# quite a while (it was one of the reasons why deep neural networks were +# mostly abandoned for a long time), it is only around 2010 that +# significant progress was made in understanding it. +# +# A paper titled [Understanding the Difficulty of Training Deep +# Feedforward Neural Networks by Xavier Glorot and Yoshua Bengio](http://proceedings.mlr.press/v9/glorot10a.html) found that +# the problems with the popular logistic +# sigmoid activation function and the weight initialization technique +# that was most popular at the time, namely random initialization using +# a normal distribution with a mean of 0 and a standard deviation of +# 1. +# +# They showed that with this activation function and this +# initialization scheme, the variance of the outputs of each layer is +# much greater than the variance of its inputs. Going forward in the +# network, the variance keeps increasing after each layer until the +# activation function saturates at the top layers. This is actually made +# worse by the fact that the logistic function has a mean of 0.5, not 0 +# (the hyperbolic tangent function has a mean of 0 and behaves slightly +# better than the logistic function in deep networks). + +# ## The derivative of the Logistic funtion +# +# Looking at the logistic activation function, when inputs become large +# (negative or positive), the function saturates at 0 or 1, with a +# derivative extremely close to 0. Thus when backpropagation kicks in, +# it has virtually no gradient to propagate back through the network, +# and what little gradient exists keeps getting diluted as +# backpropagation progresses down through the top layers, so there is +# really nothing left for the lower layers. +# +# In their paper, Glorot and Bengio propose a way to significantly +# alleviate this problem. We need the signal to flow properly in both +# directions: in the forward direction when making predictions, and in +# the reverse direction when backpropagating gradients. We don’t want +# the signal to die out, nor do we want it to explode and saturate. For +# the signal to flow properly, the authors argue that we need the +# variance of the outputs of each layer to be equal to the variance of +# its inputs, and we also need the gradients to have equal variance +# before and after flowing through a layer in the reverse direction. +# +# One of the insights in the 2010 paper by Glorot and Bengio was that +# the vanishing/exploding gradients problems were in part due to a poor +# choice of activation function. Until then most people had assumed that +# if Nature had chosen to use roughly sigmoid activation functions in +# biological neurons, they must be an excellent choice. But it turns out +# that other activation functions behave much better in deep neural +# networks, in particular the ReLU activation function, mostly because +# it does not saturate for positive values (and also because it is quite +# fast to compute). + +# ## The RELU function family +# +# The ReLU activation function suffers from a problem known as the dying +# ReLUs: during training, some neurons effectively die, meaning they +# stop outputting anything other than 0. +# +# In some cases, you may find that half of your network’s neurons are +# dead, especially if you used a large learning rate. During training, +# if a neuron’s weights get updated such that the weighted sum of the +# neuron’s inputs is negative, it will start outputting 0. When this +# happen, the neuron is unlikely to come back to life since the gradient +# of the ReLU function is 0 when its input is negative. +# +# To solve this problem, nowadays practitioners use a variant of the ReLU +# function, such as the leaky ReLU discussed above or the so-called +# exponential linear unit (ELU) function + +# $$ +# ELU(z) = \left\{\begin{array}{cc} \alpha\left( \exp{(z)}-1\right) & z < 0,\\ z & z \ge 0.\end{array}\right. +# $$ + +# ## Which activation function should we use? +# +# In general it seems that the ELU activation function is better than +# the leaky ReLU function (and its variants), which is better than +# ReLU. ReLU performs better than $\tanh$ which in turn performs better +# than the logistic function. +# +# If runtime +# performance is an issue, then you may opt for the leaky ReLU function over the +# ELU function If you don’t +# want to tweak yet another hyperparameter, you may just use the default +# $\alpha$ of $0.01$ for the leaky ReLU, and $1$ for ELU. If you have +# spare time and computing power, you can use cross-validation or +# bootstrap to evaluate other activation functions. + +# ## More on activation functions, output layers +# +# In most cases you can use the ReLU activation function in the hidden layers (or one of its variants). +# +# It is a bit faster to compute than other activation functions, and the gradient descent optimization does in general not get stuck. +# +# **For the output layer:** +# +# * For classification the softmax activation function is generally a good choice for classification tasks (when the classes are mutually exclusive). +# +# * For regression tasks, you can simply use no activation function at all. + +# ## Batch Normalization +# +# Batch Normalization +# aims to address the vanishing/exploding gradients problems, and more generally the problem that the +# distribution of each layer’s inputs changes during training, as the parameters of the previous layers change. +# +# The technique consists of adding an operation in the model just before the activation function of each +# layer, simply zero-centering and normalizing the inputs, then scaling and shifting the result using two new +# parameters per layer (one for scaling, the other for shifting). In other words, this operation lets the model +# learn the optimal scale and mean of the inputs for each layer. +# In order to zero-center and normalize the inputs, the algorithm needs to estimate the inputs’ mean and +# standard deviation. It does so by evaluating the mean and standard deviation of the inputs over the current +# mini-batch, from this the name batch normalization. + +# ## Dropout +# +# It is a fairly simple algorithm: at every training step, every neuron (including the input neurons but +# excluding the output neurons) has a probability $p$ of being temporarily dropped out, meaning it will be +# entirely ignored during this training step, but it may be active during the next step. +# +# The +# hyperparameter $p$ is called the dropout rate, and it is typically set to 50%. After training, the neurons are not dropped anymore. +# It is viewed as one of the most popular regularization techniques. + +# ## Gradient Clipping +# +# A popular technique to lessen the exploding gradients problem is to simply clip the gradients during +# backpropagation so that they never exceed some threshold (this is mostly useful for recurrent neural +# networks). +# +# This technique is called Gradient Clipping. +# +# In general however, Batch +# Normalization is preferred. + +# ## A very nice website on Neural Networks +# +# You may find this [website](https://playground.tensorflow.org/#activation=tanh&batchSize=10&dataset=circle®Dataset=reg-plane&learningRate=0.03®ularizationRate=0&noise=0&networkShape=4,2&seed=0.29243&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false) very useful. + +# ## A top-down perspective on Neural networks +# +# The first thing we would like to do is divide the data into two or three +# parts. A training set, a validation or dev (development) set, and a +# test set. The test set is the data on which we want to make +# predictions. The dev set is a subset of the training data we use to +# check how well we are doing out-of-sample, after training the model on +# the training dataset. We use the validation error as a proxy for the +# test error in order to make tweaks to our model. It is crucial that we +# do not use any of the test data to train the algorithm. This is a +# cardinal sin in ML. Then: +# +# * Estimate optimal error rate +# +# * Minimize underfitting (bias) on training data set. +# +# * Make sure you are not overfitting. +# +# If the validation and test sets are drawn from the same distributions, +# then a good performance on the validation set should lead to similarly +# good performance on the test set. +# +# However, sometimes +# the training data and test data differ in subtle ways because, for +# example, they are collected using slightly different methods, or +# because it is cheaper to collect data in one way versus another. In +# this case, there can be a mismatch between the training and test +# data. This can lead to the neural network overfitting these small +# differences between the test and training sets, and a poor performance +# on the test set despite having a good performance on the validation +# set. To rectify this, Andrew Ng suggests making two validation or dev +# sets, one constructed from the training data and one constructed from +# the test data. The difference between the performance of the algorithm +# on these two validation sets quantifies the train-test mismatch. This +# can serve as another important diagnostic when using DNNs for +# supervised learning. + +# ## Limitations of supervised learning with deep networks +# +# Like all statistical methods, supervised learning using neural +# networks has important limitations. This is especially important when +# one seeks to apply these methods, especially to physics problems. Like +# all tools, DNNs are not a universal solution. Often, the same or +# better performance on a task can be achieved by using a few +# hand-engineered features (or even a collection of random +# features). +# +# Here we list some of the important limitations of supervised neural network based models. +# +# * **Need labeled data**. All supervised learning methods, DNNs for supervised learning require labeled data. Often, labeled data is harder to acquire than unlabeled data (e.g. one must pay for human experts to label images). +# +# * **Supervised neural networks are extremely data intensive.** DNNs are data hungry. They perform best when data is plentiful. This is doubly so for supervised methods where the data must also be labeled. The utility of DNNs is extremely limited if data is hard to acquire or the datasets are small (hundreds to a few thousand samples). In this case, the performance of other methods that utilize hand-engineered features can exceed that of DNNs. +# +# * **Homogeneous data.** Almost all DNNs deal with homogeneous data of one type. It is very hard to design architectures that mix and match data types (i.e. some continuous variables, some discrete variables, some time series). In applications beyond images, video, and language, this is often what is required. In contrast, ensemble models like random forests or gradient-boosted trees have no difficulty handling mixed data types. +# +# * **Many problems are not about prediction.** In natural science we are often interested in learning something about the underlying distribution that generates the data. In this case, it is often difficult to cast these ideas in a supervised learning setting. While the problems are related, it is possible to make good predictions with a *wrong* model. The model might or might not be useful for understanding the underlying science. +# +# Some of these remarks are particular to DNNs, others are shared by all supervised learning methods. This motivates the use of unsupervised methods which in part circumvent these problems. + +# ## Solving ODEs with Deep Learning +# +# The Universal Approximation Theorem states that a neural network can +# approximate any function at a single hidden layer along with one input +# and output layer to any given precision. +# +# **Book on solving differential equations with ML methods.** +# +# [An Introduction to Neural Network Methods for Differential Equations](https://www.springer.com/gp/book/9789401798150), by Yadav and Kumar. +# +# **Master thesis on applying deep learning to problems in mechanics.** +# +# [Using Deep Reinforcement Learning for Active Flow Control](https://www.duo.uio.no/handle/10852/79212), by Marius Holm +# +# **Thanks to Kristine Baluka Hein.** +# +# The lectures on differential equations were developed by Kristine Baluka Hein, now PhD student at IFI. +# A great thanks to Kristine. + +# ## Ordinary Differential Equations +# +# An ordinary differential equation (ODE) is an equation involving functions having one variable. +# +# In general, an ordinary differential equation looks like + +# +#
    +# +# $$ +# \begin{equation} \label{ode} \tag{1} +# f\left(x, \, g(x), \, g'(x), \, g''(x), \, \dots \, , \, g^{(n)}(x)\right) = 0 +# \end{equation} +# $$ + +# where $g(x)$ is the function to find, and $g^{(n)}(x)$ is the $n$-th derivative of $g(x)$. +# +# The $f\left(x, g(x), g'(x), g''(x), \, \dots \, , g^{(n)}(x)\right)$ is just a way to write that there is an expression involving $x$ and $g(x), \ g'(x), \ g''(x), \, \dots \, , \text{ and } g^{(n)}(x)$ on the left side of the equality sign in ([1](#ode)). +# The highest order of derivative, that is the value of $n$, determines to the order of the equation. +# The equation is referred to as a $n$-th order ODE. +# Along with ([1](#ode)), some additional conditions of the function $g(x)$ are typically given +# for the solution to be unique. + +# ## The trial solution +# +# Let the trial solution $g_t(x)$ be + +# +#
    +# +# $$ +# \begin{equation} +# g_t(x) = h_1(x) + h_2(x,N(x,P)) +# \label{_auto1} \tag{2} +# \end{equation} +# $$ + +# where $h_1(x)$ is a function that makes $g_t(x)$ satisfy a given set +# of conditions, $N(x,P)$ a neural network with weights and biases +# described by $P$ and $h_2(x, N(x,P))$ some expression involving the +# neural network. The role of the function $h_2(x, N(x,P))$, is to +# ensure that the output from $N(x,P)$ is zero when $g_t(x)$ is +# evaluated at the values of $x$ where the given conditions must be +# satisfied. The function $h_1(x)$ should alone make $g_t(x)$ satisfy +# the conditions. +# +# But what about the network $N(x,P)$? +# +# As described previously, an optimization method could be used to minimize the parameters of a neural network, that being its weights and biases, through backward propagation. + +# ## Minimization process +# +# For the minimization to be defined, we need to have a cost function at hand to minimize. +# +# It is given that $f\left(x, \, g(x), \, g'(x), \, g''(x), \, \dots \, , \, g^{(n)}(x)\right)$ should be equal to zero in ([1](#ode)). +# We can choose to consider the mean squared error as the cost function for an input $x$. +# Since we are looking at one input, the cost function is just $f$ squared. +# The cost function $c\left(x, P \right)$ can therefore be expressed as + +# $$ +# C\left(x, P\right) = \big(f\left(x, \, g(x), \, g'(x), \, g''(x), \, \dots \, , \, g^{(n)}(x)\right)\big)^2 +# $$ + +# If $N$ inputs are given as a vector $\boldsymbol{x}$ with elements $x_i$ for $i = 1,\dots,N$, +# the cost function becomes + +# +#
    +# +# $$ +# \begin{equation} \label{cost} \tag{3} +# C\left(\boldsymbol{x}, P\right) = \frac{1}{N} \sum_{i=1}^N \big(f\left(x_i, \, g(x_i), \, g'(x_i), \, g''(x_i), \, \dots \, , \, g^{(n)}(x_i)\right)\big)^2 +# \end{equation} +# $$ + +# The neural net should then find the parameters $P$ that minimizes the cost function in +# ([3](#cost)) for a set of $N$ training samples $x_i$. + +# ## Minimizing the cost function using gradient descent and automatic differentiation +# +# To perform the minimization using gradient descent, the gradient of $C\left(\boldsymbol{x}, P\right)$ is needed. +# It might happen so that finding an analytical expression of the gradient of $C(\boldsymbol{x}, P)$ from ([3](#cost)) gets too messy, depending on which cost function one desires to use. +# +# Luckily, there exists libraries that makes the job for us through automatic differentiation. +# Automatic differentiation is a method of finding the derivatives numerically with very high precision. + +# ## Example: Exponential decay +# +# An exponential decay of a quantity $g(x)$ is described by the equation + +# +#
    +# +# $$ +# \begin{equation} \label{solve_expdec} \tag{4} +# g'(x) = -\gamma g(x) +# \end{equation} +# $$ + +# with $g(0) = g_0$ for some chosen initial value $g_0$. +# +# The analytical solution of ([4](#solve_expdec)) is + +# +#
    +# +# $$ +# \begin{equation} +# g(x) = g_0 \exp\left(-\gamma x\right) +# \label{_auto2} \tag{5} +# \end{equation} +# $$ + +# Having an analytical solution at hand, it is possible to use it to compare how well a neural network finds a solution of ([4](#solve_expdec)). + +# ## The function to solve for +# +# The program will use a neural network to solve + +# +#
    +# +# $$ +# \begin{equation} \label{solveode} \tag{6} +# g'(x) = -\gamma g(x) +# \end{equation} +# $$ + +# where $g(0) = g_0$ with $\gamma$ and $g_0$ being some chosen values. +# +# In this example, $\gamma = 2$ and $g_0 = 10$. + +# ## The trial solution +# To begin with, a trial solution $g_t(t)$ must be chosen. A general trial solution for ordinary differential equations could be + +# $$ +# g_t(x, P) = h_1(x) + h_2(x, N(x, P)) +# $$ + +# with $h_1(x)$ ensuring that $g_t(x)$ satisfies some conditions and $h_2(x,N(x, P))$ an expression involving $x$ and the output from the neural network $N(x,P)$ with $P $ being the collection of the weights and biases for each layer. For now, it is assumed that the network consists of one input layer, one hidden layer, and one output layer. + +# ## Setup of Network +# +# In this network, there are no weights and bias at the input layer, so $P = \{ P_{\text{hidden}}, P_{\text{output}} \}$. +# If there are $N_{\text{hidden} }$ neurons in the hidden layer, then $P_{\text{hidden}}$ is a $N_{\text{hidden} } \times (1 + N_{\text{input}})$ matrix, given that there are $N_{\text{input}}$ neurons in the input layer. +# +# The first column in $P_{\text{hidden} }$ represents the bias for each neuron in the hidden layer and the second column represents the weights for each neuron in the hidden layer from the input layer. +# If there are $N_{\text{output} }$ neurons in the output layer, then $P_{\text{output}} $ is a $N_{\text{output} } \times (1 + N_{\text{hidden} })$ matrix. +# +# Its first column represents the bias of each neuron and the remaining columns represents the weights to each neuron. +# +# It is given that $g(0) = g_0$. The trial solution must fulfill this condition to be a proper solution of ([6](#solveode)). A possible way to ensure that $g_t(0, P) = g_0$, is to let $F(N(x,P)) = x \cdot N(x,P)$ and $A(x) = g_0$. This gives the following trial solution: + +# +#
    +# +# $$ +# \begin{equation} \label{trial} \tag{7} +# g_t(x, P) = g_0 + x \cdot N(x, P) +# \end{equation} +# $$ + +# ## Reformulating the problem +# +# We wish that our neural network manages to minimize a given cost function. +# +# A reformulation of out equation, ([6](#solveode)), must therefore be done, +# such that it describes the problem a neural network can solve for. +# +# The neural network must find the set of weights and biases $P$ such that the trial solution in ([7](#trial)) satisfies ([6](#solveode)). +# +# The trial solution + +# $$ +# g_t(x, P) = g_0 + x \cdot N(x, P) +# $$ + +# has been chosen such that it already solves the condition $g(0) = g_0$. What remains, is to find $P$ such that + +# +#
    +# +# $$ +# \begin{equation} \label{nnmin} \tag{8} +# g_t'(x, P) = - \gamma g_t(x, P) +# \end{equation} +# $$ + +# is fulfilled as *best as possible*. + +# ## More technicalities +# +# The left hand side and right hand side of ([8](#nnmin)) must be computed separately, and then the neural network must choose weights and biases, contained in $P$, such that the sides are equal as best as possible. +# This means that the absolute or squared difference between the sides must be as close to zero, ideally equal to zero. +# In this case, the difference squared shows to be an appropriate measurement of how erroneous the trial solution is with respect to $P$ of the neural network. +# +# This gives the following cost function our neural network must solve for: + +# $$ +# \min_{P}\Big\{ \big(g_t'(x, P) - ( -\gamma g_t(x, P) \big)^2 \Big\} +# $$ + +# (the notation $\min_{P}\{ f(x, P) \}$ means that we desire to find $P$ that yields the minimum of $f(x, P)$) +# +# or, in terms of weights and biases for the hidden and output layer in our network: + +# $$ +# \min_{P_{\text{hidden} }, \ P_{\text{output} }}\Big\{ \big(g_t'(x, \{ P_{\text{hidden} }, P_{\text{output} }\}) - ( -\gamma g_t(x, \{ P_{\text{hidden} }, P_{\text{output} }\}) \big)^2 \Big\} +# $$ + +# for an input value $x$. + +# ## More details +# +# If the neural network evaluates $g_t(x, P)$ at more values for $x$, say $N$ values $x_i$ for $i = 1, \dots, N$, then the *total* error to minimize becomes + +# +#
    +# +# $$ +# \begin{equation} \label{min} \tag{9} +# \min_{P}\Big\{\frac{1}{N} \sum_{i=1}^N \big(g_t'(x_i, P) - ( -\gamma g_t(x_i, P) \big)^2 \Big\} +# \end{equation} +# $$ + +# Letting $\boldsymbol{x}$ be a vector with elements $x_i$ and $C(\boldsymbol{x}, P) = \frac{1}{N} \sum_i \big(g_t'(x_i, P) - ( -\gamma g_t(x_i, P) \big)^2$ denote the cost function, the minimization problem that our network must solve, becomes + +# $$ +# \min_{P} C(\boldsymbol{x}, P) +# $$ + +# In terms of $P_{\text{hidden} }$ and $P_{\text{output} }$, this could also be expressed as +# +# $$ +# \min_{P_{\text{hidden} }, \ P_{\text{output} }} C(\boldsymbol{x}, \{P_{\text{hidden} }, P_{\text{output} }\}) +# $$ + +# ## A possible implementation of a neural network +# +# For simplicity, it is assumed that the input is an array $\boldsymbol{x} = (x_1, \dots, x_N)$ with $N$ elements. It is at these points the neural network should find $P$ such that it fulfills ([9](#min)). +# +# First, the neural network must feed forward the inputs. +# This means that $\boldsymbol{x}s$ must be passed through an input layer, a hidden layer and a output layer. The input layer in this case, does not need to process the data any further. +# The input layer will consist of $N_{\text{input} }$ neurons, passing its element to each neuron in the hidden layer. The number of neurons in the hidden layer will be $N_{\text{hidden} }$. + +# ## Technicalities +# +# For the $i$-th in the hidden layer with weight $w_i^{\text{hidden} }$ and bias $b_i^{\text{hidden} }$, the weighting from the $j$-th neuron at the input layer is: + +# $$ +# \begin{aligned} +# z_{i,j}^{\text{hidden}} &= b_i^{\text{hidden}} + w_i^{\text{hidden}}x_j \\ +# &= +# \begin{pmatrix} +# b_i^{\text{hidden}} & w_i^{\text{hidden}} +# \end{pmatrix} +# \begin{pmatrix} +# 1 \\ +# x_j +# \end{pmatrix} +# \end{aligned} +# $$ + +# ## Final technicalities I +# +# The result after weighting the inputs at the $i$-th hidden neuron can be written as a vector: + +# $$ +# \begin{aligned} +# \boldsymbol{z}_{i}^{\text{hidden}} &= \Big( b_i^{\text{hidden}} + w_i^{\text{hidden}}x_1 , \ b_i^{\text{hidden}} + w_i^{\text{hidden}} x_2, \ \dots \, , \ b_i^{\text{hidden}} + w_i^{\text{hidden}} x_N\Big) \\ +# &= +# \begin{pmatrix} +# b_i^{\text{hidden}} & w_i^{\text{hidden}} +# \end{pmatrix} +# \begin{pmatrix} +# 1 & 1 & \dots & 1 \\ +# x_1 & x_2 & \dots & x_N +# \end{pmatrix} \\ +# &= \boldsymbol{p}_{i, \text{hidden}}^T X +# \end{aligned} +# $$ + +# ## Final technicalities II +# +# The vector $\boldsymbol{p}_{i, \text{hidden}}^T$ constitutes each row in $P_{\text{hidden} }$, which contains the weights for the neural network to minimize according to ([9](#min)). +# +# After having found $\boldsymbol{z}_{i}^{\text{hidden}} $ for every $i$-th neuron within the hidden layer, the vector will be sent to an activation function $a_i(\boldsymbol{z})$. +# +# In this example, the sigmoid function has been chosen to be the activation function for each hidden neuron: + +# $$ +# f(z) = \frac{1}{1 + \exp{(-z)}} +# $$ + +# It is possible to use other activations functions for the hidden layer also. +# +# The output $\boldsymbol{x}_i^{\text{hidden}}$ from each $i$-th hidden neuron is: +# +# $$ +# \boldsymbol{x}_i^{\text{hidden} } = f\big( \boldsymbol{z}_{i}^{\text{hidden}} \big) +# $$ +# +# The outputs $\boldsymbol{x}_i^{\text{hidden} } $ are then sent to the output layer. +# +# The output layer consists of one neuron in this case, and combines the +# output from each of the neurons in the hidden layers. The output layer +# combines the results from the hidden layer using some weights $w_i^{\text{output}}$ +# and biases $b_i^{\text{output}}$. In this case, +# it is assumes that the number of neurons in the output layer is one. + +# ## Final technicalities III +# +# The procedure of weighting the output neuron $j$ in the hidden layer to the $i$-th neuron in the output layer is similar as for the hidden layer described previously. + +# $$ +# \begin{aligned} +# z_{1,j}^{\text{output}} & = +# \begin{pmatrix} +# b_1^{\text{output}} & \boldsymbol{w}_1^{\text{output}} +# \end{pmatrix} +# \begin{pmatrix} +# 1 \\ +# \boldsymbol{x}_j^{\text{hidden}} +# \end{pmatrix} +# \end{aligned} +# $$ + +# ## Final technicalities IV +# +# Expressing $z_{1,j}^{\text{output}}$ as a vector gives the following way of weighting the inputs from the hidden layer: + +# $$ +# \boldsymbol{z}_{1}^{\text{output}} = +# \begin{pmatrix} +# b_1^{\text{output}} & \boldsymbol{w}_1^{\text{output}} +# \end{pmatrix} +# \begin{pmatrix} +# 1 & 1 & \dots & 1 \\ +# \boldsymbol{x}_1^{\text{hidden}} & \boldsymbol{x}_2^{\text{hidden}} & \dots & \boldsymbol{x}_N^{\text{hidden}} +# \end{pmatrix} +# $$ + +# In this case we seek a continuous range of values since we are approximating a function. This means that after computing $\boldsymbol{z}_{1}^{\text{output}}$ the neural network has finished its feed forward step, and $\boldsymbol{z}_{1}^{\text{output}}$ is the final output of the network. + +# ## Back propagation +# +# The next step is to decide how the parameters should be changed such that they minimize the cost function. +# +# The chosen cost function for this problem is + +# $$ +# C(\boldsymbol{x}, P) = \frac{1}{N} \sum_i \big(g_t'(x_i, P) - ( -\gamma g_t(x_i, P) \big)^2 +# $$ + +# In order to minimize the cost function, an optimization method must be chosen. +# +# Here, gradient descent with a constant step size has been chosen. + +# ## Gradient descent +# +# The idea of the gradient descent algorithm is to update parameters in +# a direction where the cost function decreases goes to a minimum. +# +# In general, the update of some parameters $\boldsymbol{\omega}$ given a cost +# function defined by some weights $\boldsymbol{\omega}$, $C(\boldsymbol{x}, +# \boldsymbol{\omega})$, goes as follows: + +# $$ +# \boldsymbol{\omega}_{\text{new} } = \boldsymbol{\omega} - \lambda \nabla_{\boldsymbol{\omega}} C(\boldsymbol{x}, \boldsymbol{\omega}) +# $$ + +# for a number of iterations or until $ \big|\big| \boldsymbol{\omega}_{\text{new} } - \boldsymbol{\omega} \big|\big|$ becomes smaller than some given tolerance. +# +# The value of $\lambda$ decides how large steps the algorithm must take +# in the direction of $ \nabla_{\boldsymbol{\omega}} C(\boldsymbol{x}, \boldsymbol{\omega})$. +# The notation $\nabla_{\boldsymbol{\omega}}$ express the gradient with respect +# to the elements in $\boldsymbol{\omega}$. +# +# In our case, we have to minimize the cost function $C(\boldsymbol{x}, P)$ with +# respect to the two sets of weights and biases, that is for the hidden +# layer $P_{\text{hidden} }$ and for the output layer $P_{\text{output} +# }$ . +# +# This means that $P_{\text{hidden} }$ and $P_{\text{output} }$ is updated by + +# $$ +# \begin{aligned} +# P_{\text{hidden},\text{new}} &= P_{\text{hidden}} - \lambda \nabla_{P_{\text{hidden}}} C(\boldsymbol{x}, P) \\ +# P_{\text{output},\text{new}} &= P_{\text{output}} - \lambda \nabla_{P_{\text{output}}} C(\boldsymbol{x}, P) +# \end{aligned} +# $$ + +# ## The code for solving the ODE + +# In[24]: + + +import autograd.numpy as np +from autograd import grad, elementwise_grad +import autograd.numpy.random as npr +from matplotlib import pyplot as plt + +def sigmoid(z): + return 1/(1 + np.exp(-z)) + +# Assuming one input, hidden, and output layer +def neural_network(params, x): + + # Find the weights (including and biases) for the hidden and output layer. + # Assume that params is a list of parameters for each layer. + # The biases are the first element for each array in params, + # and the weights are the remaning elements in each array in params. + + w_hidden = params[0] + w_output = params[1] + + # Assumes input x being an one-dimensional array + num_values = np.size(x) + x = x.reshape(-1, num_values) + + # Assume that the input layer does nothing to the input x + x_input = x + + ## Hidden layer: + + # Add a row of ones to include bias + x_input = np.concatenate((np.ones((1,num_values)), x_input ), axis = 0) + + z_hidden = np.matmul(w_hidden, x_input) + x_hidden = sigmoid(z_hidden) + + ## Output layer: + + # Include bias: + x_hidden = np.concatenate((np.ones((1,num_values)), x_hidden ), axis = 0) + + z_output = np.matmul(w_output, x_hidden) + x_output = z_output + + return x_output + +# The trial solution using the deep neural network: +def g_trial(x,params, g0 = 10): + return g0 + x*neural_network(params,x) + +# The right side of the ODE: +def g(x, g_trial, gamma = 2): + return -gamma*g_trial + +# The cost function: +def cost_function(P, x): + + # Evaluate the trial function with the current parameters P + g_t = g_trial(x,P) + + # Find the derivative w.r.t x of the neural network + d_net_out = elementwise_grad(neural_network,1)(P,x) + + # Find the derivative w.r.t x of the trial function + d_g_t = elementwise_grad(g_trial,0)(x,P) + + # The right side of the ODE + func = g(x, g_t) + + err_sqr = (d_g_t - func)**2 + cost_sum = np.sum(err_sqr) + + return cost_sum / np.size(err_sqr) + +# Solve the exponential decay ODE using neural network with one input, hidden, and output layer +def solve_ode_neural_network(x, num_neurons_hidden, num_iter, lmb): + ## Set up initial weights and biases + + # For the hidden layer + p0 = npr.randn(num_neurons_hidden, 2 ) + + # For the output layer + p1 = npr.randn(1, num_neurons_hidden + 1 ) # +1 since bias is included + + P = [p0, p1] + + print('Initial cost: %g'%cost_function(P, x)) + + ## Start finding the optimal weights using gradient descent + + # Find the Python function that represents the gradient of the cost function + # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer + cost_function_grad = grad(cost_function,0) + + # Let the update be done num_iter times + for i in range(num_iter): + # Evaluate the gradient at the current weights and biases in P. + # The cost_grad consist now of two arrays; + # one for the gradient w.r.t P_hidden and + # one for the gradient w.r.t P_output + cost_grad = cost_function_grad(P, x) + + P[0] = P[0] - lmb * cost_grad[0] + P[1] = P[1] - lmb * cost_grad[1] + + print('Final cost: %g'%cost_function(P, x)) + + return P + +def g_analytic(x, gamma = 2, g0 = 10): + return g0*np.exp(-gamma*x) + +# Solve the given problem +if __name__ == '__main__': + # Set seed such that the weight are initialized + # with same weights and biases for every run. + npr.seed(15) + + ## Decide the vales of arguments to the function to solve + N = 10 + x = np.linspace(0, 1, N) + + ## Set up the initial parameters + num_hidden_neurons = 10 + num_iter = 10000 + lmb = 0.001 + + # Use the network + P = solve_ode_neural_network(x, num_hidden_neurons, num_iter, lmb) + + # Print the deviation from the trial solution and true solution + res = g_trial(x,P) + res_analytical = g_analytic(x) + + print('Max absolute difference: %g'%np.max(np.abs(res - res_analytical))) + + # Plot the results + plt.figure(figsize=(10,10)) + + plt.title('Performance of neural network solving an ODE compared to the analytical solution') + plt.plot(x, res_analytical) + plt.plot(x, res[0,:]) + plt.legend(['analytical','nn']) + plt.xlabel('x') + plt.ylabel('g(x)') + plt.show() + + +# ## The network with one input layer, specified number of hidden layers, and one output layer +# +# It is also possible to extend the construction of our network into a more general one, allowing the network to contain more than one hidden layers. +# +# The number of neurons within each hidden layer are given as a list of integers in the program below. + +# In[25]: + + +import autograd.numpy as np +from autograd import grad, elementwise_grad +import autograd.numpy.random as npr +from matplotlib import pyplot as plt + +def sigmoid(z): + return 1/(1 + np.exp(-z)) + +# The neural network with one input layer and one output layer, +# but with number of hidden layers specified by the user. +def deep_neural_network(deep_params, x): + # N_hidden is the number of hidden layers + + N_hidden = np.size(deep_params) - 1 # -1 since params consists of + # parameters to all the hidden + # layers AND the output layer. + + # Assumes input x being an one-dimensional array + num_values = np.size(x) + x = x.reshape(-1, num_values) + + # Assume that the input layer does nothing to the input x + x_input = x + + # Due to multiple hidden layers, define a variable referencing to the + # output of the previous layer: + x_prev = x_input + + ## Hidden layers: + + for l in range(N_hidden): + # From the list of parameters P; find the correct weigths and bias for this layer + w_hidden = deep_params[l] + + # Add a row of ones to include bias + x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0) + + z_hidden = np.matmul(w_hidden, x_prev) + x_hidden = sigmoid(z_hidden) + + # Update x_prev such that next layer can use the output from this layer + x_prev = x_hidden + + ## Output layer: + + # Get the weights and bias for this layer + w_output = deep_params[-1] + + # Include bias: + x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0) + + z_output = np.matmul(w_output, x_prev) + x_output = z_output + + return x_output + +# The trial solution using the deep neural network: +def g_trial_deep(x,params, g0 = 10): + return g0 + x*deep_neural_network(params, x) + +# The right side of the ODE: +def g(x, g_trial, gamma = 2): + return -gamma*g_trial + +# The same cost function as before, but calls deep_neural_network instead. +def cost_function_deep(P, x): + + # Evaluate the trial function with the current parameters P + g_t = g_trial_deep(x,P) + + # Find the derivative w.r.t x of the neural network + d_net_out = elementwise_grad(deep_neural_network,1)(P,x) + + # Find the derivative w.r.t x of the trial function + d_g_t = elementwise_grad(g_trial_deep,0)(x,P) + + # The right side of the ODE + func = g(x, g_t) + + err_sqr = (d_g_t - func)**2 + cost_sum = np.sum(err_sqr) + + return cost_sum / np.size(err_sqr) + +# Solve the exponential decay ODE using neural network with one input and one output layer, +# but with specified number of hidden layers from the user. +def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb): + # num_hidden_neurons is now a list of number of neurons within each hidden layer + + # The number of elements in the list num_hidden_neurons thus represents + # the number of hidden layers. + + # Find the number of hidden layers: + N_hidden = np.size(num_neurons) + + ## Set up initial weights and biases + + # Initialize the list of parameters: + P = [None]*(N_hidden + 1) # + 1 to include the output layer + + P[0] = npr.randn(num_neurons[0], 2 ) + for l in range(1,N_hidden): + P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias + + # For the output layer + P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included + + print('Initial cost: %g'%cost_function_deep(P, x)) + + ## Start finding the optimal weights using gradient descent + + # Find the Python function that represents the gradient of the cost function + # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer + cost_function_deep_grad = grad(cost_function_deep,0) + + # Let the update be done num_iter times + for i in range(num_iter): + # Evaluate the gradient at the current weights and biases in P. + # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases + # in the hidden layers and output layers evaluated at x. + cost_deep_grad = cost_function_deep_grad(P, x) + + for l in range(N_hidden+1): + P[l] = P[l] - lmb * cost_deep_grad[l] + + print('Final cost: %g'%cost_function_deep(P, x)) + + return P + +def g_analytic(x, gamma = 2, g0 = 10): + return g0*np.exp(-gamma*x) + +# Solve the given problem +if __name__ == '__main__': + npr.seed(15) + + ## Decide the vales of arguments to the function to solve + N = 10 + x = np.linspace(0, 1, N) + + ## Set up the initial parameters + num_hidden_neurons = np.array([10,10]) + num_iter = 10000 + lmb = 0.001 + + P = solve_ode_deep_neural_network(x, num_hidden_neurons, num_iter, lmb) + + res = g_trial_deep(x,P) + res_analytical = g_analytic(x) + + plt.figure(figsize=(10,10)) + + plt.title('Performance of a deep neural network solving an ODE compared to the analytical solution') + plt.plot(x, res_analytical) + plt.plot(x, res[0,:]) + plt.legend(['analytical','dnn']) + plt.ylabel('g(x)') + plt.show() + + +# ## Example: Population growth +# +# A logistic model of population growth assumes that a population converges toward an equilibrium. +# The population growth can be modeled by + +# +#
    +# +# $$ +# \begin{equation} \label{log} \tag{10} +# g'(t) = \alpha g(t)(A - g(t)) +# \end{equation} +# $$ + +# where $g(t)$ is the population density at time $t$, $\alpha > 0$ the growth rate and $A > 0$ is the maximum population number in the environment. +# Also, at $t = 0$ the population has the size $g(0) = g_0$, where $g_0$ is some chosen constant. +# +# In this example, similar network as for the exponential decay using Autograd has been used to solve the equation. However, as the implementation might suffer from e.g numerical instability +# and high execution time (this might be more apparent in the examples solving PDEs), +# using a library like TensorFlow is recommended. +# Here, we stay with a more simple approach and implement for comparison, the simple forward Euler method. + +# ## Setting up the problem +# +# Here, we will model a population $g(t)$ in an environment having carrying capacity $A$. +# The population follows the model + +# +#
    +# +# $$ +# \begin{equation} \label{solveode_population} \tag{11} +# g'(t) = \alpha g(t)(A - g(t)) +# \end{equation} +# $$ + +# where $g(0) = g_0$. +# +# In this example, we let $\alpha = 2$, $A = 1$, and $g_0 = 1.2$. + +# ## The trial solution +# +# We will get a slightly different trial solution, as the boundary conditions are different +# compared to the case for exponential decay. +# +# A possible trial solution satisfying the condition $g(0) = g_0$ could be +# +# $$ +# h_1(t) = g_0 + t \cdot N(t,P) +# $$ +# +# with $N(t,P)$ being the output from the neural network with weights and biases for each layer collected in the set $P$. +# +# The analytical solution is +# +# $$ +# g(t) = \frac{Ag_0}{g_0 + (A - g_0)\exp(-\alpha A t)} +# $$ + +# ## The program using Autograd +# +# The network will be the similar as for the exponential decay example, but with some small modifications for our problem. + +# In[26]: + + +import autograd.numpy as np +from autograd import grad, elementwise_grad +import autograd.numpy.random as npr +from matplotlib import pyplot as plt + +def sigmoid(z): + return 1/(1 + np.exp(-z)) + +# Function to get the parameters. +# Done such that one can easily change the paramaters after one's liking. +def get_parameters(): + alpha = 2 + A = 1 + g0 = 1.2 + return alpha, A, g0 + +def deep_neural_network(P, x): + # N_hidden is the number of hidden layers + N_hidden = np.size(P) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer + + # Assumes input x being an one-dimensional array + num_values = np.size(x) + x = x.reshape(-1, num_values) + + # Assume that the input layer does nothing to the input x + x_input = x + + # Due to multiple hidden layers, define a variable referencing to the + # output of the previous layer: + x_prev = x_input + + ## Hidden layers: + + for l in range(N_hidden): + # From the list of parameters P; find the correct weigths and bias for this layer + w_hidden = P[l] + + # Add a row of ones to include bias + x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0) + + z_hidden = np.matmul(w_hidden, x_prev) + x_hidden = sigmoid(z_hidden) + + # Update x_prev such that next layer can use the output from this layer + x_prev = x_hidden + + ## Output layer: + + # Get the weights and bias for this layer + w_output = P[-1] + + # Include bias: + x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0) + + z_output = np.matmul(w_output, x_prev) + x_output = z_output + + return x_output + + +def cost_function_deep(P, x): + + # Evaluate the trial function with the current parameters P + g_t = g_trial_deep(x,P) + + # Find the derivative w.r.t x of the trial function + d_g_t = elementwise_grad(g_trial_deep,0)(x,P) + + # The right side of the ODE + func = f(x, g_t) + + err_sqr = (d_g_t - func)**2 + cost_sum = np.sum(err_sqr) + + return cost_sum / np.size(err_sqr) + +# The right side of the ODE: +def f(x, g_trial): + alpha,A, g0 = get_parameters() + return alpha*g_trial*(A - g_trial) + +# The trial solution using the deep neural network: +def g_trial_deep(x, params): + alpha,A, g0 = get_parameters() + return g0 + x*deep_neural_network(params,x) + +# The analytical solution: +def g_analytic(t): + alpha,A, g0 = get_parameters() + return A*g0/(g0 + (A - g0)*np.exp(-alpha*A*t)) + +def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb): + # num_hidden_neurons is now a list of number of neurons within each hidden layer + + # Find the number of hidden layers: + N_hidden = np.size(num_neurons) + + ## Set up initial weigths and biases + + # Initialize the list of parameters: + P = [None]*(N_hidden + 1) # + 1 to include the output layer + + P[0] = npr.randn(num_neurons[0], 2 ) + for l in range(1,N_hidden): + P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias + + # For the output layer + P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included + + print('Initial cost: %g'%cost_function_deep(P, x)) + + ## Start finding the optimal weigths using gradient descent + + # Find the Python function that represents the gradient of the cost function + # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer + cost_function_deep_grad = grad(cost_function_deep,0) + + # Let the update be done num_iter times + for i in range(num_iter): + # Evaluate the gradient at the current weights and biases in P. + # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases + # in the hidden layers and output layers evaluated at x. + cost_deep_grad = cost_function_deep_grad(P, x) + + for l in range(N_hidden+1): + P[l] = P[l] - lmb * cost_deep_grad[l] + + print('Final cost: %g'%cost_function_deep(P, x)) + + return P + +if __name__ == '__main__': + npr.seed(4155) + + ## Decide the vales of arguments to the function to solve + Nt = 10 + T = 1 + t = np.linspace(0,T, Nt) + + ## Set up the initial parameters + num_hidden_neurons = [100, 50, 25] + num_iter = 1000 + lmb = 1e-3 + + P = solve_ode_deep_neural_network(t, num_hidden_neurons, num_iter, lmb) + + g_dnn_ag = g_trial_deep(t,P) + g_analytical = g_analytic(t) + + # Find the maximum absolute difference between the solutons: + diff_ag = np.max(np.abs(g_dnn_ag - g_analytical)) + print("The max absolute difference between the solutions is: %g"%diff_ag) + + plt.figure(figsize=(10,10)) + + plt.title('Performance of neural network solving an ODE compared to the analytical solution') + plt.plot(t, g_analytical) + plt.plot(t, g_dnn_ag[0,:]) + plt.legend(['analytical','nn']) + plt.xlabel('t') + plt.ylabel('g(t)') + + plt.show() + + +# ## Using forward Euler to solve the ODE +# +# A straightforward way of solving an ODE numerically, is to use Euler's method. +# +# Euler's method uses Taylor series to approximate the value at a function $f$ at a step $\Delta x$ from $x$: +# +# $$ +# f(x + \Delta x) \approx f(x) + \Delta x f'(x) +# $$ +# +# In our case, using Euler's method to approximate the value of $g$ at a step $\Delta t$ from $t$ yields + +# $$ +# \begin{aligned} +# g(t + \Delta t) &\approx g(t) + \Delta t g'(t) \\ +# &= g(t) + \Delta t \big(\alpha g(t)(A - g(t))\big) +# \end{aligned} +# $$ + +# along with the condition that $g(0) = g_0$. +# +# Let $t_i = i \cdot \Delta t$ where $\Delta t = \frac{T}{N_t-1}$ where $T$ is the final time our solver must solve for and $N_t$ the number of values for $t \in [0, T]$ for $i = 0, \dots, N_t-1$. +# +# For $i \geq 1$, we have that + +# $$ +# \begin{aligned} +# t_i &= i\Delta t \\ +# &= (i - 1)\Delta t + \Delta t \\ +# &= t_{i-1} + \Delta t +# \end{aligned} +# $$ + +# Now, if $g_i = g(t_i)$ then + +# +#
    +# +# $$ +# \begin{equation} +# \begin{aligned} +# g_i &= g(t_i) \\ +# &= g(t_{i-1} + \Delta t) \\ +# &\approx g(t_{i-1}) + \Delta t \big(\alpha g(t_{i-1})(A - g(t_{i-1}))\big) \\ +# &= g_{i-1} + \Delta t \big(\alpha g_{i-1}(A - g_{i-1})\big) +# \end{aligned} +# \end{equation} \label{odenum} \tag{12} +# $$ + +# for $i \geq 1$ and $g_0 = g(t_0) = g(0) = g_0$. +# +# Equation ([12](#odenum)) could be implemented in the following way, +# extending the program that uses the network using Autograd: + +# In[27]: + + +# Assume that all function definitions from the example program using Autograd +# are located here. + +if __name__ == '__main__': + npr.seed(4155) + + ## Decide the vales of arguments to the function to solve + Nt = 10 + T = 1 + t = np.linspace(0,T, Nt) + + ## Set up the initial parameters + num_hidden_neurons = [100,50,25] + num_iter = 1000 + lmb = 1e-3 + + P = solve_ode_deep_neural_network(t, num_hidden_neurons, num_iter, lmb) + + g_dnn_ag = g_trial_deep(t,P) + g_analytical = g_analytic(t) + + # Find the maximum absolute difference between the solutons: + diff_ag = np.max(np.abs(g_dnn_ag - g_analytical)) + print("The max absolute difference between the solutions is: %g"%diff_ag) + + plt.figure(figsize=(10,10)) + + plt.title('Performance of neural network solving an ODE compared to the analytical solution') + plt.plot(t, g_analytical) + plt.plot(t, g_dnn_ag[0,:]) + plt.legend(['analytical','nn']) + plt.xlabel('t') + plt.ylabel('g(t)') + + ## Find an approximation to the funtion using forward Euler + + alpha, A, g0 = get_parameters() + dt = T/(Nt - 1) + + # Perform forward Euler to solve the ODE + g_euler = np.zeros(Nt) + g_euler[0] = g0 + + for i in range(1,Nt): + g_euler[i] = g_euler[i-1] + dt*(alpha*g_euler[i-1]*(A - g_euler[i-1])) + + # Print the errors done by each method + diff1 = np.max(np.abs(g_euler - g_analytical)) + diff2 = np.max(np.abs(g_dnn_ag[0,:] - g_analytical)) + + print('Max absolute difference between Euler method and analytical: %g'%diff1) + print('Max absolute difference between deep neural network and analytical: %g'%diff2) + + # Plot results + plt.figure(figsize=(10,10)) + + plt.plot(t,g_euler) + plt.plot(t,g_analytical) + plt.plot(t,g_dnn_ag[0,:]) + + plt.legend(['euler','analytical','dnn']) + plt.xlabel('Time t') + plt.ylabel('g(t)') + + plt.show() + + +# ## Example: Solving the one dimensional Poisson equation +# +# The Poisson equation for $g(x)$ in one dimension is + +# +#
    +# +# $$ +# \begin{equation} \label{poisson} \tag{13} +# -g''(x) = f(x) +# \end{equation} +# $$ + +# where $f(x)$ is a given function for $x \in (0,1)$. +# +# The conditions that $g(x)$ is chosen to fulfill, are + +# $$ +# \begin{align*} +# g(0) &= 0 \\ +# g(1) &= 0 +# \end{align*} +# $$ + +# This equation can be solved numerically using programs where e.g Autograd and TensorFlow are used. +# The results from the networks can then be compared to the analytical solution. +# In addition, it could be interesting to see how a typical method for numerically solving second order ODEs compares to the neural networks. + +# ## The specific equation to solve for +# +# Here, the function $g(x)$ to solve for follows the equation + +# $$ +# -g''(x) = f(x),\qquad x \in (0,1) +# $$ + +# where $f(x)$ is a given function, along with the chosen conditions + +# +#
    +# +# $$ +# \begin{aligned} +# g(0) = g(1) = 0 +# \end{aligned}\label{cond} \tag{14} +# $$ + +# In this example, we consider the case when $f(x) = (3x + x^2)\exp(x)$. +# +# For this case, a possible trial solution satisfying the conditions could be + +# $$ +# g_t(x) = x \cdot (1-x) \cdot N(P,x) +# $$ + +# The analytical solution for this problem is + +# $$ +# g(x) = x(1 - x)\exp(x) +# $$ + +# ## Solving the equation using Autograd + +# In[28]: + + +import autograd.numpy as np +from autograd import grad, elementwise_grad +import autograd.numpy.random as npr +from matplotlib import pyplot as plt + +def sigmoid(z): + return 1/(1 + np.exp(-z)) + +def deep_neural_network(deep_params, x): + # N_hidden is the number of hidden layers + N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer + + # Assumes input x being an one-dimensional array + num_values = np.size(x) + x = x.reshape(-1, num_values) + + # Assume that the input layer does nothing to the input x + x_input = x + + # Due to multiple hidden layers, define a variable referencing to the + # output of the previous layer: + x_prev = x_input + + ## Hidden layers: + + for l in range(N_hidden): + # From the list of parameters P; find the correct weigths and bias for this layer + w_hidden = deep_params[l] + + # Add a row of ones to include bias + x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0) + + z_hidden = np.matmul(w_hidden, x_prev) + x_hidden = sigmoid(z_hidden) + + # Update x_prev such that next layer can use the output from this layer + x_prev = x_hidden + + ## Output layer: + + # Get the weights and bias for this layer + w_output = deep_params[-1] + + # Include bias: + x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0) + + z_output = np.matmul(w_output, x_prev) + x_output = z_output + + return x_output + +def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb): + # num_hidden_neurons is now a list of number of neurons within each hidden layer + + # Find the number of hidden layers: + N_hidden = np.size(num_neurons) + + ## Set up initial weigths and biases + + # Initialize the list of parameters: + P = [None]*(N_hidden + 1) # + 1 to include the output layer + + P[0] = npr.randn(num_neurons[0], 2 ) + for l in range(1,N_hidden): + P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias + + # For the output layer + P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included + + print('Initial cost: %g'%cost_function_deep(P, x)) + + ## Start finding the optimal weigths using gradient descent + + # Find the Python function that represents the gradient of the cost function + # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer + cost_function_deep_grad = grad(cost_function_deep,0) + + # Let the update be done num_iter times + for i in range(num_iter): + # Evaluate the gradient at the current weights and biases in P. + # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases + # in the hidden layers and output layers evaluated at x. + cost_deep_grad = cost_function_deep_grad(P, x) + + for l in range(N_hidden+1): + P[l] = P[l] - lmb * cost_deep_grad[l] + + print('Final cost: %g'%cost_function_deep(P, x)) + + return P + +## Set up the cost function specified for this Poisson equation: + +# The right side of the ODE +def f(x): + return (3*x + x**2)*np.exp(x) + +def cost_function_deep(P, x): + + # Evaluate the trial function with the current parameters P + g_t = g_trial_deep(x,P) + + # Find the derivative w.r.t x of the trial function + d2_g_t = elementwise_grad(elementwise_grad(g_trial_deep,0))(x,P) + + right_side = f(x) + + err_sqr = (-d2_g_t - right_side)**2 + cost_sum = np.sum(err_sqr) + + return cost_sum/np.size(err_sqr) + +# The trial solution: +def g_trial_deep(x,P): + return x*(1-x)*deep_neural_network(P,x) + +# The analytic solution; +def g_analytic(x): + return x*(1-x)*np.exp(x) + +if __name__ == '__main__': + npr.seed(4155) + + ## Decide the vales of arguments to the function to solve + Nx = 10 + x = np.linspace(0,1, Nx) + + ## Set up the initial parameters + num_hidden_neurons = [200,100] + num_iter = 1000 + lmb = 1e-3 + + P = solve_ode_deep_neural_network(x, num_hidden_neurons, num_iter, lmb) + + g_dnn_ag = g_trial_deep(x,P) + g_analytical = g_analytic(x) + + # Find the maximum absolute difference between the solutons: + max_diff = np.max(np.abs(g_dnn_ag - g_analytical)) + print("The max absolute difference between the solutions is: %g"%max_diff) + + plt.figure(figsize=(10,10)) + + plt.title('Performance of neural network solving an ODE compared to the analytical solution') + plt.plot(x, g_analytical) + plt.plot(x, g_dnn_ag[0,:]) + plt.legend(['analytical','nn']) + plt.xlabel('x') + plt.ylabel('g(x)') + plt.show() + + +# ## Comparing with a numerical scheme +# +# The Poisson equation is possible to solve using Taylor series to approximate the second derivative. +# +# Using Taylor series, the second derivative can be expressed as +# +# $$ +# g''(x) = \frac{g(x + \Delta x) - 2g(x) + g(x-\Delta x)}{\Delta x^2} + E_{\Delta x}(x) +# $$ +# +# where $\Delta x$ is a small step size and $E_{\Delta x}(x)$ being the error term. +# +# Looking away from the error terms gives an approximation to the second derivative: + +# +#
    +# +# $$ +# \begin{equation} \label{approx} \tag{15} +# g''(x) \approx \frac{g(x + \Delta x) - 2g(x) + g(x-\Delta x)}{\Delta x^2} +# \end{equation} +# $$ + +# If $x_i = i \Delta x = x_{i-1} + \Delta x$ and $g_i = g(x_i)$ for $i = 1,\dots N_x - 2$ with $N_x$ being the number of values for $x$, ([15](#approx)) becomes + +# $$ +# \begin{aligned} +# g''(x_i) &\approx \frac{g(x_i + \Delta x) - 2g(x_i) + g(x_i -\Delta x)}{\Delta x^2} \\ +# &= \frac{g_{i+1} - 2g_i + g_{i-1}}{\Delta x^2} +# \end{aligned} +# $$ + +# Since we know from our problem that + +# $$ +# \begin{aligned} +# -g''(x) &= f(x) \\ +# &= (3x + x^2)\exp(x) +# \end{aligned} +# $$ + +# along with the conditions $g(0) = g(1) = 0$, +# the following scheme can be used to find an approximate solution for $g(x)$ numerically: + +# +#
    +# +# $$ +# \begin{equation} +# \begin{aligned} +# -\Big( \frac{g_{i+1} - 2g_i + g_{i-1}}{\Delta x^2} \Big) &= f(x_i) \\ +# -g_{i+1} + 2g_i - g_{i-1} &= \Delta x^2 f(x_i) +# \end{aligned} +# \end{equation} \label{odesys} \tag{16} +# $$ + +# for $i = 1, \dots, N_x - 2$ where $g_0 = g_{N_x - 1} = 0$ and $f(x_i) = (3x_i + x_i^2)\exp(x_i)$, which is given for our specific problem. +# +# The equation can be rewritten into a matrix equation: + +# $$ +# \begin{aligned} +# \begin{pmatrix} +# 2 & -1 & 0 & \dots & 0 \\ +# -1 & 2 & -1 & \dots & 0 \\ +# \vdots & & \ddots & & \vdots \\ +# 0 & \dots & -1 & 2 & -1 \\ +# 0 & \dots & 0 & -1 & 2\\ +# \end{pmatrix} +# \begin{pmatrix} +# g_1 \\ +# g_2 \\ +# \vdots \\ +# g_{N_x - 3} \\ +# g_{N_x - 2} +# \end{pmatrix} +# &= +# \Delta x^2 +# \begin{pmatrix} +# f(x_1) \\ +# f(x_2) \\ +# \vdots \\ +# f(x_{N_x - 3}) \\ +# f(x_{N_x - 2}) +# \end{pmatrix} \\ +# \boldsymbol{A}\boldsymbol{g} &= \boldsymbol{f}, +# \end{aligned} +# $$ + +# which makes it possible to solve for the vector $\boldsymbol{g}$. + +# ## Setting up the code +# +# We can then compare the result from this numerical scheme with the output from our network using Autograd: + +# In[29]: + + +import autograd.numpy as np +from autograd import grad, elementwise_grad +import autograd.numpy.random as npr +from matplotlib import pyplot as plt + +def sigmoid(z): + return 1/(1 + np.exp(-z)) + +def deep_neural_network(deep_params, x): + # N_hidden is the number of hidden layers + N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer + + # Assumes input x being an one-dimensional array + num_values = np.size(x) + x = x.reshape(-1, num_values) + + # Assume that the input layer does nothing to the input x + x_input = x + + # Due to multiple hidden layers, define a variable referencing to the + # output of the previous layer: + x_prev = x_input + + ## Hidden layers: + + for l in range(N_hidden): + # From the list of parameters P; find the correct weigths and bias for this layer + w_hidden = deep_params[l] + + # Add a row of ones to include bias + x_prev = np.concatenate((np.ones((1,num_values)), x_prev ), axis = 0) + + z_hidden = np.matmul(w_hidden, x_prev) + x_hidden = sigmoid(z_hidden) + + # Update x_prev such that next layer can use the output from this layer + x_prev = x_hidden + + ## Output layer: + + # Get the weights and bias for this layer + w_output = deep_params[-1] + + # Include bias: + x_prev = np.concatenate((np.ones((1,num_values)), x_prev), axis = 0) + + z_output = np.matmul(w_output, x_prev) + x_output = z_output + + return x_output + +def solve_ode_deep_neural_network(x, num_neurons, num_iter, lmb): + # num_hidden_neurons is now a list of number of neurons within each hidden layer + + # Find the number of hidden layers: + N_hidden = np.size(num_neurons) + + ## Set up initial weigths and biases + + # Initialize the list of parameters: + P = [None]*(N_hidden + 1) # + 1 to include the output layer + + P[0] = npr.randn(num_neurons[0], 2 ) + for l in range(1,N_hidden): + P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias + + # For the output layer + P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included + + print('Initial cost: %g'%cost_function_deep(P, x)) + + ## Start finding the optimal weigths using gradient descent + + # Find the Python function that represents the gradient of the cost function + # w.r.t the 0-th input argument -- that is the weights and biases in the hidden and output layer + cost_function_deep_grad = grad(cost_function_deep,0) + + # Let the update be done num_iter times + for i in range(num_iter): + # Evaluate the gradient at the current weights and biases in P. + # The cost_grad consist now of N_hidden + 1 arrays; the gradient w.r.t the weights and biases + # in the hidden layers and output layers evaluated at x. + cost_deep_grad = cost_function_deep_grad(P, x) + + for l in range(N_hidden+1): + P[l] = P[l] - lmb * cost_deep_grad[l] + + print('Final cost: %g'%cost_function_deep(P, x)) + + return P + +## Set up the cost function specified for this Poisson equation: + +# The right side of the ODE +def f(x): + return (3*x + x**2)*np.exp(x) + +def cost_function_deep(P, x): + + # Evaluate the trial function with the current parameters P + g_t = g_trial_deep(x,P) + + # Find the derivative w.r.t x of the trial function + d2_g_t = elementwise_grad(elementwise_grad(g_trial_deep,0))(x,P) + + right_side = f(x) + + err_sqr = (-d2_g_t - right_side)**2 + cost_sum = np.sum(err_sqr) + + return cost_sum/np.size(err_sqr) + +# The trial solution: +def g_trial_deep(x,P): + return x*(1-x)*deep_neural_network(P,x) + +# The analytic solution; +def g_analytic(x): + return x*(1-x)*np.exp(x) + +if __name__ == '__main__': + npr.seed(4155) + + ## Decide the vales of arguments to the function to solve + Nx = 10 + x = np.linspace(0,1, Nx) + + ## Set up the initial parameters + num_hidden_neurons = [200,100] + num_iter = 1000 + lmb = 1e-3 + + P = solve_ode_deep_neural_network(x, num_hidden_neurons, num_iter, lmb) + + g_dnn_ag = g_trial_deep(x,P) + g_analytical = g_analytic(x) + + # Find the maximum absolute difference between the solutons: + + plt.figure(figsize=(10,10)) + + plt.title('Performance of neural network solving an ODE compared to the analytical solution') + plt.plot(x, g_analytical) + plt.plot(x, g_dnn_ag[0,:]) + plt.legend(['analytical','nn']) + plt.xlabel('x') + plt.ylabel('g(x)') + + ## Perform the computation using the numerical scheme + + dx = 1/(Nx - 1) + + # Set up the matrix A + A = np.zeros((Nx-2,Nx-2)) + + A[0,0] = 2 + A[0,1] = -1 + + for i in range(1,Nx-3): + A[i,i-1] = -1 + A[i,i] = 2 + A[i,i+1] = -1 + + A[Nx - 3, Nx - 4] = -1 + A[Nx - 3, Nx - 3] = 2 + + # Set up the vector f + f_vec = dx**2 * f(x[1:-1]) + + # Solve the equation + g_res = np.linalg.solve(A,f_vec) + + g_vec = np.zeros(Nx) + g_vec[1:-1] = g_res + + # Print the differences between each method + max_diff1 = np.max(np.abs(g_dnn_ag - g_analytical)) + max_diff2 = np.max(np.abs(g_vec - g_analytical)) + print("The max absolute difference between the analytical solution and DNN Autograd: %g"%max_diff1) + print("The max absolute difference between the analytical solution and numerical scheme: %g"%max_diff2) + + # Plot the results + plt.figure(figsize=(10,10)) + + plt.plot(x,g_vec) + plt.plot(x,g_analytical) + plt.plot(x,g_dnn_ag[0,:]) + + plt.legend(['numerical scheme','analytical','dnn']) + plt.show() + + +# ## Partial Differential Equations +# +# A partial differential equation (PDE) has a solution here the function +# is defined by multiple variables. The equation may involve all kinds +# of combinations of which variables the function is differentiated with +# respect to. +# +# In general, a partial differential equation for a function $g(x_1,\dots,x_N)$ with $N$ variables may be expressed as + +# +#
    +# +# $$ +# \begin{equation} \label{PDE} \tag{17} +# f\left(x_1, \, \dots \, , x_N, \frac{\partial g(x_1,\dots,x_N) }{\partial x_1}, \dots , \frac{\partial g(x_1,\dots,x_N) }{\partial x_N}, \frac{\partial g(x_1,\dots,x_N) }{\partial x_1\partial x_2}, \, \dots \, , \frac{\partial^n g(x_1,\dots,x_N) }{\partial x_N^n} \right) = 0 +# \end{equation} +# $$ + +# where $f$ is an expression involving all kinds of possible mixed derivatives of $g(x_1,\dots,x_N)$ up to an order $n$. In order for the solution to be unique, some additional conditions must also be given. + +# ## Type of problem +# +# The problem our network must solve for, is similar to the ODE case. +# We must have a trial solution $g_t$ at hand. +# +# For instance, the trial solution could be expressed as + +# $$ +# \begin{align*} +# g_t(x_1,\dots,x_N) = h_1(x_1,\dots,x_N) + h_2(x_1,\dots,x_N,N(x_1,\dots,x_N,P)) +# \end{align*} +# $$ + +# where $h_1(x_1,\dots,x_N)$ is a function that ensures $g_t(x_1,\dots,x_N)$ satisfies some given conditions. +# The neural network $N(x_1,\dots,x_N,P)$ has weights and biases described by $P$ and $h_2(x_1,\dots,x_N,N(x_1,\dots,x_N,P))$ is an expression using the output from the neural network in some way. +# +# The role of the function $h_2(x_1,\dots,x_N,N(x_1,\dots,x_N,P))$, is to ensure that the output of $N(x_1,\dots,x_N,P)$ is zero when $g_t(x_1,\dots,x_N)$ is evaluated at the values of $x_1,\dots,x_N$ where the given conditions must be satisfied. The function $h_1(x_1,\dots,x_N)$ should alone make $g_t(x_1,\dots,x_N)$ satisfy the conditions. + +# ## Network requirements +# +# The network tries then the minimize the cost function following the +# same ideas as described for the ODE case, but now with more than one +# variables to consider. The concept still remains the same; find a set +# of parameters $P$ such that the expression $f$ in ([17](#PDE)) is as +# close to zero as possible. +# +# As for the ODE case, the cost function is the mean squared error that +# the network must try to minimize. The cost function for the network to +# minimize is + +# $$ +# C\left(x_1, \dots, x_N, P\right) = \left( f\left(x_1, \, \dots \, , x_N, \frac{\partial g(x_1,\dots,x_N) }{\partial x_1}, \dots , \frac{\partial g(x_1,\dots,x_N) }{\partial x_N}, \frac{\partial g(x_1,\dots,x_N) }{\partial x_1\partial x_2}, \, \dots \, , \frac{\partial^n g(x_1,\dots,x_N) }{\partial x_N^n} \right) \right)^2 +# $$ + +# ## More details +# +# If we let $\boldsymbol{x} = \big( x_1, \dots, x_N \big)$ be an array containing the values for $x_1, \dots, x_N$ respectively, the cost function can be reformulated into the following: + +# $$ +# C\left(\boldsymbol{x}, P\right) = f\left( \left( \boldsymbol{x}, \frac{\partial g(\boldsymbol{x}) }{\partial x_1}, \dots , \frac{\partial g(\boldsymbol{x}) }{\partial x_N}, \frac{\partial g(\boldsymbol{x}) }{\partial x_1\partial x_2}, \, \dots \, , \frac{\partial^n g(\boldsymbol{x}) }{\partial x_N^n} \right) \right)^2 +# $$ + +# If we also have $M$ different sets of values for $x_1, \dots, x_N$, that is $\boldsymbol{x}_i = \big(x_1^{(i)}, \dots, x_N^{(i)}\big)$ for $i = 1,\dots,M$ being the rows in matrix $X$, the cost function can be generalized into + +# $$ +# C\left(X, P \right) = \sum_{i=1}^M f\left( \left( \boldsymbol{x}_i, \frac{\partial g(\boldsymbol{x}_i) }{\partial x_1}, \dots , \frac{\partial g(\boldsymbol{x}_i) }{\partial x_N}, \frac{\partial g(\boldsymbol{x}_i) }{\partial x_1\partial x_2}, \, \dots \, , \frac{\partial^n g(\boldsymbol{x}_i) }{\partial x_N^n} \right) \right)^2. +# $$ + +# ## Example: The diffusion equation +# +# In one spatial dimension, the equation reads + +# $$ +# \frac{\partial g(x,t)}{\partial t} = \frac{\partial^2 g(x,t)}{\partial x^2} +# $$ + +# where a possible choice of conditions are + +# $$ +# \begin{align*} +# g(0,t) &= 0 ,\qquad t \geq 0 \\ +# g(1,t) &= 0, \qquad t \geq 0 \\ +# g(x,0) &= u(x),\qquad x\in [0,1] +# \end{align*} +# $$ + +# with $u(x)$ being some given function. + +# ## Defining the problem +# +# For this case, we want to find $g(x,t)$ such that + +# +#
    +# +# $$ +# \begin{equation} +# \frac{\partial g(x,t)}{\partial t} = \frac{\partial^2 g(x,t)}{\partial x^2} +# \end{equation} \label{diffonedim} \tag{18} +# $$ + +# and + +# $$ +# \begin{align*} +# g(0,t) &= 0 ,\qquad t \geq 0 \\ +# g(1,t) &= 0, \qquad t \geq 0 \\ +# g(x,0) &= u(x),\qquad x\in [0,1] +# \end{align*} +# $$ + +# with $u(x) = \sin(\pi x)$. +# +# First, let us set up the deep neural network. +# The deep neural network will follow the same structure as discussed in the examples solving the ODEs. +# First, we will look into how Autograd could be used in a network tailored to solve for bivariate functions. + +# ## Setting up the network using Autograd +# +# The only change to do here, is to extend our network such that +# functions of multiple parameters are correctly handled. In this case +# we have two variables in our function to solve for, that is time $t$ +# and position $x$. The variables will be represented by a +# one-dimensional array in the program. The program will evaluate the +# network at each possible pair $(x,t)$, given an array for the desired +# $x$-values and $t$-values to approximate the solution at. + +# In[30]: + + +def sigmoid(z): + return 1/(1 + np.exp(-z)) + +def deep_neural_network(deep_params, x): + # x is now a point and a 1D numpy array; make it a column vector + num_coordinates = np.size(x,0) + x = x.reshape(num_coordinates,-1) + + num_points = np.size(x,1) + + # N_hidden is the number of hidden layers + N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer + + # Assume that the input layer does nothing to the input x + x_input = x + x_prev = x_input + + ## Hidden layers: + + for l in range(N_hidden): + # From the list of parameters P; find the correct weigths and bias for this layer + w_hidden = deep_params[l] + + # Add a row of ones to include bias + x_prev = np.concatenate((np.ones((1,num_points)), x_prev ), axis = 0) + + z_hidden = np.matmul(w_hidden, x_prev) + x_hidden = sigmoid(z_hidden) + + # Update x_prev such that next layer can use the output from this layer + x_prev = x_hidden + + ## Output layer: + + # Get the weights and bias for this layer + w_output = deep_params[-1] + + # Include bias: + x_prev = np.concatenate((np.ones((1,num_points)), x_prev), axis = 0) + + z_output = np.matmul(w_output, x_prev) + x_output = z_output + + return x_output[0][0] + + +# ## Setting up the network using Autograd; The trial solution +# +# The cost function must then iterate through the given arrays +# containing values for $x$ and $t$, defines a point $(x,t)$ the deep +# neural network and the trial solution is evaluated at, and then finds +# the Jacobian of the trial solution. +# +# A possible trial solution for this PDE is +# +# $$ +# g_t(x,t) = h_1(x,t) + x(1-x)tN(x,t,P) +# $$ +# +# with $A(x,t)$ being a function ensuring that $g_t(x,t)$ satisfies our given conditions, and $N(x,t,P)$ being the output from the deep neural network using weights and biases for each layer from $P$. +# +# To fulfill the conditions, $A(x,t)$ could be: +# +# $$ +# h_1(x,t) = (1-t)\Big(u(x) - \big((1-x)u(0) + x u(1)\big)\Big) = (1-t)u(x) = (1-t)\sin(\pi x) +# $$ +# since $(0) = u(1) = 0$ and $u(x) = \sin(\pi x)$. + +# ## Why the jacobian? +# +# The Jacobian is used because the program must find the derivative of +# the trial solution with respect to $x$ and $t$. +# +# This gives the necessity of computing the Jacobian matrix, as we want +# to evaluate the gradient with respect to $x$ and $t$ (note that the +# Jacobian of a scalar-valued multivariate function is simply its +# gradient). +# +# In Autograd, the differentiation is by default done with respect to +# the first input argument of your Python function. Since the points is +# an array representing $x$ and $t$, the Jacobian is calculated using +# the values of $x$ and $t$. +# +# To find the second derivative with respect to $x$ and $t$, the +# Jacobian can be found for the second time. The result is a Hessian +# matrix, which is the matrix containing all the possible second order +# mixed derivatives of $g(x,t)$. + +# In[31]: + + +# Set up the trial function: +def u(x): + return np.sin(np.pi*x) + +def g_trial(point,P): + x,t = point + return (1-t)*u(x) + x*(1-x)*t*deep_neural_network(P,point) + +# The right side of the ODE: +def f(point): + return 0. + +# The cost function: +def cost_function(P, x, t): + cost_sum = 0 + + g_t_jacobian_func = jacobian(g_trial) + g_t_hessian_func = hessian(g_trial) + + for x_ in x: + for t_ in t: + point = np.array([x_,t_]) + + g_t = g_trial(point,P) + g_t_jacobian = g_t_jacobian_func(point,P) + g_t_hessian = g_t_hessian_func(point,P) + + g_t_dt = g_t_jacobian[1] + g_t_d2x = g_t_hessian[0][0] + + func = f(point) + + err_sqr = ( (g_t_dt - g_t_d2x) - func)**2 + cost_sum += err_sqr + + return cost_sum + + +# ## Setting up the network using Autograd; The full program +# +# Having set up the network, along with the trial solution and cost function, we can now see how the deep neural network performs by comparing the results to the analytical solution. +# +# The analytical solution of our problem is +# +# $$ +# g(x,t) = \exp(-\pi^2 t)\sin(\pi x) +# $$ +# +# A possible way to implement a neural network solving the PDE, is given below. +# Be aware, though, that it is fairly slow for the parameters used. +# A better result is possible, but requires more iterations, and thus longer time to complete. +# +# Indeed, the program below is not optimal in its implementation, but rather serves as an example on how to implement and use a neural network to solve a PDE. +# Using TensorFlow results in a much better execution time. Try it! + +# In[32]: + + +import autograd.numpy as np +from autograd import jacobian,hessian,grad +import autograd.numpy.random as npr +from matplotlib import cm +from matplotlib import pyplot as plt +from mpl_toolkits.mplot3d import axes3d + +## Set up the network + +def sigmoid(z): + return 1/(1 + np.exp(-z)) + +def deep_neural_network(deep_params, x): + # x is now a point and a 1D numpy array; make it a column vector + num_coordinates = np.size(x,0) + x = x.reshape(num_coordinates,-1) + + num_points = np.size(x,1) + + # N_hidden is the number of hidden layers + N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer + + # Assume that the input layer does nothing to the input x + x_input = x + x_prev = x_input + + ## Hidden layers: + + for l in range(N_hidden): + # From the list of parameters P; find the correct weigths and bias for this layer + w_hidden = deep_params[l] + + # Add a row of ones to include bias + x_prev = np.concatenate((np.ones((1,num_points)), x_prev ), axis = 0) + + z_hidden = np.matmul(w_hidden, x_prev) + x_hidden = sigmoid(z_hidden) + + # Update x_prev such that next layer can use the output from this layer + x_prev = x_hidden + + ## Output layer: + + # Get the weights and bias for this layer + w_output = deep_params[-1] + + # Include bias: + x_prev = np.concatenate((np.ones((1,num_points)), x_prev), axis = 0) + + z_output = np.matmul(w_output, x_prev) + x_output = z_output + + return x_output[0][0] + +## Define the trial solution and cost function +def u(x): + return np.sin(np.pi*x) + +def g_trial(point,P): + x,t = point + return (1-t)*u(x) + x*(1-x)*t*deep_neural_network(P,point) + +# The right side of the ODE: +def f(point): + return 0. + +# The cost function: +def cost_function(P, x, t): + cost_sum = 0 + + g_t_jacobian_func = jacobian(g_trial) + g_t_hessian_func = hessian(g_trial) + + for x_ in x: + for t_ in t: + point = np.array([x_,t_]) + + g_t = g_trial(point,P) + g_t_jacobian = g_t_jacobian_func(point,P) + g_t_hessian = g_t_hessian_func(point,P) + + g_t_dt = g_t_jacobian[1] + g_t_d2x = g_t_hessian[0][0] + + func = f(point) + + err_sqr = ( (g_t_dt - g_t_d2x) - func)**2 + cost_sum += err_sqr + + return cost_sum /( np.size(x)*np.size(t) ) + +## For comparison, define the analytical solution +def g_analytic(point): + x,t = point + return np.exp(-np.pi**2*t)*np.sin(np.pi*x) + +## Set up a function for training the network to solve for the equation +def solve_pde_deep_neural_network(x,t, num_neurons, num_iter, lmb): + ## Set up initial weigths and biases + N_hidden = np.size(num_neurons) + + ## Set up initial weigths and biases + + # Initialize the list of parameters: + P = [None]*(N_hidden + 1) # + 1 to include the output layer + + P[0] = npr.randn(num_neurons[0], 2 + 1 ) # 2 since we have two points, +1 to include bias + for l in range(1,N_hidden): + P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias + + # For the output layer + P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included + + print('Initial cost: ',cost_function(P, x, t)) + + cost_function_grad = grad(cost_function,0) + + # Let the update be done num_iter times + for i in range(num_iter): + cost_grad = cost_function_grad(P, x , t) + + for l in range(N_hidden+1): + P[l] = P[l] - lmb * cost_grad[l] + + print('Final cost: ',cost_function(P, x, t)) + + return P + +if __name__ == '__main__': + ### Use the neural network: + npr.seed(15) + + ## Decide the vales of arguments to the function to solve + Nx = 10; Nt = 10 + x = np.linspace(0, 1, Nx) + t = np.linspace(0,1,Nt) + + ## Set up the parameters for the network + num_hidden_neurons = [100, 25] + num_iter = 250 + lmb = 0.01 + + P = solve_pde_deep_neural_network(x,t, num_hidden_neurons, num_iter, lmb) + + ## Store the results + g_dnn_ag = np.zeros((Nx, Nt)) + G_analytical = np.zeros((Nx, Nt)) + for i,x_ in enumerate(x): + for j, t_ in enumerate(t): + point = np.array([x_, t_]) + g_dnn_ag[i,j] = g_trial(point,P) + + G_analytical[i,j] = g_analytic(point) + + # Find the map difference between the analytical and the computed solution + diff_ag = np.abs(g_dnn_ag - G_analytical) + print('Max absolute difference between the analytical solution and the network: %g'%np.max(diff_ag)) + + ## Plot the solutions in two dimensions, that being in position and time + + T,X = np.meshgrid(t,x) + + fig = plt.figure(figsize=(10,10)) + ax = fig.gca(projection='3d') + ax.set_title('Solution from the deep neural network w/ %d layer'%len(num_hidden_neurons)) + s = ax.plot_surface(T,X,g_dnn_ag,linewidth=0,antialiased=False,cmap=cm.viridis) + ax.set_xlabel('Time $t$') + ax.set_ylabel('Position $x$'); + + + fig = plt.figure(figsize=(10,10)) + ax = fig.gca(projection='3d') + ax.set_title('Analytical solution') + s = ax.plot_surface(T,X,G_analytical,linewidth=0,antialiased=False,cmap=cm.viridis) + ax.set_xlabel('Time $t$') + ax.set_ylabel('Position $x$'); + + fig = plt.figure(figsize=(10,10)) + ax = fig.gca(projection='3d') + ax.set_title('Difference') + s = ax.plot_surface(T,X,diff_ag,linewidth=0,antialiased=False,cmap=cm.viridis) + ax.set_xlabel('Time $t$') + ax.set_ylabel('Position $x$'); + + ## Take some slices of the 3D plots just to see the solutions at particular times + indx1 = 0 + indx2 = int(Nt/2) + indx3 = Nt-1 + + t1 = t[indx1] + t2 = t[indx2] + t3 = t[indx3] + + # Slice the results from the DNN + res1 = g_dnn_ag[:,indx1] + res2 = g_dnn_ag[:,indx2] + res3 = g_dnn_ag[:,indx3] + + # Slice the analytical results + res_analytical1 = G_analytical[:,indx1] + res_analytical2 = G_analytical[:,indx2] + res_analytical3 = G_analytical[:,indx3] + + # Plot the slices + plt.figure(figsize=(10,10)) + plt.title("Computed solutions at time = %g"%t1) + plt.plot(x, res1) + plt.plot(x,res_analytical1) + plt.legend(['dnn','analytical']) + + plt.figure(figsize=(10,10)) + plt.title("Computed solutions at time = %g"%t2) + plt.plot(x, res2) + plt.plot(x,res_analytical2) + plt.legend(['dnn','analytical']) + + plt.figure(figsize=(10,10)) + plt.title("Computed solutions at time = %g"%t3) + plt.plot(x, res3) + plt.plot(x,res_analytical3) + plt.legend(['dnn','analytical']) + + plt.show() + + +# ## Example: Solving the wave equation with Neural Networks +# +# The wave equation is + +# $$ +# \frac{\partial^2 g(x,t)}{\partial t^2} = c^2\frac{\partial^2 g(x,t)}{\partial x^2} +# $$ + +# with $c$ being the specified wave speed. +# +# Here, the chosen conditions are + +# $$ +# \begin{align*} +# g(0,t) &= 0 \\ +# g(1,t) &= 0 \\ +# g(x,0) &= u(x) \\ +# \frac{\partial g(x,t)}{\partial t} \Big |_{t = 0} &= v(x) +# \end{align*} +# $$ + +# where $\frac{\partial g(x,t)}{\partial t} \Big |_{t = 0}$ means the derivative of $g(x,t)$ with respect to $t$ is evaluated at $t = 0$, and $u(x)$ and $v(x)$ being given functions. + +# ## The problem to solve for +# +# The wave equation to solve for, is + +# +#
    +# +# $$ +# \begin{equation} \label{wave} \tag{19} +# \frac{\partial^2 g(x,t)}{\partial t^2} = c^2 \frac{\partial^2 g(x,t)}{\partial x^2} +# \end{equation} +# $$ + +# where $c$ is the given wave speed. +# The chosen conditions for this equation are + +# +#
    +# +# $$ +# \begin{aligned} +# g(0,t) &= 0, &t \geq 0 \\ +# g(1,t) &= 0, &t \geq 0 \\ +# g(x,0) &= u(x), &x\in[0,1] \\ +# \frac{\partial g(x,t)}{\partial t}\Big |_{t = 0} &= v(x), &x \in [0,1] +# \end{aligned} \label{condwave} \tag{20} +# $$ + +# In this example, let $c = 1$ and $u(x) = \sin(\pi x)$ and $v(x) = -\pi\sin(\pi x)$. + +# ## The trial solution +# Setting up the network is done in similar matter as for the example of solving the diffusion equation. +# The only things we have to change, is the trial solution such that it satisfies the conditions from ([20](#condwave)) and the cost function. +# +# The trial solution becomes slightly different since we have other conditions than in the example of solving the diffusion equation. Here, a possible trial solution $g_t(x,t)$ is +# +# $$ +# g_t(x,t) = h_1(x,t) + x(1-x)t^2N(x,t,P) +# $$ +# +# where +# +# $$ +# h_1(x,t) = (1-t^2)u(x) + tv(x) +# $$ +# +# Note that this trial solution satisfies the conditions only if $u(0) = v(0) = u(1) = v(1) = 0$, which is the case in this example. + +# ## The analytical solution +# +# The analytical solution for our specific problem, is +# +# $$ +# g(x,t) = \sin(\pi x)\cos(\pi t) - \sin(\pi x)\sin(\pi t) +# $$ + +# ## Solving the wave equation - the full program using Autograd + +# In[33]: + + +import autograd.numpy as np +from autograd import hessian,grad +import autograd.numpy.random as npr +from matplotlib import cm +from matplotlib import pyplot as plt +from mpl_toolkits.mplot3d import axes3d + +## Set up the trial function: +def u(x): + return np.sin(np.pi*x) + +def v(x): + return -np.pi*np.sin(np.pi*x) + +def h1(point): + x,t = point + return (1 - t**2)*u(x) + t*v(x) + +def g_trial(point,P): + x,t = point + return h1(point) + x*(1-x)*t**2*deep_neural_network(P,point) + +## Define the cost function +def cost_function(P, x, t): + cost_sum = 0 + + g_t_hessian_func = hessian(g_trial) + + for x_ in x: + for t_ in t: + point = np.array([x_,t_]) + + g_t_hessian = g_t_hessian_func(point,P) + + g_t_d2x = g_t_hessian[0][0] + g_t_d2t = g_t_hessian[1][1] + + err_sqr = ( (g_t_d2t - g_t_d2x) )**2 + cost_sum += err_sqr + + return cost_sum / (np.size(t) * np.size(x)) + +## The neural network +def sigmoid(z): + return 1/(1 + np.exp(-z)) + +def deep_neural_network(deep_params, x): + # x is now a point and a 1D numpy array; make it a column vector + num_coordinates = np.size(x,0) + x = x.reshape(num_coordinates,-1) + + num_points = np.size(x,1) + + # N_hidden is the number of hidden layers + N_hidden = np.size(deep_params) - 1 # -1 since params consist of parameters to all the hidden layers AND the output layer + + # Assume that the input layer does nothing to the input x + x_input = x + x_prev = x_input + + ## Hidden layers: + + for l in range(N_hidden): + # From the list of parameters P; find the correct weigths and bias for this layer + w_hidden = deep_params[l] + + # Add a row of ones to include bias + x_prev = np.concatenate((np.ones((1,num_points)), x_prev ), axis = 0) + + z_hidden = np.matmul(w_hidden, x_prev) + x_hidden = sigmoid(z_hidden) + + # Update x_prev such that next layer can use the output from this layer + x_prev = x_hidden + + ## Output layer: + + # Get the weights and bias for this layer + w_output = deep_params[-1] + + # Include bias: + x_prev = np.concatenate((np.ones((1,num_points)), x_prev), axis = 0) + + z_output = np.matmul(w_output, x_prev) + x_output = z_output + + return x_output[0][0] + +## The analytical solution +def g_analytic(point): + x,t = point + return np.sin(np.pi*x)*np.cos(np.pi*t) - np.sin(np.pi*x)*np.sin(np.pi*t) + +def solve_pde_deep_neural_network(x,t, num_neurons, num_iter, lmb): + ## Set up initial weigths and biases + N_hidden = np.size(num_neurons) + + ## Set up initial weigths and biases + + # Initialize the list of parameters: + P = [None]*(N_hidden + 1) # + 1 to include the output layer + + P[0] = npr.randn(num_neurons[0], 2 + 1 ) # 2 since we have two points, +1 to include bias + for l in range(1,N_hidden): + P[l] = npr.randn(num_neurons[l], num_neurons[l-1] + 1) # +1 to include bias + + # For the output layer + P[-1] = npr.randn(1, num_neurons[-1] + 1 ) # +1 since bias is included + + print('Initial cost: ',cost_function(P, x, t)) + + cost_function_grad = grad(cost_function,0) + + # Let the update be done num_iter times + for i in range(num_iter): + cost_grad = cost_function_grad(P, x , t) + + for l in range(N_hidden+1): + P[l] = P[l] - lmb * cost_grad[l] + + + print('Final cost: ',cost_function(P, x, t)) + + return P + +if __name__ == '__main__': + ### Use the neural network: + npr.seed(15) + + ## Decide the vales of arguments to the function to solve + Nx = 10; Nt = 10 + x = np.linspace(0, 1, Nx) + t = np.linspace(0,1,Nt) + + ## Set up the parameters for the network + num_hidden_neurons = [50,20] + num_iter = 1000 + lmb = 0.01 + + P = solve_pde_deep_neural_network(x,t, num_hidden_neurons, num_iter, lmb) + + ## Store the results + res = np.zeros((Nx, Nt)) + res_analytical = np.zeros((Nx, Nt)) + for i,x_ in enumerate(x): + for j, t_ in enumerate(t): + point = np.array([x_, t_]) + res[i,j] = g_trial(point,P) + + res_analytical[i,j] = g_analytic(point) + + diff = np.abs(res - res_analytical) + print("Max difference between analytical and solution from nn: %g"%np.max(diff)) + + ## Plot the solutions in two dimensions, that being in position and time + + T,X = np.meshgrid(t,x) + + fig = plt.figure(figsize=(10,10)) + ax = fig.gca(projection='3d') + ax.set_title('Solution from the deep neural network w/ %d layer'%len(num_hidden_neurons)) + s = ax.plot_surface(T,X,res,linewidth=0,antialiased=False,cmap=cm.viridis) + ax.set_xlabel('Time $t$') + ax.set_ylabel('Position $x$'); + + + fig = plt.figure(figsize=(10,10)) + ax = fig.gca(projection='3d') + ax.set_title('Analytical solution') + s = ax.plot_surface(T,X,res_analytical,linewidth=0,antialiased=False,cmap=cm.viridis) + ax.set_xlabel('Time $t$') + ax.set_ylabel('Position $x$'); + + + fig = plt.figure(figsize=(10,10)) + ax = fig.gca(projection='3d') + ax.set_title('Difference') + s = ax.plot_surface(T,X,diff,linewidth=0,antialiased=False,cmap=cm.viridis) + ax.set_xlabel('Time $t$') + ax.set_ylabel('Position $x$'); + + ## Take some slices of the 3D plots just to see the solutions at particular times + indx1 = 0 + indx2 = int(Nt/2) + indx3 = Nt-1 + + t1 = t[indx1] + t2 = t[indx2] + t3 = t[indx3] + + # Slice the results from the DNN + res1 = res[:,indx1] + res2 = res[:,indx2] + res3 = res[:,indx3] + + # Slice the analytical results + res_analytical1 = res_analytical[:,indx1] + res_analytical2 = res_analytical[:,indx2] + res_analytical3 = res_analytical[:,indx3] + + # Plot the slices + plt.figure(figsize=(10,10)) + plt.title("Computed solutions at time = %g"%t1) + plt.plot(x, res1) + plt.plot(x,res_analytical1) + plt.legend(['dnn','analytical']) + + plt.figure(figsize=(10,10)) + plt.title("Computed solutions at time = %g"%t2) + plt.plot(x, res2) + plt.plot(x,res_analytical2) + plt.legend(['dnn','analytical']) + + plt.figure(figsize=(10,10)) + plt.title("Computed solutions at time = %g"%t3) + plt.plot(x, res3) + plt.plot(x,res_analytical3) + plt.legend(['dnn','analytical']) + + plt.show() + + +# ## Resources on differential equations and deep learning +# +# 1. [Artificial neural networks for solving ordinary and partial differential equations by I.E. Lagaris et al](https://pdfs.semanticscholar.org/d061/df393e0e8fbfd0ea24976458b7d42419040d.pdf) +# +# 2. [Neural networks for solving differential equations by A. Honchar](https://becominghuman.ai/neural-networks-for-solving-differential-equations-fa230ac5e04c) +# +# 3. [Solving differential equations using neural networks by M.M Chiaramonte and M. Kiener](http://cs229.stanford.edu/proj2013/ChiaramonteKiener-SolvingDifferentialEquationsUsingNeuralNetworks.pdf) +# +# 4. [Introduction to Partial Differential Equations by A. Tveito, R. Winther](https://www.springer.com/us/book/9783540225515) diff --git a/doc/LectureNotes/_build/jupyter_execute/week43_15_2.png b/doc/LectureNotes/_build/jupyter_execute/week43_15_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d6998a4a8e78b01b0e69265ca07e9815cf4b4ce9 GIT binary patch literal 27610 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

    |V#}s;6*y_}Jkq^| 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 literal 484391 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 U*$l?+$*<4aF}7{iI@iYt06IWki~s-t delta 199 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