From 433cdfcf24243e6617843fa363ec13f370b94e03 Mon Sep 17 00:00:00 2001 From: Rachel Moon Date: Wed, 12 Dec 2018 00:59:34 -0500 Subject: [PATCH] demo update --- .DS_Store | Bin 10244 -> 10244 bytes docs/.DS_Store | Bin 8196 -> 8196 bytes docs/demo.csv | 199 ++++++++++++++++ docs/demo.ipynb | 611 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 810 insertions(+) create mode 100644 docs/demo.csv create mode 100644 docs/demo.ipynb diff --git a/.DS_Store b/.DS_Store index 150a4f3ee1ba746dd2d853d9ad4b2f3ce47105bf..06a9064d72009f8b457fdaa3983b4d49224cf035 100644 GIT binary patch delta 252 zcmZn(XbG4g&dJTdz{tVCAi+IRL0y)a0muVlaUce=1sE8T8H$t2iwlx+@{=YOE}m?l z!omttz%sc({Go6eLncEpgC0XALoP#(XHI@{QqIOgX12}j94s8XK!X`r7*ZJWL1t{` z7h1-|iQt|R$z|G{B5|FGk$W}KrI;zsX#ItD3%YD$zv#C zD2CXOp9C}*=rX26AU$JqoPa9(#4-m-Rv-@u6hPLx0u{jhwXyI$^JIP%%gH_}TQ~0% KImI-w%oYGjgf(3N delta 132 zcmZn(XbG4g&d4*dP;8=}w3%oV88$Z91JN8sSLRc`3!mt$qdB|Wu7_t$w@i+ zNkBOP1_q{VAZ?4Jo(oBRCPM*3B|{!V5~?0XUZ5TgBt61FJ^4V>OM&*JGUVwnlrSU$ zaVAhO4`?k8W0=kZjj^2UA)v}=vpG*7m6_3U@)cow4w&mVpOZ0Tp4h;%nO)*9I{=sF BLU{lH delta 55 zcmZp1XmOa}&&a(oU^hP__hcRcYetR9p9EAHwKq!$rZNLLbt3lc8vnsyvlP!;=FRL9 Gf7t=-N)z1x diff --git a/docs/demo.csv b/docs/demo.csv new file mode 100644 index 0000000..e13473b --- /dev/null +++ b/docs/demo.csv @@ -0,0 +1,199 @@ +x1,x2,x3,x4,x5,y +0.010268251,0.204992946,0.532341348,0.713870311,0.648420331,0.040050778 +0.575531755,0.117493591,0.804166094,0.911438523,0.964345158,0.404930591 +0.579665326,0.245766675,0.069016372,0.329322359,0.102742874,0.022308199 +0.516465472,0.310191538,0.24301959,0.302501614,0.630248756,0.251597311 +0.241139138,0.08997141,0.552787755,0.496927753,0.149552561,0.075614274 +0.442669668,0.713132843,0.935873165,0.566441846,0.640871917,0.216350719 +0.611418264,0.618658409,0.603093267,0.33924156,0.178831263,0.088387843 +0.722348479,0.858044596,0.232214841,0.723107148,0.481811325,-0.07035105 +0.563983428,0.22184655,0.361937959,0.121711612,0.7947059,0.393678681 +0.658817213,0.153357967,0.066403479,0.288697607,0.719443514,0.269389128 +0.325832124,0.782400977,0.443051431,0.599439763,0.162694451,-0.182013616 +0.407684323,0.394036081,0.589161187,0.900805911,0.099938725,-0.107676937 +0.932370339,0.499427562,0.607785955,0.928024573,0.806871346,0.305671518 +0.778497696,0.98024075,0.300842639,0.738588078,0.898770621,0.081906658 +0.370508801,0.502785336,0.894637354,0.44528291,0.528378886,0.262866868 +0.248532584,0.193270848,0.24718202,0.74590935,0.675513374,0.015513772 +0.308272366,0.503104473,0.566500136,0.910009214,0.509475404,-0.019311937 +0.700843526,0.108148279,0.448812325,0.762044818,0.139126646,0.074474394 +0.270735497,0.949909002,0.013037492,0.273312887,0.017529964,-0.311462034 +0.299350364,0.601703988,0.688280706,0.062645584,0.753192648,0.296540602 +0.215425063,0.998959736,0.220423057,0.894882684,0.372249935,-0.392741122 +0.195420766,0.610709731,0.402285638,0.167160763,0.532747756,0.084412142 +0.780960713,0.499030366,0.459470856,0.37975894,0.915583093,0.383803427 +0.080580177,0.038125601,0.765178782,0.402684143,0.965590913,0.454927927 +0.86508278,0.159215603,0.487673334,0.712477062,0.213179973,0.226028385 +0.868816766,0.191741544,0.501039728,0.345037817,0.118957453,0.250946899 +0.010099349,0.314988399,0.136689623,0.260232357,0.854664716,0.11190821 +0.384809381,0.109017148,0.574113244,0.764995136,0.903655143,0.315760374 +0.246053566,0.057308301,0.478829441,0.954985217,0.250018548,-0.016431445 +0.76832935,0.96053627,0.869006381,0.438020224,0.595672643,0.260799361 +0.731645429,0.41760972,0.056487519,0.468517391,0.550598877,0.106625164 +0.709930615,0.499430662,0.11682177,0.290833556,0.621011664,0.178620513 +0.660844973,0.097843147,0.843732683,0.025112768,0.981327871,0.725777223 +0.232778967,0.486098885,0.453528287,0.356548015,0.451596694,0.06200851 +0.755380296,0.621359567,0.858021495,0.132094418,0.954972502,0.553282059 +0.474062057,0.84089928,0.284430772,0.409833972,0.815311491,0.050164244 +0.787947506,0.719946686,0.7292794,0.5451873,0.842897089,0.356121387 +0.246881591,0.435050248,0.915356929,0.224576016,0.211487757,0.181132797 +0.772554506,0.035855083,0.333948703,0.318861463,0.687058958,0.422928763 +0.035635765,0.867254197,0.964794029,0.51631783,0.701821604,0.070309119 +0.267350121,0.470338148,0.427676719,0.858604462,0.114545228,-0.193225915 +0.667930494,0.980729159,0.130926928,0.783604191,0.699285004,-0.107526918 +0.021761329,0.834973314,0.897705033,0.531459447,0.843263503,0.08337886 +0.516284144,0.86596404,0.307496655,0.44908347,0.468477238,-0.058072586 +0.702479311,0.072239841,0.333513518,0.921264694,0.68395083,0.17595309 +0.25996727,0.197683176,0.434700325,0.527702962,0.20634664,0.0045417 +0.974689769,0.098768678,0.827372276,0.148818148,0.469437591,0.643675304 +0.915712501,0.543602319,0.411287322,0.07254196,0.791987331,0.43843371 +0.59717067,0.344140551,0.611546869,0.59594027,0.33084648,0.191910703 +0.318124454,0.788430077,0.723949614,0.789839311,0.728704034,0.018120773 +0.954377614,0.482892913,0.310944609,0.059170348,0.582410914,0.433440753 +0.588860367,0.093008296,0.592900528,0.616602551,0.528939699,0.305445764 +0.431863126,0.907442252,0.182551338,0.680873975,0.370738156,-0.245092759 +0.912073715,0.222284109,0.710921948,0.501078283,0.205561915,0.349897281 +0.275545642,0.11404146,0.604961834,0.484401861,0.002349094,0.032052639 +0.077529987,0.951203593,0.897142253,0.440502582,0.333146715,-0.076725102 +0.143817206,0.295685451,0.869159416,0.64150738,0.277014292,0.073840804 +0.51642428,0.523867796,0.154174595,0.470327032,0.834592288,0.164648259 +0.955028763,0.091105709,0.906358907,0.463509436,0.991663656,0.717156441 +0.746832596,0.385332124,0.29574147,0.859279429,0.030959725,-0.082227294 +0.188087074,0.380010188,0.762031701,0.736075261,0.90577444,0.18431596 +0.294417959,0.656459822,0.453734221,0.120564536,0.587263611,0.177960196 +0.599750821,0.387883968,0.91154582,0.428465968,0.258632943,0.291235816 +0.479022693,0.652377235,0.892317742,0.994226437,0.987183378,0.216830893 +0.621724444,0.380175322,0.837821399,0.60526249,0.689177107,0.34486655 +0.764571061,0.269178976,0.126778529,0.271239945,0.665495087,0.325826795 +0.074958404,0.797139467,0.816565188,0.790571827,0.459118198,-0.123757243 +0.851686025,0.433853259,0.990402951,0.542242107,0.165282706,0.311730778 +0.042468387,0.542042697,0.933883002,0.791754387,0.573794784,0.068067794 +0.708096061,0.1810659,0.463481464,0.660637655,0.942580943,0.398930295 +0.932510672,0.138684033,0.191498684,0.786114416,0.276075337,0.147658995 +0.760203386,0.051184447,0.357787102,0.037026104,0.157582104,0.336531904 +0.21030352,0.476348332,0.590981394,0.411873392,0.101625989,-0.023989381 +0.68129387,0.561728824,0.480058759,0.602992111,0.360522596,0.118870025 +0.12068098,0.854102323,0.802244553,0.74672586,0.831929514,0.011311443 +0.382578342,0.188379413,0.586084158,0.793136094,0.670859861,0.165359592 +0.672392991,0.341854623,0.268308781,0.666356914,0.450030927,0.063919511 +0.466170898,0.748516418,0.438340303,0.211069668,0.484771426,0.135756909 +0.093769181,0.404541505,0.401284202,0.993904502,0.152477659,-0.258443336 +0.3963878,0.332715407,0.366074761,0.564150829,0.905747638,0.241244214 +0.613608212,0.462847315,0.564800131,0.951188219,0.277093452,-0.036607688 +0.193550333,0.761481023,0.241584547,0.445585357,0.840743884,0.003674204 +0.386657697,0.410601878,0.963409452,0.795491516,0.758764656,0.29353555 +0.697979925,0.950014931,0.304976199,0.126332588,0.114783043,-0.009641494 +0.627894814,0.042351972,0.483272213,0.859005025,0.589123948,0.233867079 +0.119506753,0.385858604,0.989164557,0.482119576,0.343929358,0.193722597 +0.026958892,0.346469175,0.046747524,0.638733887,0.670453878,-0.096329026 +0.279747933,0.798862372,0.606420183,0.354398369,0.541147243,0.045965957 +0.909503587,0.927667181,0.353588092,0.815023354,0.633544484,-0.002754252 +0.649528359,0.449736098,0.233146741,0.240690154,0.929870813,0.370773549 +0.123876099,0.936434372,0.573498758,0.304934743,0.576493641,-0.017071992 +0.163514187,0.032731951,0.157762055,0.663261576,0.496874178,0.019154594 +0.234692925,0.720503927,0.187711969,0.287201719,0.548431913,-0.044104953 +0.611682198,0.829827773,0.832289225,0.969641937,0.391156569,-0.045044611 +0.989475566,0.328007989,0.733498786,0.338678454,0.297800331,0.417293378 +0.519368598,0.31799252,0.45765592,0.393963967,0.47656685,0.190865411 +0.092011523,0.884450571,0.62126027,0.049186244,0.18686961,-0.068829454 +0.245585773,0.042603038,0.793762379,0.986905521,0.774341339,0.233794295 +0.90414701,0.724430258,0.814796513,0.245074355,0.032865609,0.25924624 +0.707495556,0.759869146,0.975110753,0.130146837,0.105626965,0.249636202 +0.852037809,0.343858147,0.951354434,0.077509828,0.06834541,0.450841235 +0.014413393,0.614377746,0.179850304,0.827598648,0.771298908,-0.172548802 +0.950693328,0.283864673,0.550841933,0.961199526,0.920177972,0.388753802 +0.957768641,0.346296526,0.411052331,0.725017622,0.803257766,0.339397913 +0.946804568,0.204018385,0.547861397,0.502358289,0.760102355,0.487336682 +0.702277505,0.465914478,0.01766292,0.544339194,0.401286396,-0.025762739 +0.333169125,0.427097606,0.69940893,0.087498366,0.500838542,0.283668041 +0.910227673,0.178598143,0.183528225,0.8498719,0.368873139,0.142629649 +0.535508351,0.788623992,0.273297304,0.649759968,0.169366244,-0.214199083 +0.374182201,0.550628956,0.248157856,0.613879543,0.650575608,0.031673217 +0.865796833,0.609519982,0.894844008,0.210309592,0.008294483,0.31264847 +0.808009968,0.119869988,0.544156521,0.302488398,0.989195088,0.611804859 +0.21079128,0.442641842,0.903035699,0.590515663,0.785474286,0.262520689 +0.899581099,0.188063395,0.07959365,0.602788615,0.869692919,0.336321186 +0.956577108,0.885362383,0.410592082,0.874461978,0.22656173,-0.115450895 +0.758312416,0.639830143,0.682328339,0.86192606,0.741335474,0.217792234 +0.837657615,0.17712278,0.599998435,0.232403708,0.031906959,0.29462083 +0.182925434,0.025044857,0.944551444,0.895763494,0.52382975,0.223371046 +0.484369334,0.878963261,0.810354718,0.463745354,0.247918777,0.038009893 +0.310766392,0.039543361,0.013177142,0.289189267,0.399410595,0.126805634 +0.753332653,0.162370785,0.507484292,0.882343165,0.897919116,0.307524196 +0.332116313,0.223179384,0.594144561,0.724334599,0.028266779,-0.055865521 +0.659790587,0.224371763,0.668504409,0.845754456,0.441557137,0.199386892 +0.832516841,0.590693788,0.460744982,0.957597006,0.496197686,0.03021859 +0.347418763,0.353919503,0.444090499,0.126255134,0.295632928,0.171354074 +0.385234413,0.003160741,0.056363798,0.931798365,0.827093511,0.06116808 +0.310155705,0.606538696,0.218752174,0.936384546,0.494788709,-0.19673843 +0.678608977,0.791308908,0.712976268,0.608613452,0.965976859,0.284037476 +0.072375476,0.810260329,0.734686932,0.883999961,0.093988698,-0.303951463 +0.426873584,0.432608154,0.959910849,0.653414549,0.25905672,0.158343008 +0.6145077,0.798132434,0.9467921,0.670209321,0.869018289,0.260098729 +0.297219672,0.752682943,0.804654706,0.893280488,0.61042439,-0.027434396 +0.183079044,0.311717586,0.749517139,0.359946348,0.365821571,0.176052515 +0.173780723,0.494670393,0.091855926,0.124384276,0.455665215,-0.021830838 +0.854918057,0.166346885,0.317266177,0.723210669,0.567436436,0.235013378 +0.543853013,0.260150663,0.04529546,0.909129623,0.823823645,0.040164704 +0.697856393,0.729923749,0.475061755,0.076716525,0.22806172,0.134577805 +0.806763584,0.880058997,0.904051582,0.539381725,0.675195869,0.296828326 +0.955331125,0.343992821,0.288265516,0.302703646,0.978247443,0.485313597 +0.956950689,0.497052941,0.666477347,0.299209435,0.268650955,0.358050309 +0.482521021,0.778080912,0.330470838,0.86880509,0.147393823,-0.281142524 +0.967502504,0.967101746,0.797910544,0.711659773,0.875748026,0.292682816 +0.138780413,0.416235088,0.051939613,0.550849343,0.13900389,-0.222463542 +0.634704158,0.709875147,0.47604317,0.935139195,0.251813425,-0.123263885 +0.427402209,0.397029673,0.222855085,0.702954023,0.912475792,0.095078741 +0.643915194,0.331043153,0.807950902,0.43136078,0.635092477,0.432628493 +0.965819954,0.891389822,0.312105986,0.415291124,0.434541672,0.118559738 +0.652568187,0.737164981,0.243136517,0.383220846,0.361289746,0.023051727 +0.704301171,0.998427647,0.554478169,0.757314563,0.016055043,-0.218234563 +0.931384251,0.252381963,0.275650198,0.133362433,0.422415258,0.406583304 +0.618339377,0.360742063,0.209676743,0.396079062,0.205595478,0.049291858 +0.519001039,0.77301949,0.655066457,0.169593614,0.868376523,0.327829367 +0.240296343,0.699025177,0.460446485,0.826067485,0.214634341,-0.203710613 +0.684068534,0.670562162,0.150382373,0.224123385,0.884907282,0.24578245 +0.764033511,0.373127132,0.608830053,0.104623295,0.702363171,0.495313823 +0.057455508,0.455840691,0.167809551,0.813258332,0.031101411,-0.375622494 +0.393292339,0.989492012,0.229719945,0.752211257,0.830007199,-0.101721321 +0.916640078,0.021638164,0.499366012,0.963638833,0.675989825,0.306855447 +0.376555571,0.449522045,0.184506945,0.997549917,0.131781171,-0.283160581 +0.532128728,0.12040014,0.859651018,0.17595688,0.338612383,0.46456386 +0.774757912,0.095707597,0.819656872,0.092514065,0.618902261,0.659801612 +0.784282578,0.129470887,0.618316309,0.722507676,0.275398986,0.222516229 +0.937482665,0.145185153,0.069489593,0.469512398,0.034444791,0.096973937 +0.808389084,0.375828885,0.986081359,0.339504313,0.641974046,0.545885013 +0.572793657,0.496894047,0.94991569,0.311561035,0.402881482,0.365938103 +0.404565709,0.051350762,0.674212297,0.964374155,0.746019294,0.211551687 +0.123945886,0.714665671,0.799269925,0.07761834,0.406602328,0.160972308 +0.515113654,0.738753205,0.806307286,0.971030949,0.554741392,0.015771893 +0.369137571,0.443708428,0.849103713,0.761817617,0.580586026,0.142419218 +0.39455633,0.920192413,0.755483672,0.726063795,0.500470095,0.000240344 +0.433285845,0.014910369,0.527878162,0.565548258,0.890080308,0.415885983 +0.777642172,0.710235325,0.772213457,0.681811257,0.703495298,0.235084928 +0.13005481,0.351132644,0.299083615,0.100304828,0.879823061,0.259086544 +0.481857142,0.101366531,0.316089585,0.055857599,0.789292488,0.463790486 +0.693925713,0.309983258,0.262862432,0.64279297,0.601361832,0.172855125 +0.982398427,0.569720446,0.913363027,0.24381234,0.885507434,0.653447983 +0.312029024,0.66870339,0.185105521,0.525701608,0.330860999,-0.165068679 +0.425381165,0.282264044,0.53483904,0.098719282,0.702623258,0.361091697 +0.032408148,0.876394914,0.828400267,0.685116367,0.91013864,0.062797044 +0.31797464,0.042611077,0.113618515,0.819171756,0.950408852,0.165484701 +0.663514868,0.715482569,0.01833728,0.579848611,0.393463074,-0.1357377 +0.059975832,0.84028416,0.00196497,0.518026714,0.86951198,-0.153394494 +0.228619458,0.58665104,0.914118302,0.445687249,0.291123698,0.125973212 +0.380144961,0.484218808,0.711239382,0.202660005,0.404761335,0.244816413 +0.067052764,0.845218299,0.79086705,0.877138098,0.951725612,0.020168715 +0.447617252,0.711828456,0.010098325,0.621982535,0.950830283,0.023230985 +0.054341158,0.691857669,0.096166988,0.698991557,0.088483805,-0.445248511 +0.938514989,0.673237646,0.656518448,0.857925238,0.154128567,0.06128996 +0.66032524,0.684345436,0.156621213,0.21153816,0.845203298,0.231340983 +0.015807232,0.84795527,0.667241096,0.300083715,0.73718267,0.047953352 +0.644727841,0.795332536,0.721675109,0.128878197,0.09356451,0.128550821 +0.014455598,0.860573733,0.948571305,0.60104027,0.053913988,-0.168178705 +0.958863205,0.326809812,0.750281745,0.171051095,0.810377387,0.647127655 +0.836412326,0.234354516,0.525417012,0.943900023,0.122479245,0.049228954 +0.903559805,0.909511427,0.135690695,0.530825909,0.475966267,0.016588636 +0.42621281,0.402198775,0.886285714,0.545251402,0.324610212,0.224342697 +0.891424045,0.429547603,0.925403768,0.627095764,0.744012943,0.472144235 +0.772582479,0.89576838,0.608611759,0.284775517,0.079595109,0.063460749 \ No newline at end of file diff --git a/docs/demo.ipynb b/docs/demo.ipynb new file mode 100644 index 0000000..5e065d4 --- /dev/null +++ b/docs/demo.ipynb @@ -0,0 +1,611 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# autodiffpy Package Demo" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "colab_type": "code", + "id": "mWyGgsNOwVcN", + "outputId": "5768aff3-1305-464e-87e6-99b9420641ae", + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: update in c:\\users\\silver\\anaconda2\\envs\\py36\\lib\\site-packages (0.0.1)\n", + "Requirement already satisfied: autodiffpy==1.2.8 in c:\\users\\silver\\anaconda2\\envs\\py36\\lib\\site-packages (1.2.8)\n", + "Requirement already satisfied: style==1.1.0 in c:\\users\\silver\\anaconda2\\envs\\py36\\lib\\site-packages (from update) (1.1.0)\n" + ] + } + ], + "source": [ + "!pip install update autodiffpy==1.2.8\n", + "\n", + "# Import packages\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as graph\n", + "import autodiffpy.autodiffmod as ad\n", + "import autodiffpy.autodiff_math as admath\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "b6YsuIUowysD" + }, + "source": [ + "### Part 1: Standard automatic differentiation with elementary operations\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 153 + }, + "colab_type": "code", + "id": "S_GaOfYwyJ3N", + "outputId": "545701c7-f9e2-4efa-d9dc-00db6acf48f4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "value: [ 1. 2.]\n", + "derivatives:{'x': array([ 1., 1.])}\n", + "\n", + "value: [-5. -3.]\n", + "derivatives:{'y': array([ 2., 1.])}\n", + "\n", + "value: [ 0.5 -4. ]\n", + "derivatives:{'z': array([ 1., 1.])}\n" + ] + } + ], + "source": [ + "# Create autodiff instances\n", + "x = ad.autodiff(name='x', val=[1.0, 2.0], der=[1.0, 1.0])\n", + "y = ad.autodiff(name='y', val=[-5.0, -3.0], der=[2.0, 1.0])\n", + "z = ad.autodiff(name='z', val=[0.5, -4.0], der=[1.0, 1.0])\n", + "\n", + "# Examine each instance\n", + "print(x)\n", + "print(\"\")\n", + "print(y)\n", + "print(\"\")\n", + "print(z)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 153 + }, + "colab_type": "code", + "id": "cViHxpDmyGuc", + "outputId": "525a9d63-9741-4b70-a9b6-0088af275024" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "value: [ 0.04 0.44444444]\n", + "derivatives:{'x': array([ 0.08 , 0.44444444]), 'y': array([ 0.032 , 0.2962963])}\n", + "\n", + "value: [ 3. -12.]\n", + "derivatives:{'x': array([ 0.5, -4. ]), 'y': array([-2., -1.]), 'z': array([ 2., 3.])}\n", + "\n", + "value: [ 1. 0.00390625]\n", + "derivatives:{'x': array([ 1. , -0.015625]), 'z': array([ 0. , 0.00541521])}\n" + ] + } + ], + "source": [ + "# Calculate various functions\n", + "f1 = (x/y)**2\n", + "f2 = x*z - 3 - y + z\n", + "f3 = (x**2)**z\n", + "\n", + "# Examine each function\n", + "print(f1)\n", + "print(\"\")\n", + "print(f2)\n", + "print(\"\")\n", + "print(f3)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'jacobian': array([[ 0.5, -4. ],\n", + " [-2. , -1. ]]), 'order': ['x', 'y']}\n" + ] + } + ], + "source": [ + "# Generate jacobian for just two variables\n", + "print(f2.jacobian(order=['x', 'y']))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "collapsed": true, + "id": "D6kIdgjbxMQ1" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "0Veh0ogAy3x8" + }, + "source": [ + "### Part 2: Standard automatic differentiation with mathematical operations\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 153 + }, + "colab_type": "code", + "id": "-jf7IaSsy-YG", + "outputId": "3b917d41-11b8-456b-c3f8-c834bc7dd336" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "value: [ 1. 2.]\n", + "derivatives:{'x': array([ 1., 1.])}\n", + "\n", + "value: [-5. -3.]\n", + "derivatives:{'y': array([ 1., 1.])}\n", + "\n", + "value: [ 0.5 -4. ]\n", + "derivatives:{'z': array([ 1., 1.])}\n" + ] + } + ], + "source": [ + "# Create autodiff instances again\n", + "x = ad.autodiff(name='x', val=[1.0, 2.0], der=[1.0, 1.0])\n", + "y = ad.autodiff(name='y', val=[-5.0, -3.0], der=[1.0, 1.0])\n", + "z = ad.autodiff(name='z', val=[0.5, -4.0], der=[1.0, 1.0])\n", + "\n", + "# Examine each instance again\n", + "print(x)\n", + "print(\"\")\n", + "print(y)\n", + "print(\"\")\n", + "print(z)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 153 + }, + "colab_type": "code", + "id": "Or_7y1kczNxK", + "outputId": "1bed5084-eedb-46b4-8d5b-bf0c94466deb" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "value: [ 6.10674521e+00 5.41117210e+04]\n", + "derivatives:{'x': array([ 2.23691171e+01, 9.81625436e+05])}\n", + "\n", + "value: [ 10. -0.75]\n", + "derivatives:{'y': array([-2. , 0.25]), 'z': array([-20. , -0.1875])}\n", + "\n", + "value: [ 1.11803399 4.47213595]\n", + "derivatives:{'x': array([ 0.89442719, 0.4472136 ]), 'z': array([ 0.4472136 , -0.89442719])}\n" + ] + } + ], + "source": [ + "# Calculate various functions\n", + "f1 = admath.sinh(admath.cosh(x*np.pi/2.0))\n", + "f2 = admath.log(admath.exp(-y/z))\n", + "f3 = admath.sqrt(x**2 + z**2)\n", + "\n", + "# Examine each function\n", + "print(f1)\n", + "print(\"\")\n", + "print(f2)\n", + "print(\"\")\n", + "print(f3)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "collapsed": true, + "id": "Z22u6WEn0A3Y" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "EPGeZK9r0BDr" + }, + "source": [ + "### Part 3: Exploring derivatives calculated through automatic differentiation\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1277 + }, + "colab_type": "code", + "id": "fRW1dg8-0kP7", + "outputId": "49aa6e39-a44e-4cd5-ad6d-d46e1d50fd83" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create new autodiff instances\n", + "numpoints = 100\n", + "xval = np.linspace(0, 5*np.pi, numpoints)\n", + "x1 = ad.autodiff(name='x1', val=xval, der=np.ones(numpoints))\n", + "x2 = ad.autodiff(name='x2', val=xval, der=np.ones(numpoints))\n", + "\n", + "# Create a function\n", + "f1 = 4*admath.sin(x1/2) + 2*admath.cos(x2*3)\n", + "\n", + "# Graph first function and its derivative\n", + "graph.plot(xval, f1.val, color='black', linewidth=3, linestyle='-', label='Sine + Cosine')\n", + "graph.plot(xval, f1.der['x1'], color='blue', linewidth=3, linestyle='--', label='x1 Derivative')\n", + "graph.plot(xval, f1.der['x2'], color='red', linewidth=3, linestyle='--', label='x2 Derivative')\n", + "graph.xlabel('Inputs')\n", + "graph.ylabel('Outputs')\n", + "graph.title('Sine + Cosine and its Derivative')\n", + "graph.legend(loc='best')\n", + "graph.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 376 + }, + "colab_type": "code", + "id": "uE9y5w2vy-iY", + "outputId": "2e1a9517-d8b2-49e4-d2b4-ba0fcdcb675c" + }, + "outputs": [ + { + "data": { + "image/png": "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\nURhjjEnX/wOiW0iRajm1nAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create new autodiff instances\n", + "numpoints = 100\n", + "y = ad.autodiff(name='y', val=np.linspace(0, 10, numpoints), der=np.ones(numpoints))\n", + "\n", + "# Create a function\n", + "f2 = (2*((y - 5)**2) + 3*y - 5)\n", + "\n", + "# Graph second function and its derivative\n", + "graph.plot(y.val, f2.val, color='black', linewidth=3, linestyle='-', label='Quadratic')\n", + "graph.plot(y.val, f2.der['y'], color='blue', linewidth=3, linestyle='--', label='Derivative')\n", + "graph.xlabel('Inputs')\n", + "graph.ylabel('Outputs')\n", + "graph.title('Quadratic and its Derivative')\n", + "graph.legend(loc='best')\n", + "graph.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "collapsed": true, + "id": "qy-97qPn16G-" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "3jL6enXq0HBd" + }, + "source": [ + "### Part 4: Gradient descent with MAE loss on noisy linear data\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Read in and process data file (will be used later in this demo)\n", + "data = pd.read_csv(\"demo.csv\") # Demo data\n", + "X_data = data.drop('y', axis = 1) # Input x-data\n", + "Y_true = data['y'] # Actual y-values\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "5OcnYrQf0x8R" + }, + "outputs": [], + "source": [ + "# Create initial weights for the data\n", + "w = ad.autodiff('w', [1 for i in X_data.columns.values]) # Initialize weights to all ones\n", + "f1 = w*X_data # Functional form\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 231 + }, + "colab_type": "code", + "id": "v5RTohgC5Cl4", + "outputId": "1446d6cb-bc4e-4448-beb4-70949f646c64" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial loss: 2.43820865061\n", + "Final loss: 0.021210588678\n", + "Final weights: [ 0.32252461 -0.32005991 0.2945301 -0.32906545 0.31026263]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Run MAE-loss gradient descent\n", + "g = ad.gradient_descent(f1, Y_true, loss='MAE', beta=0.001, max_iter=5000, tol=1E-5)\n", + "\n", + "# Print characteristics of this gradient descent\n", + "print(\"Initial loss:\", g[\"loss_array\"][0])\n", + "print(\"Final loss:\", g[\"loss_array\"][-1])\n", + "print(f\"Final weights: {g['w'].val}\")\n", + "\n", + "# Graph the loss as a function of iterations\n", + "xgrid = np.linspace(1, g['num_iter']+1, g[\"num_iter\"])\n", + "graph.plot(xgrid, g['loss_array'])\n", + "graph.title('MAE Loss vs. Iteration for Linear Noisy Data')\n", + "graph.xlabel('Iteration')\n", + "graph.ylabel('Loss')\n", + "graph.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "collapsed": true, + "id": "3LjZ2w1U6NcL" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "11ixlmLQ6NkA" + }, + "source": [ + "### Part 5: Gradient descent with MSE loss on noisy logistic data\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "7ikmdp9k6Nsa" + }, + "outputs": [], + "source": [ + "# Create initial weights for the data\n", + "w = ad.autodiff('w', [1 for i in X_data.columns.values]) # Initialize weights to all ones\n", + "f2 = admath.logistic(w*X_data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "CrCJPClB6kPc" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial loss: 0.643263339221\n", + "Final loss: 0.0541321240815\n", + "Final weights: [-0.24665455 -0.68530053 -0.29746136 -0.8148488 -0.25492064]\n" + ] + }, + { + "data": { + "image/png": "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\nVZFNAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Run MSE-loss gradient descent\n", + "g = ad.gradient_descent(f2, Y_true, loss='MSE', beta=0.005, max_iter=5000, tol=1E-5)\n", + "\n", + "# Print characteristics of this gradient descent\n", + "print(\"Initial loss:\", g[\"loss_array\"][0])\n", + "print(\"Final loss:\", g[\"loss_array\"][-1])\n", + "print(f\"Final weights: {g['w'].val}\")\n", + "\n", + "# Graph the loss as a function of iterations\n", + "xgrid = np.linspace(1, g['num_iter']+1, g[\"num_iter\"])\n", + "graph.plot(xgrid, g['loss_array'])\n", + "graph.title('MSE Loss vs. Iteration for Logistic Noisy Data')\n", + "graph.xlabel('Iteration')\n", + "graph.ylabel('Loss')\n", + "graph.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "collapsed": true, + "id": "rFP5Ougx6YTK" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "autodiffpy_demo.ipynb", + "provenance": [], + "version": "0.3.2" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}