{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Stochastic Gradient Fisher Scoring"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Example Notebook* for using Stochastic Gradient Fisher Scoring Step Method - It is based on [this](https://github.com/ferrine/pymc3/blob/a62b4fa98e75c392e634546d29cd5f2266007c46/docs/source/notebooks/simple_stochastic_optimization.ipynb)\n",
    "\n",
    "The goal here is to learn from small noisy samples of a quadratic function and estimate the parameters of the function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import functools\n",
    "import numpy as np\n",
    "from theano import theano, tensor as tt\n",
    "import matplotlib.pyplot as plt\n",
    "import pymc3 as pm\n",
    "np.random.seed(42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Quadratic problem\n",
    "Consider a simple quadratic problem with unknown parameters. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def f(x, a, b, c):\n",
    "    return a*x**2 + b*x + c\n",
    "\n",
    "a, b, c = 1, 2, 3\n",
    "min_ = np.array([-b/2/a])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### True data\n",
    "Generate the quadaratic data with noise"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHpxJREFUeJzt3X1sXNd5JvDn4YiMQ8qFoyHXFSxrmCZpC6PddRDCm4WB\n3dZyCtUN6hQIFk2Hhiw5S1uqF0qbbpuG/6SLJdCPbVwBW8lRaymyebdpkA+4CFy0jmOgaLfrhkpl\n2a7bjZuKjg0npqgGjswkksh3/zhzweHw3pk7c7/vPD9gMJw7d2bOkMOXh+e85z00M4iISPmN5N0A\nERFJhgK6iEhFKKCLiFSEArqISEUooIuIVIQCuohIRSigi4hUhAK6iEhFKKCLiFTEjixfbHJy0qan\np7N8SRGR0jt79uxFM5vqdV6mAX16ehpLS0tZvqSISOmRXI5yXuQhF5I1kn9P8kut228n+QzJl0j+\nKcmxQRsrIiLx9TOGfhTAi223fwfAQ2b2TgD/CuC+JBsmIiL9iRTQSe4B8HMA/rh1mwDuAPC51iln\nAHwgjQaKiEg0UXvofwDg1wFstG7XAXzHzK61br8C4KagB5KcI7lEcmllZSVWY0VEJFzPgE7y/QBe\nN7Ozg7yAmZ00sxkzm5ma6jlJKyIiA4rSQ78dwM+TvADgM3BDLccA3EDSz5LZA+DVVFooIlJSngdM\nTwMjI+7a89J9vZ4B3cx+08z2mNk0gF8E8BUzawJ4GsAHW6cdAPB4aq0UESkZzwMOHgSWlwEzdz07\nCxw5kt5rxlkp+hsAfpXkS3Bj6o8k0yQRkfI7ehS4enX78RMn0uupM8s9RWdmZkwLi0RkGJDh9zUa\nwIUL/TwXz5rZTK/zVMtFRCRjL7+czvMqoIuIpKBeD79v7950XlMBXUQkYd3GyEdHgYWFdF5XAV1E\nJCGeB0xOumyW1dXt99frwOnTQLOZzutnWm1RRKSqPA+YmwPW1oLvr9eBixfTbYN66CIiCZifDw/m\nQHCPPWkK6CIiCUgrc6UfCugiIgnolbnSLeslKQroIiIJuOuu8PtGRoBjx9JvgwK6iEgCnngi/L6x\nsfQyW9opoIuIJGC5y66f3/9++pUWAQV0EZHYogTr+fn026GALiISU5Rg3a0HnxQFdBGRAfirQslo\nwbpWS79NWikqItInzwMOHQKuXIn+mPX19NrjUw9dRKRP8/P9BXPA1UBPW5RNoq8j+XcknyX5Asnf\nah3/NMl/IXmudbk1/eaKiOSv3/FwMr0Ki+2iDLn8AMAdZnaZ5CiAvyb55637/puZfS695omIFMsg\ne4I+8EA2eeg9A7q5Peout26Oti7Z7VsnIlIgn/pUf+fX68Dx4+m0pVOkMXSSNZLnALwO4Ekze6Z1\n1wLJ8yQfIvmWkMfOkVwiubSyspJQs0VE0ud5wPS0W7o/Pe165xsb/T3HpUtptCxYX5tEk7wBwBcB\n/FcAqwC+BWAMwEkA/2xm/73b47VJtIiURa/65lH1uyF0kFQ2iTaz7wB4GsB+M3vNnB8AOA3gtsGa\nKiJSPL3qm0dRq2UzGeqLkuUy1eqZg+RbAbwPwD+S3N06RgAfAPB8mg0VEclSEvXNs8g9bxelh74b\nwNMkzwP4KtwY+pcAeCSfA/AcgEkA/yO9ZoqIZKtXffOosqjh4ouS5XIewLsDjt+RSotERApgYSGZ\nMfQsdzLSSlERkQDNJnDyZPwVnkn19KNQQBcRCdFsugyVQYP6+HjBJkVFRIbdwgIwOtr7vIkJF/xJ\nd33yZDYrRH2qtigiEgHZ+5zrroufcx6HeugiIj1Era6Y5arQIAroIiJdeF706opZToAGUUAXEcH2\nui2et7n8P4qsJ0CDaAxdRIZeZ92W5WVgdra/58h6AjSIeugiMvSSqNuSdzAHFNBFRGKv5qzXk2lH\nXAroIjL04kxmjo0Bx44l15Y4FNBFZOgtLLjA3K96HTh1qhjDLYAmRUVEAAB97PUDANi5E7h4MZ22\nDEo9dBEZevPzwNWr/T3mLYGbbuZLAV1Eht4gk6J5rwoNooAuIkMjaPEQAOza1f9z5b0qNEiULeiu\nI/l3JJ8l+QLJ32odfzvJZ0i+RPJPSQ4wpSAikg1/8dDyshsvX14GDh4EJieB1dX+ny/vVaFBovTQ\nfwDgDjP7dwBuBbCf5HsB/A6Ah8zsnQD+FcB96TVTRCSeoMVDV68OFswPHy5OZku7ngHdnMutm6Ot\niwG4A8DnWsfPwG0ULSJSSEltBTcxARw/nsxzJS3SGDrJGslzAF4H8CSAfwbwHTO71jrlFQA3hTx2\njuQSyaWVlZUk2iwi0rekxryvXt0cey+aSAHdzNbN7FYAewDcBuDHo76AmZ00sxkzm5mamhqwmSIi\n8SwsuIqIcV254oZviqivLBcz+w6ApwH8BwA3kPQXJu0B8GrCbRMRSUz7ps+kGzoZVFLDN0mLkuUy\nRfKG1tdvBfA+AC/CBfYPtk47AODxtBopIpIEf9PnjQ23XdygipiyCETroe8G8DTJ8wC+CuBJM/sS\ngN8A8KskXwJQB/BIes0UEYmnPQf9LW8ZLLsFKMZGFmF61nIxs/MA3h1w/Btw4+kiIoXlecDRo1sD\neJT9QYM0Gi6YFzFlEVBxLhGpMM8DDhwA1tcHf46REeDRR4sbxNtp6b+IVNb998cL5oBbVVqGYA4o\noItIhb35ZvznKOoEaBAFdBGREEWeAA2igC4iEqDRcHnrZRluATQpKiIVdeedgz2uXi/eTkRRqYcu\nIpXjecBTT/X/uPHx4mz4PAgFdBGpnEFqrZRxiKWThlxEpHKWl/t/zIULiTcjc+qhi0jljPQZ2RqN\ndNqRNQV0EakUz3PFt6IaGSlXamI3CugiUin9jp/vqNDAswK6iFRKv7XKi7xhRb8U0EWkUgZZql/U\nDSv6pYAuIpXg1zsfJMOlTPVaulFAF5HSaN+kYnp6c7NmzwPm5gYL5mR1JkV7TgeQvBnAowBuBGAA\nTprZMZKfAPBfAKy0Tv24mT2RVkNFZLj5QXttzd1eXna3ATcG7h/v1wMPlHsxUbso87vXAHzUzL5G\n8noAZ0k+2brvITP7n+k1T0TECQraa2vbdyOKigQee6w6wRyItgXdawBea339XZIvArgp7YaJiLQL\nm7gcJJiPj5d/mX+QvsbQSU7D7S/6TOvQgyTPkzxF8m0hj5kjuURyaWVlJegUEZGekpq4rNWqGcyB\nPgI6yZ0APg/gI2b2BoATAN4B4Fa4HvzvBz3OzE6a2YyZzUxNTSXQZBEZRgsLrmcdB+nG3asYzIGI\nAZ3kKFww98zsCwBgZt82s3Uz2wDwRwBuS6+ZIjLsmk3Xs67VBn8OM+DMmc3smKrpGdBJEsAjAF40\ns0+2Hd/ddtovAHg++eaJiGxqNuNv+ry2Vp2VoZ2i9NBvB3APgDtInmtd7gLwuySfI3kewE8D+JU0\nGyoiw83PQU9CVVaGdoqS5fLXABhwl3LORSQTnTnocVVlZWgnrRQVkcKLs3Co0/h4dVaGdlJAF5HC\nS2qIpF6vbsoioIAuIiUw6BBJreZSFRsNYHERuHixusEcUEAXkYIJKsD1zncO9lwbG+5y4UK1A7mv\nQnt1iEjZhRXg+t73Bnu+qk5+hlFAF5HCCCvANYgqT36G0ZCLiBRG3MnPkZHNMfMqT36GUUAXkcKI\nM0QyPg48+uhwjZl3UkAXkcJYWADGxvp/XK22uaS/qnVaolBAF5HCaDaB66+Pfv6OHcDo6GZ9F38S\ndViDugK6iBTKpUvRz712Dbh6deuxKhff6kUBXURy1557bhb/+apafKsXpS2KSK6SLrwFDF/+uU8B\nXUQy43lbN3Wu1911ksF8GPPPfQroIpIJzwMOHtw65j3IBs9BajWXrrh3rwvmw5iyCCigi0hG5ue3\nT2AmYXx8OBcRBYmyBd3NJJ8m+Q8kXyB5tHV8F8knSX69df229JsrImWV5ETlSCtyDeuK0DBRslyu\nAfiomd0C4L0AfpnkLQA+BuApM3sXgKdat0VEAiU1UXn4sMs7NxveFaFhegZ0M3vNzL7W+vq7AF4E\ncBOAuwGcaZ12BsAH0mqkiJTfwoJbBDSoet3VND9+PLk2VU1feegkpwG8G8AzAG40s9dad30LwI0h\nj5kjuURyaWVlJUZTRaTMmk3gwx8e/PE7d6o33kvkgE5yJ4DPA/iImb3Rfp+ZGYDA5QBmdtLMZsxs\nZmpqKlZjRaS8PM+Ndw9qWBcL9SNSQCc5ChfMPTP7Quvwt0nubt2/G8DraTQwaPcSESkXP2XRr7ky\niGFdLNSPKFkuBPAIgBfN7JNtd/0ZgAOtrw8AeDzpxvkryJaX3QTI8jIwOwtMTiqwi5TJ/ffHS1kc\n5sVC/YiSh347gHsAPEfyXOvYxwH8NoDPkrwPwDKA/5x044J2LwHcYoS5Ofe1xtREis3zgDffjPcc\nSk2MhpZEJZyIZmZmbGlpKfL5vQr1+PcP++owkSKbnIy/IrTRGO7fcZJnzWym13mFrrbYa8xsY2Nz\nKGaYayCLFFkSy/v1Ox5NoQP6woIbO4tibQ04cEA/cJGqGuY651EVOqA3my5IR7W+rr/iIkXjV1RM\nglIXuyt0QAeAJ57o7/y1NVeeU0SK4dix5J5LqYvdFT6gLy/3/5jVVfXSRcqO3HpbqYu9FTqge972\nH2pUGmsTyUf7YsDJSeDee/t/jkYDeOwxd02qqmJUhU5bnJ4erIcOuA/BxsZgjxWRwSSxnZzqm29X\nibTFOBMgGmsTyV7YYsCo1BOPp9ABfdeuwR97+bLG0UWyFjcLRfXN4yl0QI/DLw+goC6SjSNHuq/s\nlvQVOqBfuhTv8VqIIJKNI0eAEyfiPUeS+erDqtABPYlxcC1EEElfnDrnADA2lmy++rAqdEDvZ+l/\nGE2OiiSrMy1xcrK/Ouc7d7p9QdtTEk+d0th5Egod0JtN95e/Vhv8OZaXVT9dJAme536XZmc39yhY\nXe2/+Nbly8CZM67DtrGhidAkFTqgA+4HHTeffHUVOHRIQV1kUH5+eRKVEwHNb6Wl8AEdSGbY5MoV\nfYBE+uUPr8zOxssvD6L5reRF2YLuFMnXST7fduwTJF8lea51uSvNRiYxlg64fxO1N6lINO1bQKZB\n81vJi9JD/zSA/QHHHzKzW1uXPmsi9scfS/cnUeKMqWtDDJFo4q76bDc2tvW2Cm2lo2dAN7O/AhAz\nIzy+ZtNNnmxsuAmV0dF4z6cyuyLdJTkkYubyzFVoK11xxtAfJHm+NSTztrCTSM6RXCK5tLKyEuPl\nHM9zgTjODuK+1VVlwIiESXJI5OpVl66orJZ0DRrQTwB4B4BbAbwG4PfDTjSzk2Y2Y2YzU1NTA76c\n43nAwYPJzbQD7rlmZ13PYccOt+JNRNyQyI4dyT3f8rI6T2kbKKCb2bfNbN3MNgD8EYDbkm1WsPn5\nZHrmYdbX3fJlBXUR59q1ZJ9Pc1fpGiigk9zddvMXADwfdm6SskpziruMWaQK0phjUv55uqKkLf4J\ngL8F8GMkXyF5H4DfJfkcyfMAfhrAr6TcTgDZpTn1s4xZpCo6l/QnObTZTvnn6ek5QmZmHwo4/EgK\nbelpYcGNoac57OLzPE3cyPDo3GkorWAOKP88TaVYKeprNoHTp7eW2Uyr5KZKBciw8DzgwIHkV4LW\n69sXBCr/PF2lCuiAC+oXL7q8VjP3dRquXFGeulRP+7DK9LRLAJibS36YcXzclcNtXxCo/PP0FXqT\n6KjibCbdi3ZgkapIYgPnKBoN1wtX4E5OJTaJjiqpWi8iVZbkUv4gJLC4qIVDeapEQI9SN/3wYWBi\nor/nHRlRMS8pP3+YJa3/YgEXzB94QIE8b5UI6EDvuulPPAG8+WZ/z7mxoWJeUm5pV0wE3OTnY48B\nx4+n9xoSTWUCOhCeDkXG/0BrQYSUURrDLLXa5iTn4qJLTFDPvBgqFdCDxtLJ5CY2l5e3Zgioxy5F\nl8Yino0NFdkqqkoF9M666Y1G8lkq/l6KGoaRMkhjEY8WBhVXpQI6sLVu+oULLqinRcMwUnRJZ4CN\njmphUJFVLqB3SjulMc3JJpE4PG9zDD3OLl++iQm3UlvDLMWVYLXjYvI/fEePplOfIolfFJGkdS4i\nWl+PN5+0uKhAXgaV76EDm+UCFheTr/2iyoySNz/P3N+khQyuzTJoMG80FMzLYigCus8P7EmOq4+M\naGJU8tOZZ+53MJLqaKiYVrkMVUD3JZnKtbHhtrDTLkeSh7SX87/1rek9tyRvKAN6GmlXDz/sekud\n1ezUe5c0pT0pv7qq9NwyibJj0SmSr5N8vu3YLpJPkvx66/pt6TYzWWlkvpi5iVf/31/lqkvasvpc\nKT23PKL00D8NYH/HsY8BeMrM3gXgqdbt0mhfgAS4SaQkrK5u//dXvwySlvvvz+61tG1cOfQM6Gb2\nVwAudRy+G8CZ1tdnAHwg4Xalzl+AZOYKC6VJvwwSV9BQXr/F5qII69xodWg5DDqGfqOZvdb6+lsA\nbgw7keQcySWSSysrKwO+XLqazfS2sgP0yyDxtGey+EN5s7PpvNauXdo2rsxiT4qa2/IoNMPVzE6a\n2YyZzUxNTcV9udIhgbvuyrsVUkZ+r3x2Nv1dhnyXLmnbuDIbNKB/m+RuAGhdv55ck/JxqXNQKSFm\nwIkTwM6dW/dxVCaMdJNFHfMgI62I0F4PScG8PAYN6H8G4EDr6wMAHk+mOflJe1jkzTc3/10+cUKZ\nMNJd2vnlYdbX9Xkssyhpi38C4G8B/BjJV0jeB+C3AbyP5NcB3Nm6XWpBqYxZ7VOqTBjplOdEuj6P\n5RUly+VDZrbbzEbNbI+ZPWJmq2a2z8zeZWZ3mllKAxbZCaql3p7amDZlwgyPXovPPG9z6CMv+jyW\nU+WrLfaj2QweL2yvWpcWZcIMh84qiP6Qmy+tqqBhwiow6vNYTgroPfgB/sCB9Corjo0pLWxYBI2N\nr625QP6972U7bl6ruT8mZ85sfV2lKZbXUNZy6Vez6T70aY2pX7niUtNGRlyPiQQmJzUxVUVhWStB\nq4zTtrEBHD+uNMUqUUCPqLNcQBra//VdXQUOHVJQr4L2euVF4g+rdG7bqGBeXgroBXblirINyi5q\nPvnYWHptCPpDomGValJAjyjoFzOLHpeyDcrL84J3Dgpy5Uryr1+ruV26NjbctYZVqo826L5UA5iZ\nmbGlpaXMXi9J09PBvaxGw+2ClEahpPbXWFjQL2CZdGaz5KHRcEMoUn4kz5rZTK/z1EOPKKyn/PLL\n6f/SajVpeeRRfyWM/rsbPgroEYXl5e7dm03OrlbvFV9e9VfCKJd8+CigRxRWGmBhIbvJpZdf3r7K\n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\nRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9f116d17b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "batch_size = 10\n",
    "total_size = batch_size*100\n",
    "def xy_obs_generator(batch_size):\n",
    "    while True:\n",
    "        x_obs = np.random.uniform(-5, 5, size=(batch_size,)).astype('float32')\n",
    "        result = np.asarray([x_obs, f(x_obs, a, b, c) + np.random.normal(size=x_obs.shape).astype('float32')])\n",
    "        yield result\n",
    "\n",
    "x_train = np.random.uniform(-5, 5, size=(total_size,)).astype('float32')\n",
    "x_obs = pm.Minibatch(x_train, batch_size=batch_size)\n",
    "\n",
    "# xy_obs = pm.generator(xy_obs_generator(batch_size))\n",
    "y_train = f(x_train, a, b, c) + np.random.normal(size=x_train.shape).astype('float32')\n",
    "y_obs = pm.Minibatch(y_train, batch_size=batch_size)\n",
    "\n",
    "# Example observation\n",
    "# obs = xy_obs.eval()\n",
    "plt.plot(x_train, y_train, 'bo');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Final task\n",
    "Our task is to find to estimate the quadratic function. We will test this by calculating L2 loss of the generated samples from the trained model to the observed output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/laoj/Documents/Github/pymc3/pymc3/step_methods/sgmcmc.py:107: UserWarning: Warning: Stochastic Gradient based sampling methods are experimental step methods and not yet recommended for use in PyMC3!\n",
      "  warnings.warn(EXPERIMENTAL_WARNING)\n",
      "100%|██████████| 1500/1500 [00:00<00:00, 2203.90it/s]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\naFOiVwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9ee15f0b00>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "burn_in = 50\n",
    "draws = 1000\n",
    "\n",
    "with pm.Model() as model:\n",
    "    abc = pm.Normal('abc', sd=1, mu=1, shape=(3,))\n",
    "    x = x_obs\n",
    "    x2 = x**2\n",
    "    o = tt.ones_like(x)\n",
    "    X = tt.stack([x2, x, o]).T\n",
    "    y = X.dot(abc)\n",
    "    pm.Normal('y', mu=y, observed=y_obs, total_size=total_size)\n",
    "\n",
    "    step_method = pm.SGFS(batch_size=batch_size, step_size=1.0, total_size=total_size)\n",
    "    trace = pm.sample(draws=draws, step=step_method, init=None) \n",
    "\n",
    "pm.traceplot(trace[burn_in:]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Inference results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We don't have exact function as our observations were noisy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.99583151,  1.9845134 ,  3.13419727])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trace['abc'].mean(axis=0)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  },
  "toc": {
   "colors": {
    "hover_highlight": "#DAA520",
    "running_highlight": "#FF0000",
    "selected_highlight": "#FFD700"
   },
   "moveMenuLeft": true,
   "nav_menu": {
    "height": "12px",
    "width": "252px"
   },
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 4,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
