651 lines
53 KiB
Plaintext
651 lines
53 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"gridxy (generic function with 1 method)"
|
||
]
|
||
},
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"using Plots; qwt()\n",
|
||
"default(size=(500,300), leg=false)\n",
|
||
"\n",
|
||
"# creates x/y vectors which can define a grid in a zig-zag pattern\n",
|
||
"function gridxy(lim, n::Int)\n",
|
||
" xs = linspace(lim..., n)\n",
|
||
" xypairs = vec([(x,y) for x in vcat(xs,reverse(xs)), y in xs])\n",
|
||
" Plots.unzip(xypairs)\n",
|
||
"end"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# The problem... can we classify the functions?"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"target (generic function with 1 method)"
|
||
]
|
||
},
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# these are the functions we want to classify\n",
|
||
"scalar = 8 # larger is harder... start with 3\n",
|
||
"f1(x) = 0.6sin(scalar * x) + 0.1\n",
|
||
"f2(x) = f1(x) - 0.2\n",
|
||
"\n",
|
||
"# our target function is ∈ {-1,1}\n",
|
||
"target(f) = f == f1 ? 1.0 : -1.0"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# On to the fun..."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[Plots.jl] Initializing backend: qwt"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfQAAAEsCAIAAAC62dafAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nO2dT6sWyfXHq69e3GiUTEYYJguNi4BCCFx9EdlNYOKE4EXGcSaT5AeBQMKMoguFhFlkkz+ETExg7iznLcRXoO7mmsks1F2IEFCUQHSu/Vu097nd9a9PV5+qOlX9/eDiud3Vp0+dOn2e7qrv0zbPnz9XOfj5z97Pcl4AAKie3//p47XcPgAAAODk93/6WCm1P+zg9fX17sPMG/8//vnG6nPTNG3bzrEG+iCevCCejCCYvGjxfPHihVIq8M79+fPn7PM5GGxeEE9eEE9GEExerPHEtAwAAFTI/qZp5hw/83DNFL7PGUE8eUE8GUEwebHGM3DOfZT9+52Wv/rqK9On7kuC8asCKMSTG8STEQSTHa3Exyru/QreRyv6K1fath39Mqd828OIWCMFuQojuc4CI8FGlDHzjjn3asGdES+IJyMIZgJQ3KsFc5q8IJ6MIJgJCJyWWc2udB9ckzAAAACyEFjcUc3lA0ECL4gnIwhmAjAtUy24eHhBPBlBMBMQSy0TxugyC2UdBkbEGinIVRjJdRYYCW6jIau4FyQ8km+k/xsCCd0pImieNtqW0ruT9yyUvE3jSTVGzI2YlqkWPPnygngygmAmAMUdAAAqBMW9WvA7EV4QT0YQzASguFcLnnx5QTwZQTATkGJB1fMSMY2C1qZhROxZYCSSkYJcXaARkxTFvf+LJ3+hL2htWr4RqGV4jUAtA7WMZCPmRkzLVAuefHlBPBlBMBOA4g4AABWC4l4tECTwgngygmAmAMW9WvDkywviyQiCmQAUdwAAqBBZ75YpSHgEI2LPAiORjBTk6gKNmMgq7gUJj2BE5llgJJKRglxdphFzI6ZlAACgQlDcqwWCBF4QT0YQzASguFcLBAm8IJ6MIJgJQHEHAIAKkfXiMMAIZaEG0EE8GUEwE7A/weTXzs7O6vO+ffs8ZyxIeFSEkdWu7J6kPEs8I9qW0ruT9yyoA7xGTGTdUxckPIIRmWeBkUhGCnJ1mUbMjZhzrxYIEnhBPBlBMBOA4l4tmNPkBfFkBMFMAIo7AABUCIp7teDJlxfEkxEEMwEo7tWCJ19eEE9GEMwEyFLLFCQ8ghGxZ4GRSEYKcnWBRkxkFfeChEfyjax2Zfck5VniGdG2lN6dvGeh5G0aT6oxYm7EtEy14MmXF8STEQQzAbLu3MGK3W9iXANAqb18eAlq48Lp8sGfBiju4tAu49WfU69nyuMeoJMlnk2jlGrrk5YgOQMw06C3pW0avUSkKO779u1LcJYK8F/DlO/qPrh4eMlU2X27yh1hJOdUAr7gUxR37cVhnpYFrU1zG6Hm+uq1S9E8iWikIFdzGyHlw+pQDF/VRtqw6VlZ0zIFrU2zKgd8rRzj+tI21DLJjCRTy7jyYXfELXvU2F28tOGDWobYwFMc2nbkdl5WcV8g1uFZjXV/Hs2ci/fnFZ58eUkTT1s+DC5+V4kfzQdRIDkpmKOsha1XHCzfEJBC5sQ6eK60N3fVt862cEYv5v52cxfyoSboyeACxT0jg7HylHWtmbbBdUkH/KQNeIgdT1PsOJoP5X7fIzn9GOFpAh51UNxFMGnkiLdsePLlJWo858nYBwcXUTaRnB64RhDFPQ8zxw+XRk3M/4ES8qEa5s/GrJC1oCpDeJTAiDZcPmPeE/XFG0q7gyMbITVgMSIg8gKNjB9B82QkGTB8hRjpF4dG7WZIwESWrOKeXXiUwIjtNs0jhBr1ZGjM1lZITLJHXqSRwZ/WZAjV1A4OwvAVYcTIh9Zs4zJibsS0TFLmP4CbJj32QUHMT4ZCF1dBB3txQHFPh/kAzmLWlQQQJPDCHs8Y41NKfUdyasSIB4p7IiLcs4+cCIIEXnjjGS8fiqjvSM4+ASpYCnhxWAaQ2KAPez6M/jAdiIUxGWS9OKxWYl9p2sXc/RKdstoD6DDGM3HlFVjokZw9YsVBllqmWPWSv41T+MjtiSaG29slJCZlDp9zS6gnE4SwxBaOBv0TtdKGz9NScg5EMDLQPjL+4Hx/+pUNzxlLVC+Ntul3t691i+HJ8FwTdFSQQiYz4pK7xfCEopSdfxYYmWdk7/OcN2WaG7GgGpeMT8QCH8aLhuU2KJJiqjiglumIGgYU93QkmGMsQilRKPPniJMpplynkJMPmHBX8fMBxb02cNUUQbJhQj4UQYxhQnGPiIQbJQk+1MHMmQQMRB9MyyQIANQyEY2MHhHTk5bQJo0nqc8Sz8g8tYxdFJGkO/0ldykaFTme5DDCr5gykVXcy1ngphgZ/GlTTUT0hC6TiO1J4rPINOJKhlSRt56c+SwwQm+j3SSweGJu1Kdl2rb94IMPvv71r7/yyiuXLl2yWlwb4ndrmaRfOtMQu5JWLsEzCUgGkyVPyyTrun7n/vHHH//973+/c+eOUuoHP/jBt771rYsXL5qHvXjxIoV3VZBrRQu/QeeFReCRb3mzifdLyACglumIepHq991bW1vXr18/fvz48ePHr1+//sknn8Q6c73MHa2mWf1r+3/m9QpkQcsBJEPhMBYHS6EYohf37e3tM2fOdJ9Pnz69vb1tPcXRo0cPHjz4ne9853e/+13/1TFAY9oNiv+6nXhVN03If6oLXGSYSeBLBiVME7nkaZkVnMXBhl7cnz59evjw4e7zkSNHnjx5Yh7z4sWLhw8f/uc///nb3/722Wef/fKXv7TYdWA4rC+dez5QjgqzzPhBc4TqKn3kdluO+tO2lteJxOt7glOkdNVsE9pB7Wiah8R8GDajdKd/aFB3eCLv8ZnSHSEfKK7229CLw+BDd2NOQD/BiyFf+9rXHj582H3+97//feTIkRdeHjx4MNqmz+qMP33vnZ++907bg+a/fNrev8kH0P/F8wewgnwAKyInwy47Ozs7Ozv6guqpU6du3br1ve99Tyl1+/btU6dO+c+9trZ24MCBgF7aeyJYvURpoH1xkoxYb2qsUrlhy1Yp1bYeV7td2kFhMjhKm7yRT2BE20IzMviTJIc17/isw2Y06/LB7cnI/7OaOPKjeZvMk2RGXMngM+ItDqOe6PMkm5ubV65cuX///v37969cuXL+/Pm9pruTKj/60Y8+//zzZ8+e/eMf/7hw4cLZs2ddHVs2tMdqjdb9v7CYu7xP7t1g1/NElJuZD5eko6354DJHqPiBbsSnoif1EMKTYUrc9Dv3H//4x/fv39/Y2Og+v/POO+Yx3//+98+dO/fPf/7zm9/85g9/+MPLly/Tz1cxxDnzFfooEYdteLM/9RJpGimXd/VMzQfz1m78kK5N/8CJA4x8SMPkZNAOD/o6bBIr1tfW1roz/t/77yql/vjnG3uuyHuSmtSgP34t5T9C0g6Y5AmhEPQfgfvfArYbPkzLjLeZOi1DGN6eEfeAkrqjbRqb/zF9w7RMVCOeZLAbGebDaHHXjHQ1Fr8v5WHubdpUCPMz7otn1pkXy6Rbp2lBDrhn15hx+50lHxY+LTPC/HxQSqG4x2B8LFgGb9r8e8gZAAsjwWe6kn02DZAPcuHLB1kvDvPoYYkNMhnRn989RrSxatTIpej3xH5iuxHtqbwxGowwP7BSh4/dCHFYqMlA9MR/VmODPkuTO2gVGxk5ZLXFkw+UE2nIKu6ipsnoDYwJNfes4iSx5PT5Vqs+xirGmq7qW/qcO72BNR9cVvpNre2meaIttnv1diHKXS/ZIy/TSP9PMx886y6t2YZ2lg5MyyTEWCThIejBDTPvkZgQ2BhjMGWyTjuS2xXQQQtshNk5FPdMxJ/1NL/MMdM6h4Dn4gnf4IxjQzaVMR+Cglk8zoDHWHdBcZ8PNUuTZfNq/m78gTG+MxVBEXhkvm3Pe6IpLEQtExJ7vsikmHNfzn/okfib2Yn7pyktXvKeCl+oY+eDdm4MuQBcgxyvFqQou9qLwxZHgsreWt5MELCODzwQhBNUQ4M/I33TD81SzpEyGZYwLZP3tl1JU8tIUi8RjfjkZ6ZATdO6sXdHl1I5dVSt1gZSSEob6/j2aM2dlpWPfiNFqgHB3aFJMvVkCHaD0sYvFJ5qhMWTaEYs+RDYCFJIShteIx7RW2N76WN0AaJNCWca0QR4kEKyGDFljRYjllXumN1xp5+1iedEkiMv0wgpsIQBInpibtyf/vmomieyyf1IsIhkTrZiWZUJ+pXsMTH4M8ECyMR8IOQLD5TaWjSB+cDK/vQhrnJQBfWJUDKwrBoAPW9JDZNlzNhgZ0mGKouAi1z5sBQdCzsh38xZIPmwoCstGxKSgUAhbopGSHFAcWdA1p0a7VxLunPigXM6UVj007tTzdwsAUJP4wyArAVVAQvcxDbjMgSXcIXbk/Gzt04jVJnEHE8mNRBuxK2WceaDqZiyNpjprb/BdM2MspYkqGVoDfRK7VdMcXliIqu4Z1/gJhvZ++x8M9TYYnn07tiUM1Mc5POE1qBcI6582GvjiHWy7gySwa6ZafppbHvLmMTICzSiJUPTGMHUbhGYrj5zI6Zl4iDgqTO/B3URPpMgIBkGCPCn1mkZUQo6FPfJjI9fZIUTkVGFNXknUMqnQZ5mhcWZqZgTTCPto0s0Za06xMDexYRXGor7LMZTNG8SL+ASEoXoeI85J9r5Kokccbw4bBqTb9vzMTpPN/0HT4tmdILVdVgkf+aS9QdNVf6ISVoypCju/feF1VTohd+2Uy4e/JqJzmg8hefDSwdk/KCpvsquISEZZKllxEugRkRlUxVOMmRw4xo4Fk8oDUozMtI+rxzW2saTD7t/OfNBUuRlGrFri9PIYU1kFXfhEqhxBWR/wHJ3x6rDC351FKSQ2hbtYhvNhzxyWGsbWz64lZ2WBvNdJeVt6FlyGRmJW2Q5rLmxnkmS/Aib4LBngzAnC2LyTEIRoc7kZPXTMjo54oziHgdJuTsprYqoSDKYMsSS8mGSM8gHIhMClSoZUNyZkHcROCfpLNvFOS8Qz6SndcIlqjOcmEsF8YtPrT9i6hDyVY7iTkXgN7OfwZMvbtZm45pdpRzJ7sxccudDZdMyMi8ZFPcwdJ1EJjdCyXGzVitl37Z3FOewYOTkgyy1jGwJlFNF1t/RqL2xlNad1tgy/NMpBeHyRKqCLaCNL1aufIjjSbgRr1LTkiwyIi/TyMi1s7dXWfIBUsi8Mji9zaDBmLaM0ZNZRrQvpKGrurRPfzPN0qWQvV2DP/3v8BHdHUc+KFsnJEReppGZ+QAppCAKnsEYexsBmIo/aNInO9zeIxnCGIlb2rCiuI9T6ITk+HPcyHQBpzMV0MVzJCyVRo29W9WoZSTnA14cNg05qyWj2J/jvG8PwatmPJjxHL9NKzmaUd2vTC3TIeq2XeHFYczUmLIAAAeir3dZC6oiV8ntIpnRlwFF8ITHiLU/1v528xCMnsgTOQS0cb9exna48O44FWCW/W3uyAs04hGgTXiNINQyeVbJ+yFdvRzKqj/RvBe96D+U92gNrH2CWmZ3+95nny6ibdsSutPtW320aTmUZ+9UT0T0l9PI3me/GMkTO6hl8iB5tYSNOnqRBF+o6ggj1tjJyC8OKO5UpK2WjOJ7jpPnrXyMeNYS3hwC2WrUMh0yiwOKeyjis5MuSCiqFGWjSoGHhSSJXXow5d+2K6X2p49yKeM6YYAK6dEAmtKtwX+suouMCzYOZNkj8sFk9IdsuQKGO3cSJSZ08JNviZ1NjB6iygq//ov5GGeoK2J9xHRNllpGkgTKdwhR5JS9O5pwU8Mn47IJIpcthbSIBlcNBpFUg+yR2h0LU/Mh7Cz+nJxqZE4bFjms2UZPhlTdMZFV3OVIoIZeKb2eE0ROBSi6pmjgFi6FNBWxgwaOSIrtjrVB/88wTWRZ/WWSwypPcWC5cChtIIVkQsxjl59pX/WFdEoiVYYucqeqnZaR1C8UdyvkWUbB89OMC9eSMjYDlS+tryA7Pz8fSlFVzCJ3H1NMy+zbty/BWSJR89KZppEYKiEKf+1VLGrOBw1dGZNR91EIwpIhRXHf2dlZfZZf6Ku5TaPM5U0p4aI7G49q8oFEKk0kKTlFQr5c8vcO0zI+BAxQOCEXT3wNXNEsPCCM3S+0shvIulXXkKWWkSGBGqgd7Dt4TpRd0fUSsgaukv5ONOKOwPBPq0153Rlp4FH5NU0zmg/F9Xd6G2eEXNcRpJBKyZBC+iRfFDkYnyczjax2jZ/IrYkcE8jxuCrWiHZBaTJH574IniQ1YssHW0DM64N6FkreklwNbRNmxCywgwbuuLF7YjYwN2JaploCn3wxM+NAC8VSAhMnHyqYlpG/tI7iPkDeAKWA3ulFxWdZS6l9KusOE8XlA4q7E/nfzH7CfyeCm3eDth3Gs7RkmEWEzpb+I6YiigOKewgSR9Jg2pMvSvgYzngidNOpYFrGiZiuhRT3tm0/+OCDV1555Rvf+MalS5eqGSeR377iWEyUKslqBtwX+GKSociehqhl/vKXv9y8efP27dtKqbNnz544ceKdd95h8Sa3BMqpCbQKIWJ6ksGIRwOnlKJoIsvq75gNajL4TYnpzjQj1mToNXAmQ6H9JbSx54N+4djMliSF3Nraun79+vHjx5VS169f//Wvf81V3DNKoEaEbUMRpJKpYJtvZIYmssj+OhsM/gxWxArpTqCRYTL0G7iSoez+utu48uFlA28+FCaF3N7ePn36dPd5Y2Nje3s7wIhsfL9VWQp6rxcZhEKWzqKDNfZdCsqHkOL+9OnTw4cPd5+PHDny5MkTs80+B1qz1RcO5QPlqDDLlMNf0rZhltN3p2mayUfpd+vT4zM7LAk+UFwl9VRGl2d2x/nB/oDrrGUScj7qB9MxHVtxyNKdjpDifvDgwcePH3efHz16dOjQIbPNjgOt2epZg/KBclSo5fHDwyxn6U73oW1bdsf6OxldTfyB4qqnjbSezuwO5Sjz8D673wX5cz7GB09xMBHSnY6Q4n7q1KluNVUpdefOnVOnTgUYEUtBj13RGfbdndKgfrTBX2YyaL0WHoOQBdXNzc0rV658+9vfVkpduXLl/fff5/LG89BHbBBkpDX3rtr093U7Ynoiwkjr2N40jfJqZgrtr4ElH6z7CunOLCPe/vaTQSmm/2hXmBHfIa7iEMeTyXeZIcX9vffeu3fvXrem+t577124cCHAiBXP845SqomzSt4PWjef0djUI333InkixUi/0A+7PIyVXgRL7a++d+9zlw/2fWPpOt8TEUa0b33ftZPu/wtNZqT/Z1gyJOuOuTGkuDdN89FHH3300UcBxxbMMh9EgYNG/FM5Dy3+Ry4CIovD0l8/UHHeBjzHTbQf1XwePJ2KHc/SmRSeQoIpsWTTWXpx71PZUurosx6JBa+plrV6lgimfOBJzoSUWBwWXdwnDFBpuTgLcmdLyPAJIB/sTOhsPWGpIBn2p/8KlfmlXeI3sx/KQg3RUD86i5mDbTyrZ4uGIx/YkjMJhRYHWf/NXnIJlE/Yt7dLWYazCEWX5/dyo0ZMDZwjbkqp8LMEtIlmRK81Tnmo2u226O4wGyFrIqlnoeRtcAMOI85OERWQfJ5Q22jIKu4pJVBarPpHGRIoy2VflqIrxMhQEKm1MTWRpfdXU0A2zXDcDXmo8O7wG7EJZI095s6JZxHTX4/q1xOKGJ4QjZgbFz3nvqLKpTNOQUIhz6GxWHj3TWYvqxailimbFHfu+/fLej6YRjkzgxpz5zTJk6mN/sKx8qhg9Sw2dF0/JR+ET7jX8dWToux+9dVXe+eTX+jrGFhutGux4mXVQlfPUrOYZfZy82Gh0zLUAZJ9f+GH4cl3GZpI3LZT4eu+5GkZumty+6CUWmxx71PrBRv7ybfKuFXZKYEIn5ZZUYibdmRNkiSUQNF0TjPUWmRPRBtpRxqN7Z/oRiYj9mRoxv57TKndiWVED4h+AE1YLL2/vi6apV5Od0xkFfdUmqFBgwCdUxGKrp7oc54nHBo4ihuUNuxGXIrYxvjvMRtDLyuwO/GM7DVw5AMlGSg5mbe/2te3pzh06wxyhs/cuPRpmaIfu/xEefKdrYGTjH/prJSZhCIoMpiC1wmsLLC4U3+pAV5S77IqllIZ8dzjlkJl+bDA4r7HyACVMH4e0ggSCg/SHqMdkSzwEAM1RPKDWUFiL6u4j2SU+ISbRKwnX2+UqgmhGbsiZxJiE5oMAoNZX3FYVnHvU/dtOzPeaNQfqvp7OIUFJEMdxUGWWiayZmhEt0cUQXJ4Up4RuiayHBmcs09+BWQET8owsmrgSQZDZ6y0uRqp/bX3qfvgyQc53TGRVdyjaoY0FZM+ZFOkEQUp2DiN9P70aCJL0Y/68oHQH2ndiW1Eb2ATRPaUjsrcm8zVACPWZLCqP/v9EdUdcyNeHGZBv6kDANRLgdPpJJby4rD6VktGodwRzLHumnl07xFEwIDHjWfReIfculNsMC1OFVsclrigWsdqySj8F4/bYNExIzovsxhlY96yaqnBLMrtRRT3Bd6250V8RPFDNm6KFchWXBxkzYZHW1b2CWEG+9TuAr8MfYI0I2OCohHNjJj+Ts6HaJ6UZIQiMHNJUDT9CbsnM4xQVXLWZJDTHRNZxT3GsrJFtef+oTTPm7ZobYo0YtNIrBoMjzDDLKK/eim3zQf79vJ5UpYRe4NhrDwSlC6WAvvrEUY1ZgdiejLTiLlxEdMyK2paLcmPeR9X0oSkUsgHXsrPB43C3a+9uE+7VEtPxiEBz3HjTAmRwDo5Jx+ixLN0QvNBSDAneFFgcai8uPdZ2m1aCkFCyTdrU/OhVIFHQswAuWImMJi6R+UXhwUV9xHkZZtQir15n+SMJMdlM+3CEXSV1X3brlDcKybXk28RF0KAk0JmEorDGmppwSwiaaeyP/3zkV+B4D92ombIPmfajL0MKIIneYzQ9WeTPHFNRVsj3wnkAs7C4mqPkQl02yTNiO6tiBxgNOJqQFiamKaJTC6HJak8o3kCKeR0zdBQ5KSILwOinEiUBCqPkTH9qBndvP3VyrJf1Uf57zHLHj72Bl79qEduyO8J1UjfJWX5cicoYkUNn7kxRXFfX19PcBYNYY99GaAkDdeZ/I+1Y/ujM54MxN9wVfn0zo53vLudeYPJkg/ySVHcnz9/vvqcpdAv85KMe/EMf9A0fX82xh1zxA2V3Yc3rOZOOcEcd0SMq1Opc0FVZlmpmfFZxTR+BJ0a6ZKWvPFeTj7UWdz72L93axk/D9EFCWN3NMb+/HdAc27TpAk8ysJ8F0UWN4wHiLEDir1tV1UW98lpU/L4eZDw5CvABTYkxLMi8gez+vGUpZbh0Az5JY4vt43aFCI+E26kHX52GLHI4OZ4wiiH1XcPjUuOfBYj/ga0dzXYNbK8nrjbjPtIKB8snvAbMZFV3Dk0Q31ryrxB0GNksyhEfDbTyGpXXE/GFGN5ZXAjcli3f+aJDK1nATnAaGT8LMMry5EMTf+SdLXJJocdNmrivKc2khFzY1XTMpTvttofxfbIMI0gbFmVd+kM0zIjGNPqo0ekzAfSuepaVqmquPchXYm4XOczcVk11+VT99KZEChjmyXMk9dRqY1EU09xX+A3s588ggQxEWZ3BGqZyQi7ee9wFu3qxreS4r7Mb2Y/6aYR5N28h+TDGJiWIUGIkpCHOR9VjLWsBdUZy8otpRWp0VxPlmiEFliSbIbF1dEjuk1+t4uIfEojxLOQo+rMhwj9tZyr38AlkhESeWIbDVnFPWxZmaB/sbSb899jilolz6yW2d29+uj2p/+XS6rA4urgT+d/fel1CGqZ8LNoRdMWNKNU9eVLERVTqzPpRmyiKSGRJxoxN9b34rDG+Bq2UcVjlx950wjN8AYqyiAETsiQJhOkxVMqxhenrUlXYfe2yMqHKljEi8OUkjmxVynuy1S76tmv5wmDjHxIBjkfYpxZOx2pXS0Uv6AaMi7L+PpOqu4ghzTlKi/jbbuCWmYShHmGNI6s4E2GIii7uC/8m9lPzmkEcsAZR4ZuKiwumJYJxxgbyuIZ9zlntiuPgot72GxatSOZG3pgYyjhwqdWUbIjERRYvko7OPsCb9uVNLXMFM2QS7ykGzGHS456qTIjo63d6jSlyP/PqqMBVebqzBvqiSY0qMzI1LPoYiOfkX7bdrYnpEGuTA5rIqu4EzVDttu0VmvTP2zQVJJ6qTIj2gIZQVyotMZhrpppT1RtetqVFXlZUsjhptXHtm29yt3+X/4B9HniKQ52I1MydpIniY2YG8ublpn2AF7vhFoBTAl+8EAhH4rBG3yWybrJs3NV50NhxX2WarWuCbVR8qg7pgR5/vWcMh+glgnB/Qu70bZT4z1X0l5dfSiruActkiwVEeqO8R+z6BvohhPfpomIZ+GsIugKZnB9N2fLA46pDL24t2374Ycfvvrqq0ePHr18+bJ1DNaHJPAy5EoGuZg4Nub1PHrR2SbZJ50TCZSQyaEejC4lGRiqdI35oC+o3rhx4+bNm7du3VJKnT179sSJExcuXDAP6//odD67Y9Myf5XW/s3sh7JQk8YPymsjtbFyD50lSUi9nJ0MUuJZBf5gmr9k1vb7B5Pyw9clDKRe3Le2tq5du3bs2DGl1LVr137zm99Yi3tufPOfq30DkZPayxE56qXYRhpyl9k9sSrMJirYiFismptcyTDJrraliBxgNBJ8lqnJsLtrVj74vSXmg5DIE9to6MX97t27p0+f7j5vbGzcvXvXethrr7323//+9/jx4xcvXvzJT36yb9++qScOY/fL3iOEsiicVG+OT5R6qWYjWqH3yuD6RuiXtCsZRuSwL48VGTTBRmadxUgGopFJBa2fDyPe0nSXQiJPNGJu1Ofcnz59evjw4e7zkSNHnjx5Yh7z/Pnzf/3rXw8fPvzrX//62Wef/epXvzLbrDug+GSlk0FrR1FvCXc11KOHp/ywYmYb14emaXJ2x5aLNDsNZfJj9xt8uoc965Ein/hDAd1ROkRXW9oLgojFwV4lZhSHqd1J9qFjTT5zCZMAAAmuSURBVCu7Bw8efPz4cff50aNHhw4dUg4OHDiwsbHx6aefbm1tmXufO9CadV9Hu0P4ciyt/8yjrB/Ubi9NlzxHZfkwoTtBp2jbNm93BjTNROddaTC44EkGLd6MH05pI+RDQd15Se8+lOaqPQf6xWGCG3zFgXL4zFPMcWxNK7snT568fft29/nOnTsnT55UXtbW1g4cOOBvkxlrrQEJEBh5gS4tBCGRdz/G1Yc+LbO5uXn16tUHDx48ePDg6tWr58+fX+1a3d2fO3due3v72bNnX3zxxcWLF9988810/lKYNFFXL/QprzSUfhlJi2fZIJjx0RdU33333Xv37p05c6b7/Pbbb5vHvPHGG5ubm19++eXrr7/+1ltvXbp0KYWnYVT9zexndJUmjROZL2O+s4uIZ9G0kf+vllGWdNuulGp4FeujrK+vd2f8+c/eV0r98c839lzhuA614cLtQXb6I5J+OPKeHZhkHJG6k6F/8/HixQtV6FshPS1GzXEJj+QbWe3K7ElvUF4ulcY4i7XNMB9WB4b1V9tSRA4wGuE6S/9Paz7E8sS4dywl8kQj5say3i0zhdqfuUaRMo0wdo3lcSPEgIx4lo6EMErwIT4VFXcs0YA+yIciSDNMi0yGWor7wpZKKAhSd6S/eY+QD4LiWTp5H+YWUxxqKe59FjN4fmRNI2R0hunUsuJZOghmfGQtqI7eHFkb6AqZICMsnsCIZ6++OhnnLPqJHO1LCZooI7xn8eQDryeufCgo8sQ2GrKK+3w9RjNfclPaKrl0tUy/Qe/PWEqJaIopqGUYz9I0xv+4q17mQ1TF1CofCoo80Yi5MUVxT/MfegANidMI2X/TNAOJ8SyWl8FMnA8LG8EUxb3/Oyn+Ql9ssQCK/TeKWFcHfZZdHApfUMXF7EaouiOeUiJyMgiNZ5nYg8kb4cUXh5KL++IHz4/caYQY9T1+MsiNZ4E4g8lU33Xrixy7Yos7KnvRxFQ64wa7JFr9v2tg+UmCfopFIkstQ9QM6domNRTMlKNeWpoRy6tFjF0BZ7HqYaYaCWizNCNRz0JUyo7u9xeHKSchtZFjxERWcSdphrwvACpLvbQoI5YGhhJuphGlXgowJPS3MiMpzkJ7x5zPCEEIS3SV0kaUEXNjadMyZh+W+sxVA/MnZ/AAXjFT8wHJMKSk4m4Zq8WPn4cy1B3B861Nk/hiLiOehWAPpjmC9JgPW2KoVEnF3bySUdm9FKPuMO/fRy/pHA9wxcSzBJzBbFt9aCnJgO9dGzLm3FfLpNqvWjBmC8FcSun+NOp+qzA1twBa4z/kW23XtlAOXyoyinsfyqjgYiZAWagRhPWClJQMhcVTNuPBdOfDyBhgjHaRV9y9rORyvjblqJdiG5mjL+T1hH4W+qXpSYZI/dW2FJEDjEZ4z0LJ20l1WssHIUFLZsSkpBeHNdX9t4eLMkI8i7K+zM9khsqtoKDJMZLTVUIyKONnE3K7E8eIuVHGi8PabirVJmPHFHwoZU8jOEo85Qs+EmXHUxjTgumaasdweJE3LYMBY6KGSjRHG8dNDfEUQ2Aw+3eBYIxypJAAAADIoLhXC350wwviyQiCmQBZ0zIFrU0XYaREtYxkI1DLMJ6FkrdpPKnDiIms4l7Q2jSMyDwLjEQyUpCryzRibsS0TLXgyZcXxJMRBDMBKO7VAkUBL4gnIwhmAlDcAQCgQlDcqwVPvrwgnowgmAlAca8WPPnygngygmAmQJZapiDhEYyIPQuMRDJSkKsLNGIi68VhBQmP5BtZ7cruScqzxDOibSm9O3nPQsnbNJ5UY8TcKOPFYSACePLlBfFkBMFMAObcAQCgQlDcqwWCBF4QT0YQzASguFcLnnx5QTwZQTATgOIOAAAVAikkjKQzUpCrMJLrLDAS3EZDVnEvSHgEIzLPAiORjBTk6jKNmBsxLQMAABWC4l4tECTwgngygmAmAMW9WiBI4AXxZATBTACKOwAAVAiKe7XgyZcXxJMRBDMBsl4cVpDwqAgjq13ZPUl5lnhGtC2ldyfvWSh5m8aTOoyYyHpxWEHCIxiReRYYiWSkIFeXacTciGmZasGTLy+IJyMIZgJQ3KsFggReEE9GEMwEoLgDAECFoLhXC558eUE8GUEwEyDr3TIFrU0XYQRqGV4jUMswngVqGV4jJrKKe0Fr0zAi8ywwEslIQa4u04i5EdMy1YInX14QT0YQzAQE3rmv5Op9DTsQBQQJvCCejCCYCQi8c3/+/DnKOgAAiAXTMtWCJ19eEE9GEMwEoLhXC558eUE8GUEwExBLLUN8WdhqFbj7Ji9IeAQjYs8CI5GMFOTqAo0oQ1RDKu4By6fElitX2ralSIIAHcSTF8STEQSTl670ayElFfc0a6cYbF4QT14QT0YQTF6s8cScOwAAVEhgcV9fX+/malYf5oMFdF4QT14QT0YQTF6s8QxcUGWZqPn9nz5+8eLF6s+dnZ3+n2AmiCcviCcjCCYv1ng2uX6LtLaGGSEAAIhFtheH4XsbAADigdtnAACoEEGv/OVamAUAgKVhTrALKu5q9jrt+vr6/CWE+UYkWBDiRjUdEeIGOiLNDTkdMTdiWgYAACoExR0AACoExR0AACokm87dhGX2CqxAPHlBPBlBMHmxxhN37gAAUCEo7gAAUCEo7gAAUCGC5twBAABwgTt3AACoEBR3AACoEBR3AACoEBR3AACoEFnFfX2X3I6UR9u2H3744auvvnr06NHLly9b/8Pc9SHpnSwRSmCBFeRkAjyhk/hWSIxxADdu3Lh58+atW7eUUmfPnj1x4sSFCxfMZhBHTYUYWGCCnEyAp2bKunMHwWxtbV27du3YsWPHjh27du3aJ598ktujSkBgg0Ho8oLiXgl37949ffp093ljY+Pu3bvWZq+99trhw4e/+93v/uEPf9jZ2UnoYKkQAwtMkJN5kTUtA4J5+vTp4cOHu89Hjhx58uSJ2aZ7gvvf//73+eef/+IXv7h///5vf/vbpF4WCCWwwApyMi8579yxijIHLXoHDx58/Phx9/nRo0eHDh1yHXjgwIGNjY1PP/10a2srhaOFQw8s0EBO5iVncX++S0YfykWL3smTJ2/fvt19vnPnzsmTJ/2Hr62tHThwIK6LVTA1sGAFcjIvmHOvhM3NzatXrz548ODBgwdXr149f/78atfq7v7cuXPb29vPnj374osvLl68+Oabb2ZytiQ8gQV+kJN5kTXnvhry7gNu6um8++679+7dO3PmTPf57bffNtu88cYbm5ubX3755euvv/7WW29dunQpuZvlQQkssIKcTICnZv4/MW7cq1B+7wQAAAAASUVORK5CYII=",
|
||
"text/plain": [
|
||
"Plot{Plots.QwtPackage() n=4}"
|
||
]
|
||
},
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# pick the plotting limits\n",
|
||
"lim = (-1,1)\n",
|
||
"funcs = [f1, f2]\n",
|
||
"n = 40\n",
|
||
"gridx, gridy = gridxy(lim, n)\n",
|
||
"default(xlim = lim, ylim = lim)\n",
|
||
"\n",
|
||
"function initialize_plot(funcs, lim, gridx, gridy; kw...)\n",
|
||
" # show the grid\n",
|
||
" plot([gridx gridy], [gridy gridx], c=:black; kw...)\n",
|
||
"\n",
|
||
" # show the funcs\n",
|
||
" plot!(funcs, lim..., l=(4,[:blue :red]))\n",
|
||
"end\n",
|
||
"\n",
|
||
"# kick off an animation... we can save frames whenever we want, lets save the starting frame\n",
|
||
"function initialize_animation()\n",
|
||
" anim = Animation()\n",
|
||
" frame(anim)\n",
|
||
" anim\n",
|
||
"end\n",
|
||
"\n",
|
||
"# lets see what we're dealing with...\n",
|
||
"p = initialize_plot(funcs, lim, gridx, gridy)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# That looks tricky... lets build a neural net!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 33,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"NeuralNet{\n",
|
||
" params: NetParams{OnlineAI.AdadeltaModel(1.0e-6,0.3,0.96,1.0e-5) NoDropout OnlineAI.L2CostModel()}\n",
|
||
" solverParams: OnlineAI.SolverParams(1000,1000,10000,-1,[:x,:xhat,:y,:Σ,:a],100,1.0e-5,OnlineAI.donothing)\n",
|
||
" layers:\n",
|
||
" NormalizedLayer{2=>2 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n",
|
||
" NormalizedLayer{2=>2 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n",
|
||
" NormalizedLayer{2=>5 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n",
|
||
" NormalizedLayer{5=>100 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n",
|
||
" NormalizedLayer{100=>5 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n",
|
||
" NormalizedLayer{5=>2 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n",
|
||
" NormalizedLayer{2=>2 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n",
|
||
" NormalizedLayer{2=>1 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n",
|
||
"}\n"
|
||
]
|
||
},
|
||
"execution_count": 33,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"using OnlineAI\n",
|
||
"\n",
|
||
"# gradientModel = SGDModel(η=1e-4, μ=0.5)\n",
|
||
"# gradientModel = AdagradModel(η=1e-2)\n",
|
||
"gradientModel = AdadeltaModel(η=3e-1, ρ=0.96)\n",
|
||
"\n",
|
||
"net = buildTanhClassificationNet(\n",
|
||
" 2, # number of inputs\n",
|
||
" 1, # number of outputs\n",
|
||
" [2,2,5,100,5,2,2], # hidden layers structure\n",
|
||
" params = NetParams(gradientModel = gradientModel)\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Update our model and the visualization"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 34,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# set up a visualization of the projections\n",
|
||
"layers = filter(l -> l.nout == 2, net.layers[1:end-1])\n",
|
||
"num_hidden_layers = length(layers)\n",
|
||
"plts = [initialize_plot(funcs, lim, gridx, gridy, title=\"Hidden Layer $i\") for i in 1:num_hidden_layers]\n",
|
||
"sz = round(Int, sqrt(num_hidden_layers) * 600)\n",
|
||
"projectionviz = subplot(plts..., n=num_hidden_layers, size=(sz,sz))\n",
|
||
"\n",
|
||
"# setup animation, then show the plots in a window\n",
|
||
"anim = initialize_animation()\n",
|
||
"gui()\n",
|
||
"\n",
|
||
"# create another visualization to track the internal progress of the neural net\n",
|
||
"progressviz = track_progress(net, fields=[:w,:b,:Σ,:a], size=(num_hidden_layers*300,800), m=2, w=0);"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 35,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"activateHidden (generic function with 1 method)"
|
||
]
|
||
},
|
||
"execution_count": 35,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"dist = Distributions.Uniform(lim...)\n",
|
||
"progressgui = false\n",
|
||
"\n",
|
||
"function activateHidden(net, layers, x, y, seriesidx, plts)\n",
|
||
" n = length(x)\n",
|
||
" p = length(plts)\n",
|
||
" projx, projy = zeros(n,p), zeros(n,p)\n",
|
||
" for i in 1:n\n",
|
||
" # feed the data through the neural net\n",
|
||
" OnlineAI.forward!(net, [x[i], y[i]])\n",
|
||
" \n",
|
||
" # grab the net's activations at each layer\n",
|
||
" for j in 1:p\n",
|
||
" projx[i,j], projy[i,j] = layers[j].a\n",
|
||
" end\n",
|
||
" end\n",
|
||
" \n",
|
||
" # now we can update the plots\n",
|
||
" for j in 1:p\n",
|
||
" plts[j][seriesidx] = (vec(projx[:,j]), vec(projy[:,j]))\n",
|
||
" end\n",
|
||
"end"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"iterations_per_frame = 10000\n",
|
||
"total_frames = 100\n",
|
||
"for frm in 1:total_frames\n",
|
||
" # pick one of the functions at random, sample from the x line, then update the\n",
|
||
" # neural net with [x, f(x)] as the inputs\n",
|
||
" for i in 1:iterations_per_frame\n",
|
||
" f = sample(funcs)\n",
|
||
" x = rand(dist)\n",
|
||
" y = target(f)\n",
|
||
" update!(net, Float64[x, f(x)], [y])\n",
|
||
" end\n",
|
||
" \n",
|
||
" # update the progress visualization\n",
|
||
" update!(progressviz, true, show=progressgui)\n",
|
||
"\n",
|
||
" # update the projections\n",
|
||
" x = linspace(lim..., 100)\n",
|
||
" for (seriesidx, (x,y)) in enumerate([(gridx,gridy), (gridy,gridx), (x,map(f1,x)), (x,map(f2,x))])\n",
|
||
" activateHidden(net, layers, x, y, seriesidx, projectionviz.plts)\n",
|
||
" end\n",
|
||
" \n",
|
||
" # show/update the plot\n",
|
||
" gui(projectionviz)\n",
|
||
" frame(anim)\n",
|
||
" sleep(0.001)\n",
|
||
"end\n",
|
||
"\n",
|
||
"# displays the progress if there's no gui\n",
|
||
"progressgui || progressviz.subplt"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 31,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"WARNING: handleLinkInner isn't implemented for qwt\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"Subplot{Plots.QwtPackage() p=2 n=2}"
|
||
]
|
||
},
|
||
"execution_count": 31,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# show stacked and linked histograms of the preditions for each class\n",
|
||
"testn = 100\n",
|
||
"xs = linspace(lim..., testn)\n",
|
||
"x1, x2 = [hcat(xs,map(f,xs)) for f in funcs]\n",
|
||
"y1, y2 = ones(testn), -ones(testn)\n",
|
||
"yhat1, yhat2 = [vec(predict(net, x)) for x in (x1,x2)]\n",
|
||
"subplot(histogram(yhat1), histogram(yhat2), nc=1, linkx=true, title=[\"f1 prediction\", \"f2 prediction\"])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 32,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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Tz6Z7RYriWQQlCnrL3/5S7YReRcay/rvf//7i1/84ktf+pLWsp555pkf/vCHn/zkJ7uXAhwCwR3Y58EHHxweHk4Hnv/4xz/Onj37xBNP2Crrb3/72/e+971XX31Vd1m9Xm9sbOxnP/vZCy+8oK+st99+++OPP37kkUe6FwHcAsEdaGRp6VbVv8KZ6cBzeXn5ueee+/73v/+pT31KtazKkkop+5qy3nnnnW984xu///3vP//5z7e43zI1ZS0tLV29evXAgQN79+7VV9bBgwd//OMfx3FMUgRwCGwcBliQJMn999//1a9+9Y9//OP8/PwnPvGJ/Ke9Xo/QUKvK+sMf/nDw4ME//elP999/f83lhZxSgUK/VX9fURT95z//2bhx47Vr14TfNli7vqXQbwnLKq+QgcsHAq8tf0GwxHF86NChb33rWydPnixHQANlvfjiiy+99NJbb71177331l9ennaolrV79+4f/OAHmzdv/te//vWTn/zkgQceqLq8PO1QLSsfymn7SMAcpGUAF9atW/e5z32usC4wW+ROu9q9XNbBgwevXLnyhS98IVtZv7i4qKmsr3/9648++ujY2NgDDzywtLT061//mqQgYVkgWJCWAVx46KGHduzYYebRH8oC3oO0DLDPysrK6dOnFxYWtm/fjrL4lwWcAMEd2GdoaOizn/3s66+/PjCgPU+IskAgIC0DAAAegk4eAAA8BMEdAAA8BMEdAAA85P8BGAPfsl+PRZwAAAAASUVORK5CYII=",
|
||
"text/plain": [
|
||
"Plot{Plots.QwtPackage() n=4}"
|
||
]
|
||
},
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot(xs, hcat(map(f1,xs), map(f2,xs), yhat1, yhat2), leg=true, line=([2 2 5 5], [:blue :red], [:solid :solid :dot :dot]))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Animate!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"gif(anim, fps = 20)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"source": [
|
||
"# Network viz"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# show the network (uses Qwt, visualize isn't available unless you import it)\n",
|
||
"import Qwt\n",
|
||
"viz = visualize(net);"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# update the net representation with weights, etc\n",
|
||
"update!(viz)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"source": [
|
||
"# testing..."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"selection[3][2]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"p[4][2] |> length"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"gui(progressviz.subplt)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"histogram(yhat1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"using Plots\n",
|
||
"p1 = plot(rand(20))\n",
|
||
"p2 = plot(rand(10))\n",
|
||
"p3 = scatter(rand(100))\n",
|
||
"p4 = plot(rand(1000))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"subplot(p1,p2,p3,p4, nr=1, leg=false)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"using Plots; immerse()\n",
|
||
"p = plot(rand(10))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"gui()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"append!(p,1,rand(10))\n",
|
||
"gui()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"sp = progressviz.subplt.plts[1].o.widget[:minimumSizeHint]()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Julia 0.4.0",
|
||
"language": "julia",
|
||
"name": "julia-0.4"
|
||
},
|
||
"language_info": {
|
||
"file_extension": ".jl",
|
||
"mimetype": "application/julia",
|
||
"name": "julia",
|
||
"version": "0.4.0"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 0
|
||
}
|