http://git-wip-us.apache.org/repos/asf/madlib-site/blob/acd339f6/community-artifacts/SVM-novelty-detection-v2.ipynb
----------------------------------------------------------------------
diff --git a/community-artifacts/SVM-novelty-detection-v2.ipynb 
b/community-artifacts/SVM-novelty-detection-v2.ipynb
new file mode 100755
index 0000000..678d7c9
--- /dev/null
+++ b/community-artifacts/SVM-novelty-detection-v2.ipynb
@@ -0,0 +1,511 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Novelty detection using 1-class SVM\n",
+    "\n",
+    "Classifies new data as similar or different to the training set.  This 
method is an unsupervised method that builds a decision boundary between the 
data and origin in kernel space and can be used as a novelty detector."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      
"/Users/fmcquillan/anaconda/lib/python2.7/site-packages/IPython/config.py:13: 
ShimWarning: The `IPython.config` package has been deprecated. You should 
import from traitlets.config instead.\n",
+      "  \"You should import from traitlets.config instead.\", ShimWarning)\n",
+      
"/Users/fmcquillan/anaconda/lib/python2.7/site-packages/IPython/utils/traitlets.py:5:
 UserWarning: IPython.utils.traitlets has moved to a top-level traitlets 
package.\n",
+      "  warn(\"IPython.utils.traitlets has moved to a top-level traitlets 
package.\")\n"
+     ]
+    }
+   ],
+   "source": [
+    "%load_ext sql"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "u'Connected: gpadmin@madlib'"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Greenplum Database 5.4.0 on GCP (demo machine)\n",
+    "%sql postgresql://gpadmin@35.184.253.255:5432/madlib\n",
+    "        \n",
+    "# PostgreSQL local\n",
+    "#%sql postgresql://fmcquillan@localhost:5432/madlib\n",
+    "\n",
+    "# Greenplum Database 4.3.10.0\n",
+    "#%sql postgresql://gpdbchina@10.194.10.68:61000/madlib"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "# Setup\n",
+    "%matplotlib inline\n",
+    "\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import matplotlib.pyplot as plt\n",
+    "import matplotlib.font_manager"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": 
"iVBORw0KGgoAAAANSUhEUgAAAW8AAAD7CAYAAAClvBX1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHfZJREFUeJzt3X9wXOV97/H3IwulS2yMZTmG4OCACOMCHiOby3DHnWsN\nYXcZOlUq6x9CSJUfjSZznZofx0RQU6IEcYkTtvnVtB6RTKzAMPQmvmrVznSPlXbEHTE3vQk2lDhQ\niIcyIQZSYXJBwyay0XP/eM6uVqtdayWt9uzZ/bxmdtgfZ88+LObjZ7/Pj2OstYiISLQ0hd0AERFZ\nPIW3iEgEKbxFRCJI4S0iEkEKbxGRCFJ4i4hEUHO1PsgYozmJIiJLYK01hc9VtedtrQ319oUvfCH0\nNtTKTd+Fvgt9F9H4LkpR2UREJIIU3iIiEdRQ4d3Z2Rl2E2qGvotZ+i5m6buYVevfhTlbTaWiH2SM\nrdZniYjUC2MMNuwBSxERqQyFt4hIBCm8RUQiSOEtIhJBCm+RMvm+T08iQU8ige/7YTdHGpxmm4iU\nwfd9eru7OZDJANAfizE8MkIymQy5ZVLvNNtEZBmGUikOZDL0Ar3AgUyGoVQq7GZFin65VFbVNqYS\nkcZV+Muld2JCv1yWSeEtUoY+z6N3YgLyyyaeF3KroiP/lwsAwS8XhffSKbxFypBMJhkeGcmVSoY9\nT8EjodKApTQ83/dzodynUF4RGvBdulIDlgpvaWgKlerRX5JLs+LhbYxpAn4KvGKt7SryusJbak5P\nIkHX2FiuFjsMjMbjHD5yJMxmieRUY6rgbcDPK3g+EREpoSLhbYzZBNwEfKcS5xOplj7Pc6USXK+7\nPxajT7NIJAIqUjYxxvwAeABYC3gqm0iUqBYrtaxU2WTZUwWNMX8IvG6tfdoY0wnM+5CsgYGB3P3O\nzs6av1KFNIZkMqnAlpoxPj7O+Pj4gsctu+dtjPkfw
 
K3AGSAGrAH+l7X2TwqOU89bRGSRqjJV0Biz\nC5VNREQqRhtTiYjUES3SERGpYep5i4jUEYV3hWnPYhGpBoV3BWX3yegaG3NLrru7FeAiDWqlO3IK\n7wrS1VYam351SVY1OnLaz1ukAnSlGMlXjYtPKLwrSFdbaVy6UoxUm8K7gnS1FRGB6nTkNM9bpAJ0\nUQcpVKkNz3QlHZEVpt0JZSUovEVEIkgrLEVE6ojCW0QkghTeIiIRpPAWEYkghbeISAQpvEVEIkjh\nLSISQQpvkQainQ/rhxbpiDQILeGPJq2wFGlwPYmE21s6eDwMjMbjHD5yJMxmyQK0wlJEpI4ovEUa\nRJ/nuVIJrtfdH4vRt8htSn3fJ5HoIZHoUc08ZCqbiDSQ5ex86Ps+3d29ZDIHAIjF+hkZGVbNfIWp\n5i0i8/i+Tyo1BIDn9Z01iBOJHsbGuiCvah6Pj3LkyOGVb2gDKxXeupKOSAPJD+tdu7bzwAPfyvWk\nJyZ61ZOOEIW3SIMoLHuMjd0BfI1sTzqTgVRqqGR4e14fExO92St7EYv143nDVWi5FKMBS5EG4Ps+\nt9yyh0zmEuCC4PbeRZ0jmUwyMuJKJfH4KCMjLri3b/8D1q+/jO3bOzWIWUWqeYvUucIeN9wFnAY+\njZt38hCw+AFI3/fp6rqZ6enm3DlaWu5idPQRlV4qSDVvkQaVSg0Fwd2b9+xBXODGgQFaW/+Txx4r\nHtylBjVTqSGmp7cAn82de3r67KUXqRyFt0hDmgr+mQReY8eO0ZLBnd9rL2dQc3LyDRKJHsANij7x\nxFFg4dkssjgqm4hE0GKm+LnyxseZnv5q8Mw+4G3gQ8Bqmpuf4x//8W8B12uenHyDt976T95883ec\nPn2at9/+L0D2/91LiMdf4siRw0XLJs3NHk1N7zI9/XXgWeBh4JuA5oUvVamyCdbaqtzcR4nIcqXT\naRuLbbRwyMIhG4tttOl0+qzH
 
r159oYUtFtotXG3hvNz7Ya1tb7/CtrRsyHvuPAuehR4L51u4Lnjc\nZlevvjD3eel02nZ07LStre22vf3q4HOus5C2sDs4lw1uh2w8vrtaX1PdCLJzXqZqtolIxMytYbuS\nRrYXXihb9piaWgtMAn8B3A604Gac9ALf4MSJt4KeeW9w+ybwU+BfgK/j6tqPAr1MTZ3LTTd9jO3b\nOwE4enSCxx77NidPvsrU1IPM1sDfWJkvQADVvEXq2mzQfx1X2sgftNwDbAMuAd5T5N2vkD8P3DkI\n/IaZmRTHjkF3t6uB33PPg0UGRb8M7M090rzwylJ4i0TM0hbLFOsFbwC6cAF7La4WnrUXeH/eYx8X\n3P8OXEH+wp577nmQY8eemXf2NWveob//8xw+/D1efvkVNm++rIx/OylbsVrKYm7AJtxvq+O4EYq9\nJY6rUoVIpP6l02kbj++28fhuOzg4aDs6dtnW1nbb0bFzTv17cHDQGrPGwnsK6txtQV3aBo/PtxAL\nauIXBLXu1RbW5mrdc+vhg7n3rlnzgeDYtjnnz7ZlMfV5mY8SNe9lzzYxxlwAXGCtfdoYsxp4CviI\ntfb5guPscj9LROYqNpOkpeUMo6OPAwTT/C4JXrsIeBo30+TjZGeIuIU6dwLvA07i+mPHgX00NX2H\nmZlVwF/CnMs43AsM0tJyFy0tzUxNbQZ2Ai8Fx7hZKYA2s1qmFVukY619DXgtuD9ljHkO96fk+bO+\nUUSWJH+a4OTk63kDjc709MHc664OPQr8HPhFcJwPfDc4eivQD3wS+DvcQOX9wTHfY2bmG7hySaF3\ngIOcPp1h1aoYLrgfBdx8cGNux/MeLzqQ+tRTz+D7vqYMLlNFa97GmA8CVwP/WsnziohTuGimqekO\nXLXybPqAjwKfIj9g4TZgFXAx8CTw/4JzTeFCPtvbfoX8gUd3/zQwgLWvkck8hJvP/RngIMa8wP33\n78uFc35
 
9HvZx6lRvbqBTAb50FQvvoGTyQ+A2a+3UQseLyOIVLnWfmQFX8tgaHHEnLS0zeN4AkA3O\nA7gfw0/igjt/RsiduKmD2ft/A7QCv8075igumEeDx58JzjWEG/C8HEiyZs0POOecc9i8+fe55ppr\ngNnNrG65ZQ+nTm3A/eWRJJPZyj33PKjwXoaKhLcxphkX3I9Ya/++1HEDAwO5+52dnXR2dlbi40Ua\nmjEWaw8G96e57767c6E4MjJMKjXEz372Dq+++kqRd1/O/KmAAL9hdvbJSVxI59fInwReADzgKuAS\npqbexNorOXXqXbq6bmZ09HGSySTJZJIdO7YFte/ZsH7mmZ+VVT5ZzGrSejA+Ps74+PjCBxYbxVzs\nDfg+8JcLHLNyw7EiDaJw9kZT07pgNsjCqxhvuOGGghkn89/rVkfuDmainBc83mzh3OD+dcHz51p4\nb97Ky3OD82XP3WpXr77QxuO7bTqdtul0Omhr9vWNFrwFV1xqtsoKrrA0xuwEPgZcb4w5Zow5aoy5\ncbnnlfD5vk9PIkFPIqF9mmtE4Z7a27ZdwWzJ5OzeeCNbeL4zuF0PucsRD+Nq2f+Gq5EnceWRk0AM\nOAe3cvKzgAHeBb7N7MrLS5ld0OPq5VNTmxkb66K72/XsXVsP4sovw2W1ezGrSRtOsURfiRvqeUdK\nOp22G2MxewjsIbAbY7GG6/FEQbk903Q6bZub3xf0lLcGvedN1u13sivobXvzes/g2aam9fP2KHHn\nyX+8qcgxu+f8GlhKLzoe1/4olOh5a4WlFDWUSnEgk5mthmYyDKVSdV9vjJpsT3y2Jjx/Bkd2hsqZ\nM18Jnrmd2V0C72a25r2PNWvWcM4597Nu3bmcd97v09b2EpOTV3Hs2EIt+Q2uN5+1D9cjX1xbC+nS\na2dRLNFX4oZ63pGyOx63h2a7O/YQ2N3xeNjNkiUo1nt1Pe7sCspD1q2onK2HNzWts4OD
 
g9ba+b17\n1yPPr4G/17oVl4MWNtlVqzbY5ub3VqxOnb+atBF//VGi563wlqJUNom+bOi1trbPC+/W1vbcQGJH\nx868csnsMU1N6+ds/RqP77YdHbtse/sV1pjzC8J8MBiEdM+1tGywHR07GzZwK6lUeOtiDFKS7/sM\npVIA9HmeSiYRMncxz/yLIuzf/2e5K9xMTr7BsWO/I/9yZtlrW8bjl89byp5I9Mxb8p5dLq9l8JWn\na1jKomXn6Er0FLtuZWvr/ezYsY1du/6MBx74Vt4Fie/Arb68K+8M+4BpJifXlvV5zc3TnDlTmbZL\neXQxBpGGsJUdO7Zx5Mhhnnji6Jzpdy64vwusZ3Yq36O4nnozvu+TSPSQSPTg+z6e10cs1k92imEs\n1s/AwN55z3leX9GWFJ5PlqhYLWUlbqjmnZNOp+3ueNzujsdVD5QVcbZpecUHMHcWne7X0bGr6HmK\nDSKWM7CoRTeLhwYsa4MGAqVaSoXp/Nkj64Lw7pmzCjIW2xgMZlZunrXmbS9eqfBWzbvKNH9aKuls\ng8qlxiyy86337LmbEyf+A/g0brXjXj7+8W5OnnQbUHnesFYz1jCFt0hE+b5Pb3c3B4IVLL0TEwyP\njJTVEUgmk1x66RAnTtxO/qDmyZPzZ4hUcpGMFt1UjsK7yvo8j96JCbJ/evtjMYY9L+RWSRRV41fc\nUlZFVvN8jUzhXWXJZJLhkZHcT91hzZ+WkJTbC670lFFNQa0MLdIRiajCskl/LFZ22ST/HI20V3YU\nlVqko/AWiTCtgq1/Cm8RkQgo/Av5xhtvVHiLiNSyYqWw1zMZ7W0iIlLLis0g+kSJY7W3iYhIBKnn\nLSJSI4qtA8nN5SygmreISA3RgKWISB0oNVVQNW8RkQhSeIuIRJDCW0QkghTeIiIRpPAWEYkghbeI\nSAQpvEVEIkjhLSISQQpvEZEIUniLiESQwltEJIIU3iIiEaTwFhG
 
JIIW3iEgEKbxFRCKoIuFtjLnR\nGPO8MeYFY0x/Jc4pIiKlLftiDMaYJuAF4MPASeAnwM3W2ucLjtPFGEREFmklL8ZwLfCitfZla+1p\n4HHgIxU4r8iK8H2fnkSCnkQC3/fDbo7IklTiAsQXAb/Me/wKLtBFao7v+/R2d3MguKhr78QEwyMj\nJJPJkFsmsjhVvXr8wMBA7n5nZyednZ3V/HgRhlIpDmQy9GafyGQYSqUU3lIzxsfHGR8fX/C4SoT3\nr4CL8x5vCp6bJz+8RURkvsKO7Re/+MWix1UivH8CXGaM2Qy8CtwMfLQC5xWpuD7Po3diAoKySX8s\nxrDnhdwqkcVb9mwTcFMFgW/gBkC/a639cpFjNNtEaoLv+wylUoALc5VMpJaVmm1SkfAuswEKbxGR\nRVrJqYIiIlJlCm8RkQhSeIvIkmnBU3hU8xaRJSlc8NQfi2nB0wrQgKWIVFRPIkHX2FhuwdMwMBqP\nc/jIkTCbVXc0YCkiUkequjxeROqHFjyFS2UTEVkyLXhaeap5i4hEkGreIiJ1ROEtIhJBCm8RkQhS\neIuIRJDCW0QkghTeIiIRpPAWEYkghbeISAQpvEVEIkjhLSISQQpvEZEIUniLiESQwluK8n2fRKKH\nRKJHl7cSqUHaVVDm8X2f7u5eMpkDAMRi/YyMDGu7T5EQaFfBBreYnnQqNRQEdy/gQjyVGqpKO0Wk\nPLqSTh3zfZ9UaojJydc5fvwFpqe/CsDERK960iIRp/CuU3NLHweBr0JwqdhMxvWuS4W35/UxMdGb\nvboVsVg/njdclXaLSHlUNqkz2fLILbfsIZO5FRfY71nUOZLJJCMjw8Tjo8Tjo4yMuODevv0PWL/+\nMrZv79QgpkjINGBZRwoHGmEfcDvwEO5H1kMAtLTcxejoI2WXTXzfp6vrZqanl34OEVkaXcOyASQS\nPYyNdZEtj8AwcC8wCFwADAEn6ehYxdGjE4
 
s870ngs3POHY+PcuTI4Yq1X0Tm02yThhUUrkkCh4HP\n0ta2seiRy5nbrXnhIlVmra3KzX2ULFY6nbbx+G4bj++26XR6wWNbWjZYOBTc2iz8noXzLVxnwbOx\n2MbcebLn7ujYadvbr7bGrLFwlYXrbEvL+XOOa2k5PzifO3dLywY7ODiYe3/+5+Z/hogsT5Cd8zO1\n2JMrcVN4L146nbax2MayQzGdTtvVqy8MgnqnhasttFrwgnOste3tV9jBwUHb0bHLNjWtt9AThLI3\nJ5yhza5efeGcAO/o2GlbW9tte/vVtr19a/B+L/i8QxZscDtk4/Hd1fqaROpaqfBWzbuGFathl6oz\nzw5WXgLsBB4FsgOX/bj692vAl4GTwDeD1+4APgX8GHgXeD/QFxx7Ly0tU1x55Tba2tbjeX0ABYOi\n/cAW4JNltVNEFqdUzVvzvOvE7KrIV3AzQr7ObJgC7AH+GDiNC+781x4CfgV8LXjcC9wKtDE9/VuO\nHfsk4Bb3bNmyJW/1ZdbDuJktjuaFi6w8hXcNW9pimaPA+iLPb8CF7AVFXjuJC+5ewAcuAb4XHPsQ\n+Yt7jh//fJH3v0tLyxmuvPJ7QQ9dqzdFVtqywtsY8xXgj4DfASeAT1pr36pEw2R2sUx2X5FscCcS\nPcHjvlxI7tq1nX/+Z4+ZmdPAGfJ7wnPLJp8D9ua9tg/3nw9ccPcyW265DXh2Tpump98pOPftrF4d\n44c/fBxwvwCy7VWAi6ygYoXwcm/ADUBTcP/LwINnOXbFC/v1bnBwMBgknDtzZHZg0wsGKA9ZSFto\nD45N5wYS3WySdcEMlA8Er3kW1hYdeHTHZQcx1wbv9yzsDm5ebibMYgZXRaQ8lBiwXFbP21r7o7yH\nPwZ6lnM+Kc33fe67L8XMTLYu3U8mc2uul+vq0KPA5bje8iiu7PEzXI97GNdjnsYNSv4auBg3//th\n3GDlC0U++feAgzQ1v
 
UhLyyp++9skcwdDb8Pz/rZgJ8KF908RkeWpZM37U8DjFTxfw8vuCggwOfl6\nENz5A4UHcUGc7yJcGH8GV8u2uNBei1sqvwn4C1zIHwc+ALwF/BXwD8wtqewFzgf+DzMzwxhzT965\nDwLP09v7xySTyaJbxj711DP4vq8AF1kJxbrjdm65Ywz4t7zbs8E//yjvmP3A4QXOU73fGXWgsAzR\n1LQuKFfMljSamtaXKJt4FjbauYt1eiysD8oeW/LKINkyi82VQfJLIu71dHDMdba5ea2NxS60zc3v\ns+3tV8yZB57f3uzc8aamdXZwcDDkb1Mkulhq2cRaGz/b68aYTwA3AdcvdK6BgYHc/c7OTjo7Oxd6\nS8MqLEPMzIAxd2LtVgCMuZ0vfWlfrlebHdh84olmpqefxJU18nvpHpAK7t+FK6l8g7mDjwBbyW4+\n5UotlwfHvApcxZkzf8q77w5h7ZWcOAFdXTczOvp4bnD1llv2cOrUBlxpJcnMzFbuu8/jmmuuWbAH\nnv9LI38wVqSRjI+PMz4+vvCBxRK93BtwI+639/oyjq3GX1J1Ix7fPW/w0Jh1waDi3OXr+dLptDWm\ndd573fvyH2fPv9XCecF9z8K5uc9wg5VeMMCZ7VGfF/TYs49b7erVF+YGLYu1G65bcMWlBjxFimMl\nlscDLwIv4yYXHwX++izHVulftT6UUzYpFYg33HBDXiAfygvhwjDfGJREeixsCI7Lf19rEOZbgrBP\n2+IzUq7LBa6bEZMf9q6cs1B4Fwt9LbEXWbnZJh9azvultMI53pOTV3Ds2Nay3nv06Eu4QcXPA+/D\nDTo+jCuJgBuInMatunwN+N/AI8AAc7d9BTfIeXdwvxe32KfQ+3HXuoQnnhjlS1/yuO8+j5mZDwG3\nEos9qhWXIhWmFZY1LJlM5uq+s3uXuNdKrbb0fZ+33nobeBLYiKtVX4abxTkaHBVnzZqfAD9gamoI\n
 
a91eJk1NLzIzU3jGLcwN888Bd+Y93oerb8/av38/11xzTfAXz0tlrbjUpddEFkcbU0XIQgN686+k\nsxeYwfW8B3Eh/ACze5+4gc9LL30/l166hV27tvPAA9/Ke//twIdx0w3BLZv/KRAHDrJq1e8w5h3O\nnPk24AJ3ORc21oClyHylNqZaVs17MTcqVPNOp9N2dzxud8fjGtAqUKxu3NS01ra2XhQMMuavwJw/\n5dDa/D2+d9kLL7y4oAZ+noVemz8NsaVlg+3o2FnWfuMisnisRM272nzfp7e7mwPBb+veiQmGR0Ya\nvoeW7bE+9dQzQNec17Ztu4q2to1MTr7BL37xP3n77cvnvX9m5kO51ZD5pZpEoodXX83fkhbcZdVm\npyFOT0Nbm7Z/Fam2SIX3UCrFgUxmNkoyGYZSqYYO77mlkkvIXyHZ0nI7x4+fw/T0Z4Jn7sDt9d2f\nd4bbcFvUlFfSam6e5syZSrRcRJYjUuEt8xUu5gFobb2fHTu2MTm5LdiLO/vas8B3cXXsO3ELcP4U\neJhduz4/r+ZcbBBx//69PPBAf1kDi6phi6ygYrWUlbhRgZp3Op22G2MxewjsIbAbY7GGr7OebX50\n8QUzOy1smvd8R8euootkil1Ds5zramrRjUhlUC/XsNSA5VxnC8n5+42sC8L7qnnh3draXtFFMlp0\nI1IZpcI7cmWT/AE1KX7Bhuz3k31tz567OXHiP4BP4xbq/Heam71c7ToW62fz5ss4dSqMfwMRWQrN\n824AxS5k3NHxMG1tGwGKXli4EnO2K3k+kUalCxDLHG1tG+dN7yvVg1+Ks/0iEJHlU8+7AagXLBJd\npXreCu8GoWl7ItGk8BYRiaBS4d0URmNERGR5FN4iIhGk8BYRiSCFt4hIBCm8RUQiSOEtIhJBCm8R\nkQhSeIuIRJDCW0QkghTeIiIRpPAWEYkghbeISAQpvEWkLvi+T08iQU8ige/7Y
 
TdnxWlXQRGJPN/3\n6e3u5kAmA0B/LMbwyEhdbH2sLWFFpG71JBJ0jY3lXegPRuNxDh85EmazKkJbwoqI1BGFt8giNFpd\nNSr6PM+VSnC97v5YjD7PC7tZK0plE5Ey1XNdtR74vs9QKgW4MK+X/y6qeYssUz3XVaV2qeYtIlJH\nmsNugEhU9HkevRMTkF82qfO6qtQulU1EFqFe66pSu1a05m2M8YCvAm3W2lMljlF4i4gs0orVvI0x\nm4A48PJyzyUiIuWpxIDl14C7KnAeEREp07LC2xjTBfzSWvtshdojIiJlWHC2iTFmDNiY/xRggXuB\nP8eVTPJfK2lgYCB3v7Ozk87OzvJbKiINodEHhcfHxxkfH1/wuCUPWBpjrgJ+BLyDC+1NwK+Aa621\nvy5yvAYsReSstIp1vhVfYWmMeQnYbq19s8TrCm8ROSutYp2vGissLQuUTUREpDIqtsLSWntppc4l\nIo1Jq1jLpxWWIlJTGn3AspB2FRQRiSDtKigiUkcU3iIiEaTwFhGJIIW3iEgEKbxFRCJI4S0iEkEK\nbxGRCFJ4i4hEkMJbRCSCFN4h8X2fnkSCnkQC3/fDbo6IRIyWx4dAexaLSLm0t0kN0Z7FIlIu7W0C\nZV1aqFHou5il72KWvotZtf5dKLxD0Od5rlSC63X3x2L0VXnP4lr5LmqBvotZ+i5m1fp3UbGLMUj5\nkskkwyMjuT2Lh7VnsYgsksI7JMlkUoEtIktW1QHLqnyQiEidCXW2iYiIVE5DDViKiNQLhbeISAQ1\nbHgbYzxjzIwxpjXstoTFGPMVY8xzxpinjTGHjTHnhd2majPG3GiMed4Y84Ixpj/s9oTFGLPJGPMv\nxpjjxphnjTF7w25T2IwxTcaYo8aY0bDbUkxDhrcxZhMQB14Ouy0hOwJcaa29GngRuCfk9lSVMaYJ\n+CsgCVwJfNQYsyXcVoXmDHCntfZK4L8Cexr4u8i6Dfh5
 
2I0opSHDG/gacFfYjQibtfZH1tqZ4OGP\ngU1hticE1wIvWmtfttaeBh4HPhJym0JhrX3NWvt0cH8KeA64KNxWhSfo4N0EfCfstpTScOFtjOkC\nfmmtfTbsttSYTwH/FHYjquwi4Jd5j1+hgQMryxjzQeBq4F/DbUmosh28mp2OV5eLdIwxY8DG/Kdw\n/xHuBf4cVzLJf61uneW72G+t/YfgmP3AaWvtYyE0UWqIMWY18EPgtqAH3nCMMX8IvG6tfdoY00mN\nZkRdhre1Nl7seWPMVcAHgWeMMQZXJnjKGHOttfbXVWxi1ZT6LrKMMZ/A/Ty8vioNqi2/Ai7Oe7wp\neK4hGWOaccH9iLX278NuT4h2Al3GmJuAGLDGGPN9a+2fhNyuORp6kY4x5iVgu7X2zbDbEgZjzI1A\nCvhv1to3wm5PtRljVgH/DnwYeBX4v8BHrbXPhdqwkBhjvg9MWmvvDLsttcIYswvwrLVdYbelUMPV\nvAtYavQnUZV8C1gNjAVTov467AZVk7X2XeBzuFk3x4HHGzi4dwIfA643xhwL/jzcGHa7pLSG7nmL\niERVo/e8RUQiSeEtIhJBCm8RkQhSeIuIRJDCW0QkghTeIiIRpPAWEYkghbeISAT9fyOwCfJ3eAFP\nAAAAAElFTkSuQmCC\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x109749490>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# Generate train data\n",
+    "X = 0.3 * np.random.randn(100, 2)\n",
+    "X_train = np.r_[X + 2, X - 2]\n",
+    "X_train_D = pd.DataFrame(X_train, columns=['x1', 'x2'])\n",
+    "\n",
+    "# Generate some abnormal novel observations\n",
+    "X_outliers = np.random.uniform(low=-7, high=7, size=(40, 2))\n",
+    "X_outliers_D = pd.DataFrame(X_outliers, columns=['x1', 'x2'])\n",
+    "\n",
+    "b = plt.scatter(X_train[:, 0], X_train[:, 1], c='blue')\n",
+    "c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')\n",
+    "plt.axis('tight')\n",
+    "plt.xlim((-5, 5))\n",
+    "plt.ylim((-5, 5))\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "Done.\n",
+      "200 rows affected.\n",
+      "Done.\n",
+      "Done.\n",
+      "40 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Build tables\n",
+    "%sql DROP TABLE IF EXISTS X_train_D CASCADE\n",
+    "%sql PERSIST X_train_D\n",
+    "%sql ALTER TABLE X_train_D add column X float[]\n",
+    "%sql update X_train_D set X = array[x1, x2]::float[]\n",
+    "\n",
+    "%sql DROP TABLE IF EXISTS X_outliers_D CASCADE\n",
+    "%sql PERSIST X_outliers_D\n",
+    "%sql ALTER TABLE X_outliers_D add column X float[]\n",
+    "%sql update X_outliers_D set X = array[x1, x2]::float[]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>coef</th>\n",
+       "        <th>loss</th>\n",
+       "        <th>norm_of_gradient</th>\n",
+       "        <th>num_iterations</th>\n",
+       "        <th>num_rows_processed</th>\n",
+       "        <th>num_rows_skipped</th>\n",
+       "        <th>dep_var_mapping</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>[-0.0432454845758051, -0.159444816692118, 
-0.737806938475955, 0.0534370865459891, -0.302783984437678, 0.216663708966247, 
0.413951840077392, -0.624686692573685, 0.383245902283947, -0.93194741477619, 
0.398359325873191, -0.106725591800195, -0.149623841552614, -0.0586264154241909, 
-0.0712714894313125, -0.752820609462399, -0.0387893518368972, 
-0.902369710478552, -0.559534808391375, -0.525734075427885, -0.125932502169152, 
-0.159125403795632, -0.554052542709238, -0.295316988845407, -0.343813368149046, 
-0.144503832215855, 0.372471877108083, 0.482314750223444, 0.43941447611859, 
-0.251685614368991, -0.167096578461358, 0.33496817207315, -0.0951761758107272, 
0.617859995418938, 0.481179708913367, 0.425753691404979, 0.142601387350667, 
-0.0702737675277522, -0.625499347350069, -0.10838092278605, 0.659909999982923, 
0.189460860381574, 0.560772005661166, 0.637457997296956, 0.142566086425306, 
0.307329400451873, -0.0570729145059836, 0.0923408623395759, 0.673831714495205, 
0.7458027073
 98761, -0.12887594773649, -0.226376229070672, 0.358019840034591, 
-0.285312281448689, -0.4181210434903, -1.00005186868902]</td>\n",
+       "        <td>0.115298833215</td>\n",
+       "        <td>114.886308162</td>\n",
+       "        <td>100</td>\n",
+       "        <td>201</td>\n",
+       "        <td>-1</td>\n",
+       "        <td>[-1.0, 1.0]</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[([-0.0432454845758051, -0.159444816692118, -0.737806938475955, 
0.0534370865459891, -0.302783984437678, 0.216663708966247, 0.413951840077392, 
-0.624686692573685, 0.383245902283947, -0.93194741477619, 0.398359325873191, 
-0.106725591800195, -0.149623841552614, -0.0586264154241909, 
-0.0712714894313125, -0.752820609462399, -0.0387893518368972, 
-0.902369710478552, -0.559534808391375, -0.525734075427885, -0.125932502169152, 
-0.159125403795632, -0.554052542709238, -0.295316988845407, -0.343813368149046, 
-0.144503832215855, 0.372471877108083, 0.482314750223444, 0.43941447611859, 
-0.251685614368991, -0.167096578461358, 0.33496817207315, -0.0951761758107272, 
0.617859995418938, 0.481179708913367, 0.425753691404979, 0.142601387350667, 
-0.0702737675277522, -0.625499347350069, -0.10838092278605, 0.659909999982923, 
0.189460860381574, 0.560772005661166, 0.637457997296956, 0.142566086425306, 
0.307329400451873, -0.0570729145059836, 0.0923408623395759, 0.673831714495205, 
0.745802707398761, -0.
 12887594773649, -0.226376229070672, 0.358019840034591, -0.285312281448689, 
-0.4181210434903, -1.00005186868902], 0.115298833215421, 114.886308161636, 100, 
201L, -1L, [-1.0, 1.0])]"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql \n",
+    "-- Train the model\n",
+    "DROP TABLE IF EXISTS svm_out1, svm_out1_summary, svm_out1_random 
CASCADE;\n",
+    "SELECT madlib.svm_one_class(\n",
+    "    'X_train_D',    -- source table\n",
+    "    'svm_out1',     -- output table\n",
+    "    'X',            -- features\n",
+    "    'gaussian',     -- kernel\n",
+    "    'gamma=1, n_components=55, random_state=3', \n",
+    "    NULL,           -- grouping \n",
+    "    'init_stepsize=0.1, lambda=10, max_iter=100, tolerance=0'  \n",
+    "    );\n",
+    "SELECT * FROM svm_out1; "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "200 rows affected.\n",
+      "Done.\n",
+      "1 rows affected.\n",
+      "40 rows affected.\n",
+      "20 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>index</th>\n",
+       "        <th>prediction</th>\n",
+       "        <th>decision_function</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>3</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.915642435444</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>11</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.977872869017</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>1.0855373153</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.79941793621</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>35</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.733618196408</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>43</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.837947132017</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>51</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.972880103728</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>59</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.694748057993</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>1.10798285659</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>9</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.951860111855</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>17</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>1.15980904553</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>25</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>1.04124250042</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>33</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>1.14540908258</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>41</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>1.15308103579</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>49</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.88082676775</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>57</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>1.03673395362</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>2</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.575998016748</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>10</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.582246638053</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>18</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.883625378662</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>26</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.659992076181</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(3L, 1.0, 0.9156424354437),\n",
+       " (11L, 1.0, 0.977872869016699),\n",
+       " (19L, 1.0, 1.08553731530472),\n",
+       " (27L, 1.0, 0.799417936209621),\n",
+       " (35L, 1.0, 0.733618196407722),\n",
+       " (43L, 1.0, 0.837947132016513),\n",
+       " (51L, 1.0, 0.972880103727547),\n",
+       " (59L, 1.0, 0.694748057993407),\n",
+       " (1L, 1.0, 1.10798285659429),\n",
+       " (9L, 1.0, 0.95186011185464),\n",
+       " (17L, 1.0, 1.15980904553282),\n",
+       " (25L, 1.0, 1.04124250041991),\n",
+       " (33L, 1.0, 1.1454090825827),\n",
+       " (41L, 1.0, 1.15308103579249),\n",
+       " (49L, 1.0, 0.880826767750115),\n",
+       " (57L, 1.0, 1.03673395362435),\n",
+       " (2L, 1.0, 0.575998016748392),\n",
+       " (10L, 1.0, 0.58224663805317),\n",
+       " (18L, 1.0, 0.88362537866157),\n",
+       " (26L, 1.0, 0.659992076181318)]"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Prediction\n",
+    "# First for the training data\n",
+    "%sql drop table if exists y_pred_train;\n",
+    "%sql SELECT madlib.svm_predict('svm_out1', 'X_train_D', 'index', 
'y_pred_train');\n",
+    "y_pred_train = %sql SELECT * from y_pred_train; \n",
+    "\n",
+    "# Next for the outliers\n",
+    "%sql drop table if exists y_pred_outliers;\n",
+    "%sql SELECT madlib.svm_predict('svm_out1', 'X_outliers_D', 'index', 
'y_pred_outliers');\n",
+    "y_pred_outliers = %sql SELECT * from y_pred_outliers; \n",
+    "\n",
+    "#%sql SELECT * FROM y_pred_outliers limit 20; -- Show the outliers\n",
+    "%sql SELECT * FROM y_pred_train limit 20; -- Show the training data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "Done.\n",
+      "10000 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Predict over the decision grid for plotting\n",
+    "# xx, yy = np.meshgrid(np.linspace(-7, 7, 500), np.linspace(-7, 7, 
500))\n",
+    "xx, yy = np.meshgrid(np.linspace(-7, 7, 100), np.linspace(-7, 7, 100))\n",
+    "grid_points = pd.DataFrame(np.c_[xx.ravel(), yy.ravel()], columns=['x1', 
'x2'])\n",
+    "\n",
+    "%sql DROP TABLE IF EXISTS grid_points CASCADE\n",
+    "%sql PERSIST grid_points\n",
+    "%sql ALTER TABLE grid_points add column X float[]\n",
+    "%sql update grid_points set X = array[x1, x2]::float[]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "10000 rows affected.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      
"/Users/fmcquillan/anaconda/lib/python2.7/site-packages/numpy/ma/core.py:6442: 
MaskedArrayFutureWarning: In the future the default for ma.maximum.reduce will 
be axis=0, not the current None, to match np.maximum.reduce. Explicitly pass 0 
or None to silence this warning.\n",
+      "  return self.reduce(a)\n",
+      
"/Users/fmcquillan/anaconda/lib/python2.7/site-packages/numpy/ma/core.py:6442: 
MaskedArrayFutureWarning: In the future the default for ma.minimum.reduce will 
be axis=0, not the current None, to match np.minimum.reduce. Explicitly pass 0 
or None to silence this warning.\n",
+      "  return self.reduce(a)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": 
"iVBORw0KGgoAAAANSUhEUgAAAW8AAAEKCAYAAADdBdT9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XuUlPWd5/H3t2lbkIaoQUMU5RJIMAg66uYccTcmOooj\nG4wzZoKZJCRx8LCxt2kuhiDG9EnCoI49uMSTQdH1YDwurrgqCTNpMfGYo8RcFG1QCYKAKBKCqE1x\na4r+7R+/p7qerq7urq6qrqqn6vM6h2NdnnrqV6V++NX3d3nMOYeIiERLVbEbICIifafwFhGJIIW3\niEgEKbxFRCJI4S0iEkEKbxGRCFJ4SySY2aVmtqvY7SgEMzvLzFrNzIrdFildCm/pEzPbYWZ/MbNB\nocduMLNnC/D2HYsSzGy7mV2WzUnMbKSZtQcB2Wpm75nZGjP72z6c44dm9lA275/mXJ0+i3Nul3Nu\nqNMiDOmBwlv6yuH/u2lI83iUOOBjzrmhwHnAM8ATZvbN4jZLJDMKb8nGvwLzzGxouifNbLKZ/cHM\nPjCz35vZxcHj/2hmf0w5do6ZPRncrjGzu8xsZ9Ab/pmZnZjm/A8BZwO/DHrO883sl2Z2U8pxr5rZ\nNT18DgNwzu11zi0DGoE7Qq//pJmtNrO9ZrbNzP5n8PgU4Bbgq2Z2wMw2BI8PNbP7zWy3me0ysx+H\nSx9mNtPMXg/avMnMzg99ll+EPkvil0FVqB1Pmdn7ZrbFzP45dM4fmtmjZrYyeP1GM7ugh88s5cI5\npz/6k/EfYDtwGbAa+HHw2A3Ab4LbpwD7ga/hOwfTg/unAIOAj4BPhc73B+Arwe2lwJPAx4DBwFPA\n4uC5S4G3U9rxxdD9rwAvhu6fB/wVqE7zGUYCx4GqlMdHA+3AZ/DB/idgETAAGAVsBa4Ijv0h8FDK\n658AfgYMBIYBLwIzQ+3bBVwQ3B8DnNXNZ+nUPuC3w
 
E+BE4LPtRf4Qqgdh4ApQZv/Bfhdsf870Z/+\n/6Oet2Trh0CdmX085fGpwBbn3CPOuXbn3CpgM/Al59xhYA1wPYCZjcMH5ZrgtTOBOc65j5xzB4Hb\nE8d2IzygtwYYZ2afCu5/HXjUORfvw2faHfzzVOC/AMOcc4udc8edczuA+/F/GXVtiNnpwN8F7T/i\nnNsH3B06/gbgTufcywDOubecc+EB2LSDk2Z2FnAxsMA5d8w592rQjnB553nnXLNzzgE/Byb14TNL\nRFUXuwESTc6518zsl8BC4I3QU2cAO1MO3wmcGdx+BLgL+Am+d/6kc+6omZ0GnAS8FKo0VNFNqKVp\nz1EzexT4upn9CB/6/9DHj3Umvha+Hx+AZ5rZ/uA5C9rz225eOxLfM34vaL8Ff94Onj8L2NbH9gB8\nEtjvnDsUemwncGHo/p7Q7UPAQDOrcs61Z/F+EhEKb8lFI/Ay0BR6bDddQ/Ns4D+D2+uA08zsPHyv\nNDHwuQ8fPBOcc+9l8N7pBkgfwvc8XwAOOud+n8F5wv4e2Ouc+7OZnQK85Zz7TIbvvws4Anw86AGn\n2gV8Ks3j6c4Vths41cwGB79GwH+f7/bwGqkAKptI1pxz24BHgfrQw/+BL19MN7MBZvZV4Bzgl8Fr\n4sBj+EHPU/BhThB4K4C7g144ZnammV3ZzdvvwdeNw+15EV+zbsKHeE8SPWPM7HQzqwN+AHw/eP4P\nwAEz+56ZDQw+ywQzuyh4/i/AqMSApHNuD/A0sNTMhpg3xsw+Hxx/PzA/MZhoZp8KSiKJc3X6LCQH\nU98B1gNLzOxEM5uEL8H09Pk0P7wCKLylr1J7iT/ClzscgHNuP/Dfgfn43vR8YGrweML/AS4H/m/K\nT/sF+EHBF83sQ3wYfrqbdtwO/MDM9pvZ3NDjDwHnAg9n8Dk+MLMDQAtwFXCdc25l8Dnag89xPn5A\ncS/+L5fEDJvH8CH5vpn9KXhs
 
BlADvI4vvTwGDA/OtxpYDDxiZq34wc1Tg9ctSfNZwt/z9fjB1N3A\n48APnHM9zauP2rRNyYKl/4UnEk1m9g38DI/P93qwSISp5y1lw8xOAr4L3Fvstoj0N4W3lIWgNr4X\neA9flhEpayqbiIhEkHreIiIRVLB53mamLr6ISBacc12mfxZ2kU5jQd+tq2eBLxa5DaVC30WSvosk\nfRdJpfJdNKZ/WGUTEZEIUniLiERQZYX3qGI3oISMKnYDSsioYjeghIwqdgNKyKhiN6BnlRXeo4vd\ngBKi7yJJ30WSvoukEv8uKiu8RUTKhMJbRCSCFN4iIhGk8BYRiSBdSUckU1uhdr2/GZsMjC1qa6TC\nKbxFMrEVhq6CZcHljOvfhtbpKMClaBTeIhmoXe+De0bigTjUrYeYwjtz+uWSVwpvEel/+uWSdwpv\nkQzEJvvAIRE+1UHvUTKiXy75p/AWycRY31Os089+KREKb5FMa7Fj1VPMln655J/CWyqbarGFoV8u\neZe38DazKuBPwDvOuWn5Oq9If1IttoD0yyWv8rnCcjbweh7PJyIi3chLz9vMRgBXA4uBufk4p0gh\nqBYrUZWvsslS4GbgY3k6n0hhqBYrEZVzeJvZVOAvzrlXzOwLQJerHHd4NnR7FCW/2blUCNVipZRs\nB3b0flg+et6XANPM7GpgEDDEzB5yzn2zy5GlcCVmEZFSNprOHdvn0h+W84Clc+4W59zZzrkxwHTg\nN2mDW0RE8kb7eYuIRFBeF+k4556j206+iIjki3reIiIRpOXx+aY9i0WkABTe+aR9MkQkoZ87cgrv\nPNI+GRVOv7okoQAdOYW3SD7oV5eEFKIjp/DOI+2TUbn0q0sKTeGdT9onQ0QoTEdO4Z1v2iejIulX\nl3RSgI6cOefye8bu3sjM0ViQtxIpDg1YSn9oBOdclw3/1PMWyRf96pIC0gpLEZEIUniLiESQwltE\nJIJU8xY
 
pU25c9q+1N/PXDukfCm+RMpBLUGdyPoV56VF4i0RUvgM70/dSkJcGhbdIxBQytHt6f4V4\ncSm8RSIiH6Hd3AL3rfW3b5wKUybl3h6FeHEovEVKXL562s0tMGMp3NHm78/YAivn5BbgoBAvFoW3\nSInKd3nkvrU+uDt2Pmzzj+Ua3gkK8cLSPG+RElTsunYu3Lhotz8q1PMWKTH9FXw3TvWlEoKyyYIa\nWDm1b+doboGmtbUAzJsa67HX7sapF96ftKugSAnp7x5rLgOWzS1w7dKhHG5bBsCgmnqemNPa6zkU\n4Dlq1K6CIiWtEKWGKZM6B3ZfetJNa2uD4PZV88Nt0LS2jimTYj2+p2rh/UPhLVJBwmF96TkxFj+V\n7Ek/vyWznnS2VEbJL4W3SAkoRK87teyxblMDcDeZ9qTnTY3x/JZ6Dgc180E19cyb2nOvO5UCPH8U\n3iIVoLkFvnbPyRxuGw8MDx6t7dM5pkyCJ+a00rS2DqAjuC+4ZSA79w1k5Glxlny159ILKMDzReEt\nUuaSPe67g0e+ARwDbgDmdxyXSU/a18xjHeed1nQSbfGTgLvYfxCmNdWzZl7vpRcFeO4U3iJF1t8l\nk9SBRm85cBdwBdDIqYM380hd+tDtblCzaW0tbfFzgVkd526LZzaICQrwXCm8RSpSIlynAHu4cHRd\nt8EdrpNnMqi5LwZXLkkOij73RvezWRTg2dM8b5Eiy6bn3Zcpfr68MZS2+LLgkfnAAWAcUEt1VQu/\nvPkQ4M+5Lwath47ywcHBHDsOB45cDiRyYjRXnHsvTy+MdSmbAFQPqKfK4rTFfwZsBFYAvc8LV4D3\noFHzvEXKQja94ZoBx2mL346vdY8A3iJR746313PTgyewa/+gUMDX42viO4BfA+OBS4CV/O5NR3OL\nr3+vmXeIhava2bmvgVMGx/nLR47Y0Un4QdE1+ODufTaLeuB9p/AWiZi+LJZJBv0ZwD4S
 
PWQf3MPx\nZRPYtvdW4Cd0ros/CLTgpxMCLABmEDv6JFff+T7njfSzS17+lyM0txzp9BeKP8/4Pn0uBXjfKLxF\nisze7L9By2TQ340P7nA43wScB4wGTkzz6neApXQd6PyQdnc3G3bAtUt9r3/ho+kGRW/H9+C9TGaz\nKMAzp/AWiZjsFsu8n+ax04Bp+ID9HOFpg/6xM0L3m/HB/Wfgs4R7/QsfrWPDjq4blA4ZuIcFX2rl\n8T/WsfOv1Ywc1pbBp1OAZyrnAUszGwE8BHwCaAdWOOeWpTlOA5Yi3ehrzzt1mfvjf6wNAvIIS6Yf\n6ah/L34SfvDYYBxxfO86PGj5ML5sshJoAI7iA/sgvr79K2AAMDM4JlFyqQe+BywCVjJk4GwOHDkO\nDCRclvmbkTGWTD+izaxy1Zh+wDIf4T0cGO6ce8XMaoGXgGucc5tTjlN4i/Qg21knqTNJaqoPsWae\nnz3ig/OzwXNnAq/gZ5p8g2TQrgTmAqcDu/EDmq8B86mye2l3NcC/kSyJrAR8jbymup6aAceJHZ2I\nD/ztwTF+VgrAuk33dHrtFefW8fTC3ueBK8ADjf0028Q5twfYE9yOmdkb+P9KNvf4QhHJSrjXve9A\nPAjuZK25Lb6cprWbAIIe7xrgdWBrcFwz8EBw9ET8QOS3gSfxPfMfB8c8SLu7B18uSXUIWM6xeJwB\nZvjgfhi4AwAzX8pJtDPspe3VHbNVeqLySc/yWvM2s1HA+cDv83leEfFSpwlWWT1+PnVPbgSuB75D\nOGBhNr4scjbwAvBRcK4YPuQTve13CA88+tvHgEYcezh87C78fO6ZwHKMzfz4ukRppHN9Huaz/+AN\nXLt0RUblEwV49/IW3kHJZDUw2znXt63GRCSjWSep0wTbHfh69cTgiLnUVB9h3lRfNvHBuQz/Y/gF\nfHCHZ4TMDV6fuP3vwKnAkdAxL+ODeU1wf2ZwrvvwA56fBqYwZOA
 
DnDAARg47wkVj/JGJzay+dk8D\n+w+OJ1FnP9w2kYWPZraMXtLLS3ibWTU+uH/unHuq2wOfDd0ehZ+hJCI5MRwuKG0YR7jt2kMdPdrE\nLoCbdsV576OBaV79abpOBQT4kOTsk934kA7XyF8AtgDzgHOB0cSOHMMxMdigqoU18w51XPzhwtFx\n1m2aRWJeOcCrOzMrn/zqMFz1WFB+mRyDsb1+JdG2Hb82qhd5WR5vZg8B+5xzc3s4RgOWIhnoqfed\nrmzS7mYSDtbuBgSvWALPbBpKcsbJHHwpJRzKy/EzTm4E/hE/LfA94K9AImVfB+KA4Xv8l+B77Cfi\n54UDzKX2xKNcPM46pjFefedQ2jsmoi0Avt6x1D7Tz0t1PUxvLf8AD2vspwFLM7sE+Cdgo5ltwG+C\ncItz7le5nluKbCvUrvc3Y5OprP9hSlTqntr7DsTZsHNiL6/y3j+Q6Hkn+liX4QM78fp6fCg34nvI\nM4HHgJPwUTErOG42cBy4N7i/ABiD76kne/Gxo8tZt2lWx/L9885uY8POxF8OKwnmOfSoy46IcWB9\nHYxVuSUfs01ewI96SDnZCkNXwbK4v1v/NrRORwFeAL3VvlP31L52ae8LdppbYOOuQcBn8PO4d+Ln\nFQzDL4P/OD6s78eH6srg8W9TZQ8EPebU8kr4/q1pWnoGMKNj+f6S6TGuXfo6h9tmAXuyuhKPJGmF\npaRVu94Hd8f/nnGoWw8xhXdJSXd1m9QacqL0EG9PlDQaSO4S+H2S/5bnM2SgccKABk6pPcLQgTBs\nyL3si8GGHb215EOSPXp/Lj842be2pkpdTUp1va97i8JbpBT1Zb+TcE88nfQXY7gdeJvkFMBfAOs4\ncMTXlj88VM+Prmtl0Ze79u59SB8BLg7ubwQWBrdvZYAdxOwQ8Xbfgw/3sHtra7rPFg78dedXwIBl\nhhTeklZssi+VkCibVAd1bymYXDesSizmeW
 
l71//NTx28h0fq/HTChatmsWHnQMLbt7Y7uG11AxeN\n+bBTgCb2+n7rr4NwLlEDT/S4fwrcwXEHNQPq+ZuzZjFsSHVGPeyehANfc76TFN6S3lhf467TgGUk\ndZ6lsZHU3f3mXt2aXP1okG771nY3gqa1caZMinUK0CuX1LJtb2pP/lbCc8jb4jBsSGbL4PtCi3aS\nFN7SvbGqcRdbtr3vdKWSUwc3cOHoOJeeE2PxU+G9txvw0/1uDp1hPtDGvgPxjN6vuuog8fa+t1Oy\np/AWKXH52e97IheOjvP0whhXLkkN9o34vU6Gk5zn/TCwB6yuyyXX0m1Ju+iaVhY/ldk2tX25hJt0\nT+FdDJo/Lf2sb3t+TwQm4KcPhmefrATSX3It3ayRi8b0PpMkm0u4halkkqQLEBda6vzpas2flszk\nsud3OEy7rFpkDn4l5XCqbF3HKshBNfWM/2RiYU3ft3RN58oltVlvEQsVGt6NugBxSdD8aclWuvJJ\ncwvct9bfvnFq531CupuWl5g9ctODdWzbW42/0PBEoJ5v/NdWdn+Q7D2n29K1WCoyuHug8BaJkHCA\nN7fAjKVwR1AambEFVs7pfaMn8MeMOR227b2b8KDm7g9Se8HZXHKte9ldwk3BnY7Cu8A0f1pylQjw\n+9b64O6I3jb/WD4HALNZFZnv8ym401N4F5rmT0se2Jvw9zmeI9NecF9XRfYm0/MptHum8C4GzZ+W\nPPh/58Mzm+n4FbegBlZOzfz1+e5V54tCOzOabSISZaFpp6u/kt+SSSEpsHvQqNkmIuUn9CvuKoC8\nLOjpfwrrHqSuA+mGwlukzISDsZhBroDOQrp99Ls5VOEtUsZ6CtBsgl2B3L/SrQP5VjfHKrxFKpSC\nONoU3iIiJSLdOhC62dhRs01EREpJ6oDlw5ptIiJS+jJcB1LV/y0REZF8U3iLiESQwltEJIIU3iIi\nEaTwFhGJIIW3iEgEK
 
bxFRCJI4S0iEkEKbxGRCFJ4i4hEkMJbRCSCFN4iIhGk8BYRiSCFt4hIBCm8\nRUQiKC/hbWZXmdlmM9tiZgvycU4REelezuFtZlXAPcAUYAJwvZmNz/W8IiLSvXxcSedzwJvOuZ0A\nZrYKuAbYnIdzi+Rf6mWmMrhqiUipyUd4nwnsCt1/Bx/oIqVnKwxdBcsSF3h9G1qnowCXyCnsNSyf\nDd0eBYwu6LuLULveB/eMxANxqFuf2TUDRQpiO7Cj98PyEd7vAmeH7o8IHuvqi3l4NxGRcjaazh3b\n59Iflo/w/iMw1sxGAu8B04Hr83BekbyLTfalEhJlk+qg7i0SMTmHt3PuuJnVAU/jZ6884Jx7I+eW\nifSHsb7GXacBS4m4vNS8nXO/Aj6Tj3OJ9LuxqnFL9GmFpYhIBCm8RUQiqLBTBUWkvGjBU9EovEUk\nO1rwVFQK7wrjxvX8vL1ZmHZI9GnBU3EpvCtAb4Hd07EKc5HSpPAuY30J7UzOoSCXMC14Ki6Fd5nK\nR3CnO6cCXDpowVNRKbzLUH8Ed+q5FeICaMFTESm8y0h/hnZ376UQFykOLdIpE4UM7lJ4X5FKp/Au\nA8UOUDeu+G0QqTQK74grpdAspbaIlDuFd4SVYliWYptEypHCO6JKOSRLuW0i5ULhHUFRCMcotFEk\nyhTeEROlUIxSW0WiRuEdIVEMwyi2WSQKFN4REeUQjHLbRUqVwjsCFH4ikkrhXeLKJbjL5XOIlAqF\nt6TV3AJXLqnlyiW1NLfk55wKcJH80cZUJaxYYdfcAtcuHcrhtmUAPL+lnifmtDJlUnHaIyJdqedd\novId3H3pSTetrQ2CewYwg8Nty2haW5uXdqj3LZIf6nmXoHwFXHOLD+J9B+K89m4NbXH1pEXKhcK7\nTHUufSwHZpG4VOzhNmhaW8eUSbG0r503NcbzW+o53ObvD6qpZ97U9MdmQ1fkEcmdwrvE5NrrTvS2\n
 
X9pezeG2G/CB/WCfzjFlEjwxp5WmtXUAHcF9wS0D2blvICNPi7PkqzH13EWKSOFdQvIR3OGBRpgP\nnAK8Gtz2aqp770lPmURHz7y5BaY1nURb/CTgLvYfhGlN9ayZl33pRb1vkdwovMtI54HGhFuBu4Hh\nwH3Abiac2dan0G1aW0tb/FzCpZe2eM+lFxHpX5ptUiL6bxbG4eCfU4DHgVkMG5L+7+xc5nb3x7xw\nEemeet4lLlHDBl977qnHPG9qjOc219MWTzwyHzgINOAHLS9hUM2KjpJJeDZK6+Fq3trrcIwCanlu\ncwtr5h1iyqTEeVtoi3cuvVx6Towrl2Q/m0WlE5HsKbxLWDaLZWoGHKctvhwYAIwA3ga+DUwE6jnj\n5MP86S1Y+Ggtr+6spt1dDjyHL4esJFEbb4vP57q7jdUNB5kyCdbMO8TCVe3s3NfAKYPjYHFuW30y\n7e4G4AX6MptFRHKn8C4B3ZVMUmvYPYViMug/C1wCPAzcETy7AB/My9i293ZufWw3kBjUnAN8B3gR\nGAusAW4E7iJ29FamNTkmjKhiWC0smR4DjgTvszx07vG5fQEi0mcK7zKRDPp3gLvwg5ThgcubgC8D\nx/DBHX7uLuBdYGlwfwbwdWAYbfEjbNhxF+B7/uPPaE8zKLqC8GyWfM8LF5GuFN4lLLvFMi8DH0/z\n+Gn4kB2e5rnd+OCeATQDo/Fzw4fjgz3Z839t1+w0rz9OTfUhJoyoY1ht77X5MNW9RbKTU3ib2Z3A\nl4CjwDbg28651nw0TLpfLHPlkq4DmJeeE+PXrzXQ7tqBOOGecLJssgeoA+pDz80HjgS3m/FBnSi3\nzAY2dmpT2/HjKeduoPbEY6xuOAT4XwB+gFWLeET6U64976eB7zvn2s3sdmBh8EfyJLxYZvGTBIOE\n44FLeH7LCp6Y4/+uXPzU0GDw8EF8WWQ4vlRyGj64pwT/HIUvkTQAQ/C18XX4Q
 
P8sPrjDJZHZ+MFO\ngmNGBedaEzx2AxePuxfQToQihZRTeDvnngndfRH4h9yaI91pboHbVg+l3d0dPLKAw20zaVrrg9OH\n5hrg0/je8hp8gG/C97gTM0nagDOAvcDZ+CBeAbQDW9K88yBgOVW2mZrqoxw5NoXOg6G+lNOXwVUR\nyV0+a97fAVbl8XwVLzzHe9+BOO0udaBweZpXnYkP45n4WrbDh/bH8L3tEcAP8CH/GnAW0ArcA/yC\nziWVeuBk4He0u5WYzQ6dezmwmRn/zfeum9Z2bclL26tpbkG9b5F+0Gt4m9k64BPhh/CJsMg594vg\nmEXAMefcI/3SygqUOse7yupJrT9X2eaOOrgf2JyJL5vMpHPveD5wPn5Q8pPAYPy87NnAIZKzT9YE\nr02URBLnawbgcNs5VFe1cEL1/RyLVzFy2EGun+yPTB1chfnsP3gDV9+5gh9d18qiL+fpixERIIPw\nds5d0dPzZvYt4Grgsl7f7dnQ7VH4SQ2SVmoZot2B0YAL6s9m9fzoumRN2Q9s3stzbwyg7fgLdK1d\nzwOagts340sq/4vOg4/g69t3BbdX4nvo84H3gHOJt/8PjrctxzGRbXthWlNyJeYTc1r52j0N7D84\nHv+XxxTa3URuW93ARWM+7L0HvhVYH1z0YXLMTzsXqTTbgR29H5brbJOr8Enweefc0V5f8MVc3q18\n2ZuZ7m3iSJRKThgQ56IxyWcSA5vNLfB3d2zGdXntODqH+X3ANHxPPFEqGQ18l2Q5ZjNwA/C/Sc4B\nr8dRje+5Q1t8LtfdbVw8zpg3NcaFo+Os2zQLX0v32t14mtZu6rn+vRVYNRSCJfa8XQ/TWxXgUnlG\n07lj+1z6w3Ktef8UqAHWmRnAi8657+Z4TqFrGaLK6ml3M0n0itviK9MOCE6ZBJef+yHPbArXrhvw\nIRy2m+QUwhX4v4OPQSiYYS7w7/iBzcTKy88SXgoPEDu6
 
nHWbZvH8lnoWXdPKr1+rp73jb48F+AU/\nm3r+wOtrg+AOzhsH1tfBWA14iqST62wTXZGwn6TO8d53IM6GnRN7eZX38vaT8WH9PeB0/KDjCjpP\n+TuKn/O9B/gt8HOgkdRg9sH//eD2DPzUw1Rn4K91Cc+9UcePrmvlttUNwZTGr3faDEtE8kMrLEtE\nutJJ6gURrl3a+2rL5hZoPWz4zaI+ga9Vj8XP4kwMRF7BkIG/Bh4gduQYjlnAHqpsc6jHnDCezmFe\nh++RJ8zH17eTFn0ZLhrzIU1rNwGbMltxOTnmSyWJHRGr6/1jIpKWOde1Otovb2TmaCzIW0VWb79j\netsetuuVdOrx87dPBn6CD+HFJPc+8QOfY047zJjTT+TSc2Isfir8+gbgcuiooI8G/gRcASxngB3E\n7BDxdj/XfFBNdgtzOpbHa8BSpKtGcM5Z6sPRC++tULve34xNpuz+B8+lEHXlklrWbbqHZE95JVVW\nx8knxdl/sIbk1L9/Szmmgf/4np8N0rHHdwz2fHCY9z4aTHIHwnrgWuBXJKYh1lTXM+HMNoYNqe7T\nniYJ2tdEpBeN6cM7WmWTrTB0FSwLflrXvw2t0ymrAM985klS+KLDqc47O86wIdXsi7Wzdc/9HDhy\nTpdjwrNBwqWaK5fU8t5H6S6rlpyG2BaHYUPqeHqhShwihRSp8K5d74O7I0riULceYmUU3n3VuVSy\nkfAKyZrq73a6wo0vg1yCnwGSMBv4W3qdDRKorjpIvD0fLReRXEQqvCtFX3rf6S46fOrgBi4cHWdf\nrIoNO8LPbQQewNex5+IX4PwzsIJLz4l1qamn25J20TWtLH4qs21qe6vRq2Qikr1IhXdssi+VJGYk\n1FcHde8ylE35xJvIhaPjPL0w1rF1bPg5mAD8ns5174k8/sc6Fj9V1WVXwNQtaadMgovGdH0sVTaX\ncBORzEUqvBnra9x1ZTxgGZZJgPd
 
0wYau+43MwS+yObnLeXb+tZrDbcmr7yR2BXx6YSztQqDedgvs\nbZdB9bpFchOt8AYYW1k17t4CPN0FGxK928RzNz1Yx7a91fiFOxOB71I9oJ74cX/coJp6Rg5rY//B\n/vwkSQpukdxFL7wrUCYB3l1PeMokGHM6bNvb+ZqWE0fMYtiQzlfoyWQRUKa6+0Wg4BbJD4V3RCRC\nL18bEgwbUt1lel93PfhspPtFcNWg7M8nIp1Fb5GOZDUPPDx4mO1KyFyoxy2SpcZyWWEpQPYLeSD3\nXnVfKLRFctSo8C5bpbi3o0JbJE8ay2F5vKSV73p4LhTaIoWh8C4j4eAsVJArrEWKQ+FdptKFai6B\nrpAWKS2BiapFAAAE0klEQVQK7wqiABYpH1XFboCIiPSdwltEJIIU3iIiEaTwFhGJIIW3iEgEKbxF\nRCJI4S0iEkEKbxGRCNIiHREpD1uhtkIukQgKbxEpB1th6CpYlrg4+dv+erflHOAKbxGJvNr1Prg7\nLvQX9xcqL+fr3armLSISQep5i/RFhdVVoyI22ZdKSJRNqoN/P2VM4S2SqQqsq0bGWP/voq6C/mJV\neItkqBLrqpEytrL+XajmLSISQep5i2SoEuuqUroU3iKZqsC6qpSuvIS3mc0D/hUY5pzbn49zipSk\nCqurSunKueZtZiOAK4CduTdHREQykY8By6XAzXk4j4iIZCin8DazacAu59zGPLVHREQy0GvN28zW\nAZ8IPwQ44FbgFnzJJPxc954N3R4FjM6wlSJSOSp9Fet2YEfvh5lzLqvzm9m5wDPAIXxojwDeBT7n\nnNub5nhHY1ZvJSKVInUVa7VWsdIIzrkuHeOsZ5s45zYBwxP3zWw7cIFz7oNszykilU2rWDOXzxWW\njt7KJiIikhd5W6TjnBuTr3OJSGXSKtbMaYWliJQOrWLNmMJbREqLVrFmRLsKiohEkMJbRCSCFN4i\nIhGk8BYRiS
 
CFt4hIBCm8RUQiSOEtIhJBCm8RkQhSeIuIRJBWWBZLpe9ZLCI5UXgXQ+qexW9rz2IR\n6RuFdxFoz2IRyVVl1by3F7sBJUTfRZK+iyR9F0kl/l1UVnjvKHYDvNhkv0/xSvyfouxZvKPA71fK\ndhS7ASVkR7EbUEJ2FLsBPVPZpBi0Z7GI5EjhXSzas1hEcpD11eP7/EZmhXkjEZEyk+7q8QULbxER\nyZ/KGrAUESkTCm8RkQiq2PA2s3lm1m5mpxa7LcViZnea2Rtm9oqZPW5mQ4vdpkIzs6vMbLOZbTGz\nBcVuT7GY2Qgz+42ZvWZmG82svthtKjYzqzKzl81sTbHbkk5FhreZjQCuAHYWuy1F9jQwwTl3PvAm\nsLDI7SkoM6sC7gGmABOA681sfHFbVTRxYK5zbgJwMXBTBX8XCbOB14vdiO5UZHgDS4Gbi92IYnPO\nPeOcaw/uvgiMKGZ7iuBzwJvOuZ3OuWPAKuCaIrepKJxze5xzrwS3Y8AbwJnFbVXxBB28q4H7i92W\n7lRceJvZNGCXc25jsdtSYr4D/GexG1FgZwK7QvffoYIDK8HMRgHnA78vbkuKKtHBK9npeGW5SMfM\n1gGfCD+E/5dwK3ALvmQSfq5s9fBdLHLO/SI4ZhFwzDn3SBGaKCXEzGqB1cDsoAdeccxsKvAX59wr\nZvYFSjQjyjK8nXNXpHvczM4FRgGvmpnhywQvmdnnnHN7C9jEgunuu0gws2/hfx5eVpAGlZZ3gbND\n90cEj1UkM6vGB/fPnXNPFbs9RXQJMM3MrgYGAUPM7CHn3DeL3K5OKnqRjpltBy5wzn1Q7LYUg5ld\nBTQBn3fOvV/s9hSamQ0A/gxcDrwH/AG43jn3RlEbViRm9hCwzzk3t9htKRVmdikwzzk3rdhtSVVx\nNe8UjhL9SVQgPwVqgXXBlKifFbtBheScOw7U4WfdvAasquDgvgT4J+AyM9sQ/PdwVbHbJd2
 
r6J63\niEhUVXrPW0QkkhTeIiIRpPAWEYkghbeISAQpvEVEIkjhLSISQQpvEZEIUniLiETQ/wdIGJjNwpj9\nMQAAAABJRU5ErkJggg==\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x109871950>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# Plot the decision grid\n",
+    "%sql drop table if exists Z_D;\n",
+    "%sql SELECT madlib.svm_predict('svm_out1', 'grid_points', 'index', 
'Z_D');\n",
+    "Z_D = %sql SELECT decision_function from Z_D order by index\n",
+    "Z = np.array(Z_D)\n",
+    "Z = Z.reshape(xx.shape)\n",
+    "\n",
+    "# Orange is not novel, green is novel\n",
+    "plt.title(\"Novelty Detection\")\n",
+    "plt.contourf(xx, yy, Z, levels=[0, Z.max()], colors='orange')\n",
+    "plt.contourf(xx, yy, Z, levels=[Z.min(), 0], colors='green')\n",
+    "#plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), Z.max(), 7), 
cmap=plt.cm.Blues_r)\n",
+    "b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='blue')\n",
+    "c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')\n",
+    "plt.axis('tight')\n",
+    "plt.xlim((-5, 5))\n",
+    "plt.ylim((-5, 5))\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "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.12"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}

Reply via email to