Skip to content

Instantly share code, notes, and snippets.

@altescy
Created November 30, 2018 14:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save altescy/5731095e8b26507937d27fbf65ba0254 to your computer and use it in GitHub Desktop.
Save altescy/5731095e8b26507937d27fbf65ba0254 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SQLで機械学習する\n",
"===\n",
"\n",
"\n",
"### 準備\n",
"\n",
"```\n",
"$ docker run --rm -d -p3306:3306 \\\n",
" -e MYSQL_RANDOM_ROOT_PASSWORD='yes' \\\n",
" -e MYSQL_DATABASE='mysql' \\\n",
" -e MYSQL_USER='user' \\\n",
" -e MYSQL_PASSWORD='password' \\\n",
" mysql:8.0\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<sqlalchemy.engine.result.ResultProxy at 0x7fe800801240>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import pymysql\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"from sqlalchemy import create_engine\n",
"import warnings\n",
"%matplotlib inline\n",
"\n",
"warnings.filterwarnings('ignore')\n",
"pymysql.install_as_MySQLdb()\n",
"\n",
"np.random.seed(128)\n",
"\n",
"db_settings = {\n",
" \"host\": 'localhost',\n",
" \"database\": 'mysql',\n",
" \"user\": 'user',\n",
" \"password\": 'password',\n",
" \"port\":3306\n",
"}\n",
"\n",
"conn = create_engine('mysql://{user}:{password}@{host}:{port}/{database}'.format(**db_settings))\n",
"conn.execute('set @@cte_max_recursion_depth = 10000')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 最急降下法\n",
"\n",
"$$\n",
"\\mathrm{argmin}_{x} \\,\\, \\mathcal{f}(x), \\,\\,\\,\\,\\, \\mathrm{where} \\,\\,\\, \\mathcal{f}(x) = x^2 - 6x + 9\n",
"$$\n",
"\n",
"$$\n",
"\\frac{\\partial\\mathcal{f}}{\\partial x} = 2x - 6\\\\\n",
"w \\leftarrow w - \\eta \\frac{\\partial\\mathcal{f}}{\\partial x}\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>iter</th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>197</td>\n",
" <td>2.941</td>\n",
" <td>0.003</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" iter x y\n",
"0 197 2.941 0.003"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"query = '''\n",
"with\n",
" recursive gd(iter, x, y) as (\n",
" select\n",
" 0, cast(0.0 as decimal(6,3)), cast(9 as decimal(6,3))\n",
" union all\n",
" select\n",
" iter+1, x-0.01*(2.0*x-6.0), pow(x-0.01*(2.0*x-6.0),2)-6*(x-0.01*(2.0*x-6.0)) + 9 \n",
" from\n",
" gd\n",
" where\n",
" iter < 1000\n",
" and y - (pow(x-0.1*(2.0*x-6.0),2)-6*(x-0.1*(2.0*x-6.0)) + 9) > 0.001\n",
" )\n",
"select * from gd order by iter desc limit 1\n",
"'''\n",
"\n",
"pd.read_sql(query, conn)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 線形回帰\n",
"\n",
"$$\n",
"\\mathrm{argmin}_{a, b} \\,\\, \\mathcal{L}, \\,\\,\\,\\,\\, \\mathrm{where} \\,\\,\\, \\mathcal{L} = \\frac{1}{2N} \\sum_{i=1}^{N}(a+bx_i-y_i)^2\n",
"$$\n",
"\n",
"$$\n",
"\\frac{\\partial\\mathcal{L}}{\\partial a} = \\frac{1}{N} \\sum_{i=1}^{N}(a+bx_i-y_i)\\\\\n",
"\\frac{\\partial\\mathcal{L}}{\\partial b} = \\frac{1}{N} \\sum_{i=1}^{N}(a+bx_i-y_i)x_i\\\\\n",
"$$\n"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfcAAAF1CAYAAAD1DaP0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAGCdJREFUeJzt3X9sXed93/H3N7Sc3CBGmCV0XbGmZRQFs7XKwo3JWjvbhM4Z09UFaAVw2hXBlsBVsxaoja1craEtkG6rjBFe0mRuEaHu0gIu1iyRmHVJSi/VtOaH51QOvXLNyroNlnRXtmM3oNMiN7GgfvcHLx2SJiVSujzn3Oe8XwAB3uceXn59aftzn+d8z3kiM5EkSeV4Sd0FSJKkwTLcJUkqjOEuSVJhDHdJkgpjuEuSVBjDXZKkwhjukiQVxnCXJKkwhrskSYUx3CVJKsw1dRdwpV7zmtfkoUOH6i5DkqTKPPbYY89m5tjljhvacD906BDnzp2ruwxJkioTEV/azXEuy0uSVBjDXZKkwhjukiQVxnCXJKkwhrskSYUx3CVJKozhLklSYQx3SZIKY7hLklSYob1DXdstLHWZX1zh/GqPg6Md5mYmmZ0ar7ssSVIDGO5DaGGpy/FTy/QuXASgu9rj+KllAANekuSy/DCaX1x5IdjX9S5cZH5xpaaKJElN0phwj4g7I+JzEfFYRNxfdz1Ndn61t6dxSVK7NCLcI+Im4F8Dbwamge+IiLfWW1VzHRzt7GlcktQujQh34C3ARzLzucxM4APAbM01NdbczCSdAyObxjoHRpibmaypIklSkzSloe7VwFMbHj8JXF9TLY233jRnt7wkaTtNCfengZs3PL6hP7ZJRBwDjgFMTExUU1lDzU6NG+aSpG01ZVn+48AdEXFd//E7gY9uPSgzT2bmdGZOj42NVVqgJEnDohEz98x8MiJ+Efi9iHge+FRmfqTuuiRJGkaNCHeAzHwIeKjuOiRJGnZNWZaXJEkDYrhLklQYw12SpMIY7pIkFcZwlySpMIa7JEmFMdwlSSqM4S5JUmEMd0mSCmO4S5JUGMNdkqTCGO6SJBXGcJckqTCN2RVOl7aw1GV+cYXzqz0OjnaYm5lkdmq87rIkSQ3kzH0ILCx1OX5qme5qjwS6qz3u+a3Hef27H2ZhqVt3eZKkhjHch8D84gq9CxdfNL7au8DxU8sGvCRpE8N9CJxf7e34XO/CReYXVyqsRpLUdK0/5z4M57IPjnboXiLgLxX+kqT2afXMfbtz2U1c5p6bmaRzYGTH5w+OdiqsRpLUdK0O9+3OZTdxmXt2apwTRw/zqpcfeNFznQMjzM1M1lCVJKmpWh3uOy1nN3GZe3ZqnKWf/4e8922vZ3y0QwDjox1OHD3cuNMIkqR6tfqc+07nspu8zD07NW6YS5IuqdUz9+3OZbvMLUkadq2eua/PgJveLS9J0l60OtzBZW5JUnlavSwvSVKJDHdJkgpjuEuSVBjDXZKkwhjukiQVxnCXJKkwhrskSYUx3CVJKozhLklSYQx3SZIKY7hLklQYw12SpMI0YuOYiHgH8DPAU/2hM5n5CzWWpB0sLHXdRU+SGq4R4Q4cAn4qMx+uuxDtbGGpy/FTy/QuXASgu9rj+KllAANekhqkKcvyh4AfjoizEXE6Im6uuyBYC7Nb7zvDzfd+jFvvO8PCUrfukmo1v7jyQrCv6124yPziSk0VSZK2U+nMPSLuAO7eMvw48AXg0cw8GxFHgIeAW6qsbStnqS92frW3p3FJUj0qDffMPA2cvswxZyPiUEREZubG5yLiGHAMYGJiYv8K5dKz1LaG+8HRDt1tgvzgaKeGaiRJO2nEsnxE/ExE3Nj/fhr4s63BDpCZJzNzOjOnx8bG9rUmZ6kvNjczSefAyKaxzoER5mYma6pIkrSdpjTU/T7wkYj4JvA88Paa63GWuo31FQu75SWp2RoR7pl5Bnhj3XVsNDczuemcOzhLhbWAN8wlqdkaEe5N5CxVkjSsDPdLcJYqSRpGjWiokyRJg2O4S5JUGMNdkqTCGO6SJBXGcJckqTCGuyRJhTHcJUkqjOEuSVJhDHdJkgpjuEuSVBjDXZKkwnhveTXSwlLXTXsk6QoZ7mqchaXupu12u6s9jp9aBjDgJWkXXJZX48wvrrwQ7Ot6Fy4yv7hSU0WSNFwMdzXO+dXensYlSZsZ7mqcg6OdPY1LkjYz3NU4czOTdA6MbBrrHBhhbmaypookabjYUKfGWW+as1tekq6M4a5Gmp0aN8wl6Qq5LC9JUmEMd0mSCmO4S5JUGMNdkqTCGO6SJBXGcJckqTCGuyRJhTHcJUkqjOEuSVJhDHdJkgpjuEuSVBjDXZKkwhjukiQVxnCXJKkwhrskSYUx3CVJKkyl4R4Rb4iIByLi2Yh47YbxayPiwYj4bER8PiJuq7IuSZJKck3Fv+8bwP3Ad28ZnwNWM/OWiBgHzkbE92TmNyuuT5KkoVdpuGfmMkBEbH3qduCf9I/pRsQjwJuA362yPmnYLCx1mV9c4fxqj4OjHeZmJpmdGq+7LEk125dwj4g7gLu3DD+emffs8COvBp7a8PhJ4Pr9qE37z8CpxsJSl+OnlulduAhAd7XH8VPLAL7fUsvtS7hn5mng9B5+5GnWwvxr/cc39Mc2iYhjwDGAiYmJq6xS+8HAqc784soL7/O63oWLzC+u+F5LLdeUbvmPAncBRMS3Ad8LfGbrQZl5MjOnM3N6bGys4hK1G5cKHA3W+dXensYltUdTwv19wHhEPAr8NvCTNtMNJwOnOgdHO3sal9QetYR7Zh7JzD/a8Pj5zHx7Zv6dzHxjZn6yjrp09Qyc6szNTNI5MLJprHNghLmZyZoqktQUTZm5qxAGTnVmp8Y5cfQw46MdAhgf7XDi6GHPt0uq/Dp3FW49WIapW36Yu/tnp8aHplZJ1THcNXDDFDh290sqkcvyajW7+yWVyHBXq9ndL6lELsur1Q6OduhuE+TD2N0/zL0DkgbLmbtarZTu/vXege5qj+RbvQMLS926S5NUA8NdrVbK5WT2DkjayGV5td4wdffvxN4BSRs5c5cK4J0BJW1kuEsFKKV3QNJguCwvFWAY7wwoaf8Y7lIhSugdkDQYLstLklQYw12SpMIY7pIkFcZwlySpMIa7JEmFMdwlSSqMl8KptdxFTVKpDHe10vouauubrazvogYY8JKGnsvyaiV3UZNUMsNdreQuapJKZrirldxFTVLJDHe1kruoSSqZDXVqJXdRk1Qyw12t5S5qkkrlsrwkSYUx3CVJKozhLklSYQx3SZIKY7hLklQYw12SpMIY7pIkFcbr3CUNlFvpSvUz3CUNjFvpSs1guEtDpOmz4kttpdukOqXSGe7SkBiGWbFb6UrNUGlDXUS8ISIeiIhnI+K1G8av6Y+d3fB1bZW1SU13qVlxU7iVrtQMVXfLfwO4H/jfW8ZvBB7OzCMbvp6vuDap0YZhVuxWulIzVBrumbmcmV/c5qlDwPUR8YmI+FRE/HCVdUnDYBhmxbNT45w4epjx0Q4BjI92OHH0cGNOG0htsS/n3CPiDuDuLcOPZ+Y9O/zI14GzwAngFcCZiPiDzPzCltc9BhwDmJiYGGjNUtPNzUxuOucOzZwV79dWuk1vJpSaZF/CPTNPA6f3cPyjwKP9h89FxO8Cfxv4wpbjTgInAaanp3Mw1UrDYT3I2hhww9BMKDVJI7rlI+JW4MbM/E8R8VLgCPAb9VYlNc9+zYqbzkvspL1pyu1n/w9wNCJ+n7Xl+ZOZubXpTlJLDUMzodQktczcM/PIlsdfBe6soxZJzXdwtEN3myBvUjOh1CRNmblL0o68xE7am0acc5ekS2lzM6F0JQx3SUOhrc2E0pW47LJ8RPxWRBypoBZJkjQAuznn/j7gRyLisxHxUxHxyv0uSpIkXbnLhntmfiYzfxy4nbXrz/8kIn41IrxFnCRJDbSbZfk3RsRJ4GPAJ1jb5OWDwIf3tzRJknQldtNQ927gPZl5bMPYpyPiZ/epJkmSdBUuG+6Z+QM7jD88+HIkSdLV8iY2kiQVxuvcJWmP3H5WTWe4S9IeuP2shoHL8pK0B5faflZqCsNdkvbA7Wc1DAx3SdqDnbaZdftZNYnhLkl74PazGgY21EnSHrj97NXxSoNqGO6StEduP3tlvNKgOi7LS5Iq4ZUG1THcJUmV8EqD6hjukqRKeKVBdQx3SVIlvNKgOjbUSZIq4ZUG1THcJUmV8UqDargsL0lSYQx3SZIKY7hLklQYw12SpMIY7pIkFcZwlySpMIa7JEmFMdwlSSqM4S5JUmEMd0mSCmO4S5JUGMNdkqTCuHGMpH2zsNR1BzCpBpWGe0QcBt4PBJDAscz844gYBR4Evh0YAX48Mx+vsjZJg7Ww1OX4qWV6Fy4C0F3tcfzUMkDjAt4PISpN1cvyvwz8WGb+fWAeuK8/Pg+czcxbgB8DPlhxXZIGbH5x5YVgX9e7cJH5xZWaKtre+oeQ7mqP5FsfQhaWunWXJl2xqsP9zZn5RP/7a4Be//t/BPwqQGb+AfC1iPjOimuTNEDnV3t7Gq/LsHwIkfZiX5blI+IO4O4tw49n5j395+8C3gb86Hodmbnxv/gngeuBP93yuseAYwATExP7ULmkQTk42qG7TZAfHO3UUM3OhuVDiLQX+zJzz8zTmXlky9c9EXFtRHwQeCUwk5lf6f9ILyJeuuElbgCe3uZ1T2bmdGZOj42N7UfpkgZkbmaSzoGRTWOdAyPMzUzWVNH2dvqw0bQPIdJeVL0s/wDwm5l5f2b+1Ybx/wq8AyAi/jpwXWZ+seLaJA3Q7NQ4J44eZny0QwDjox1OHD3cuEa1YfkQIu1FZGY1vyjiOtaW289tGP5qZh6NiFcBvw6MsdZF/xOX65afnp7Oc+fOXeoQSdoVu+U1LCLiscycvuxxVYX7oBnukqS22W24e4c6SZIKY7hLklQYw12SpMIY7pIkFcZwlySpMIa7JEmFMdwlSSqM+7lLUiG8GY/WGe6SVID1rWvXd7hb37oWMOBbyGV5SSqAW9dqI8Ndkgrg1rXayHCXpAK4da02MtwlqQBt27p2YanLrfed4eZ7P8at951hYalbd0mNYkOdJBVgvWmuDd3yNg9enuEuSUNgN5e5zU6NtyLcLtU82IZ//t0w3CWp4Zypbmbz4OV5zl2SGs7L3DazefDyDHdJajhnqpu1rXnwShjuktRwzlQ3m50a58TRw4yPdghgfLTDiaOHW3mKYieec5ekhpubmdx0zh2cqbalefBKGe6S1HBtusxNg2G4S9IQcKaqvfCcuyRJhTHcJUkqjMvykjQEdnOHOtWjiX8bw12SGs471DVXU/82LstLUsN5h7rmaurfxnCXpIbzDnXN1dS/jeEuSQ3nHeqaq6l/G8NdkhrOe6k3V1P/NjbUSVLDeYe65mrq3yYys9YCrtT09HSeO3eu7jIkSapMRDyWmdOXO85leUmSCmO4S5JUGM+5S5JaqYl3lhsUw12S1DpNvbPcoLgsL0lqnabeWW5QKp25R8Rh4P1AAAkcy8w/joibgUeAP+of+tXMPFplbZKk9mjqneUGpepl+V8G3pmZT0TEDwL3AUeBQ8CvZea/qrgeSVILHRzt0N0myOu+s9ygVL0s/+bMfKL//TXA+jt7CPgbEfHJiPjvEfEPKq5LktQiTb2z3KDsy8w9Iu4A7t4y/Hhm3tN//i7gbcCP9p97BngY+BXgBuBsRNySmX++5XWPAccAJiYm9qN0SdIllNJh3tQ7yw1KpXeoi4hrgZPAMvCezPyrHY77EPD+zPzUTq/lHeokqVpbO8xhbbZ74ujhYkKx6Zp6h7oHgN/MzPs3BntEzEbEbf3vR4HX8a3mOklSA5TeYV6SyhrqIuI64EeA74qI9ca59a74JeADEfFvWOui/+nMfKaq2iRJl1d6h3lJKgv3zPwL4BU7PPcl4C1V1SJJ2rvSO8xL4k1sJEm7UnqHeUm8/awkaVdK7zAvieEuSdq12alxw3wIuCwvSVJhDHdJkgpjuEuSVBjDXZKkwhjukiQVxnCXJKkwXgonSSpOKbvXXSnDXZJUlK2713VXexw/tQzQmoB3WV6SVBR3rzPcJUmFcfc6w12SVJiddqlr0+51hrskqSjuXmdDnSSpMFeye11p3fWGuySpOHvZva7E7nqX5SVJrVZid73hLklqtRK76w13SVKrldhdb7hLklqtxO56G+okSa12Jd31TWe4S5Jaby/d9cPAZXlJkgpjuEuSVBjDXZKkwhjukiQVxnCXJKkwhrskSYUx3CVJKozhLklSYQx3SZIKY7hLklQYw12SpMIY7pIkFcZwlySpMIa7JEmFqTTcI+ItEfGZiHgkIh6OiBv749dGxIMR8dmI+HxE3FZlXZIklaTqmfttwA9k5vcBp4F7++NzwGpm3gL8EPArEfHSimuTJKkIlYZ7Zv50Zn4tIl4C3Ax8rv/U7cAH+sd0gUeAN1VZmyRJpdiXcI+IOyLi7Jav9/af++fAnwHfDpzq/8irgac2vMSTwPXbvO6xiDgXEeeeeeaZ/ShdkqShty/hnpmnM/PIlq97+s/9e2AC+EPg/f0feZrNYX5Df2zr657MzOnMnB4bG9uP0iVJGnqVLctHxCsj4uciYiQzLwKfB0b7T38UuKt/3LcB3wt8pqraJEkqyTVV/aLMfC4i/hL4XET8BXAR+In+0+8DHoyIR4EAfjIzv1lVbZIklaSycAfIzPcA79lm/Hng7VXWIklSqbyJjSRJhTHcJUkqjOEuSVJhDHdJkgpjuEuSVBjDXZKkwhjukiQVxnCXJKkwhrskSYUx3CVJKozhLklSYQx3SZIKY7hLklSYSneFkySpdAtLXeYXVzi/2uPgaIe5mUlmp8YrrcFwlyRpQBaWuhw/tUzvwkUAuqs9jp9aBqg04F2WlyRpABaWuvyLD/2vF4J9Xe/CReYXVyqtxXCXJOkqrc/YL2Zu+/z51V6l9RjukiRdpfnFlRfN2Dc6ONqpsBrDXZKkq3apmXnnwAhzM5MVVmO4S5J01XaamY9EcOLo4cq75Q13SZKu0tzMJJ0DI5vGOgdGuP/Ov1l5sIOXwkmSdNXWA7zu69vXGe6SJA3A7NR4bWG+lcvykiQVxnCXJKkwhrskSYUx3CVJKozhLklSYQx3SZIKY7hLklQYw12SpMIY7pIkFcZwlySpMJE7bCzfdBHxDPCluuuo0WuAZ+suomV8z6vne1493/Nq7fX9vikzxy530NCGe9tFxLnMnK67jjbxPa+e73n1fM+rtV/vt8vykiQVxnCXJKkwhvvwOll3AS3ke1493/Pq+Z5Xa1/eb8+5S5JUGGfukiQVxnAfQhFxZ0Q8EhGfiogPRcTL666pDSLi5yLibN11tEFE3BgR/yUizkTEf4uIv1V3TaWLiHsj4n9GxKcj4j9HxHV111SaiHhr///ZX94wNhERvxMRn42IsxFx0yB+l+E+ZCLirwH/Evj+zPy7rF3rf1e9VZUvIqaBm+uuo0VOAj+bmd8P3Al8+TLH6ypExHcDPwR8X2a+Cfgi8K56qyrS08A/A67dMPYg8EBm3gL8O+A/DOIXGe5DJjO/CrwpM3v9oWuA3iV+RFcpIjrAe4F7666lDSLiBuBlwDsj4veAXwS+Xm9VxXsOeCVwY//f95uAx+stqTyZ+enM/PP1x/1V19dm5m/3n/848D0Rce1Or7FbhvsQysxvRMTLIuKXgA7wa3XXVLh54L2Z+ZW6C2mJCWAK+PXM/HvAeeDn6y2pbJn5/4B3A8usrQb+KfDJWotqh1HgmS1jXwFefbUvbLgPoYj4DuA08DuZ+a7MvFh3TaWKiBngVZn54bpraZFV4AuZudR//GHgDTXWU7yIuAX4p8B3AoeAl7MW9tpfz/LiIB9jALf/NdyHTES8DPggcCwzP1FzOW1wOzAWEQsRscDaktlDdRdVuD8BXhYRr+0/vg1YusTxunqvB57IzGcz8+vA/wC+q+aaipeZzwPLEfEWgIi4DfjDzLxwta/tde5DJiJuBz4APLFh+Exm/kJNJbVKRJzNzCN111G6iHgd8Eus9ZR8BXhnZj5Xb1XliohXAA8ArwP+krU+nmOZ+X/rrKtUEfFUZt7Q//4m1iZs1wLfBN6RmVe9KZrhLklSYVyWlySpMIa7JEmFMdwlSSqM4S5JUmEMd0mSCmO4S5JUGMNdkqTCGO6SdqW/Jei7+9+/LyL+cd01SdqeN7GRtCsR8RLg48AngNdn5jtqLknSDgx3SbvW32Dk08DNg7hFpqT9YbhL2pWIOMDarP0h4PbMfGvNJUnagefcJe3WvwU+kpn/EfhyRLyr7oIkbc+ZuyRJhXHmLklSYQx3SZIKY7hLklQYw12SpMIY7pIkFcZwlySpMIa7JEmFMdwlSSrM/wegoRqs5RQlYQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"N = 30\n",
"\n",
"df = pd.DataFrame()\n",
"df['x'] = np.random.uniform(10, size=N)\n",
"df['y'] = -3 * df['x'] + 1 + np.random.normal(scale=3.0, size=df['x'].shape)\n",
"\n",
"\n",
"df.to_sql(con=conn, name='lr', index=False, if_exists='replace')\n",
"plt.figure(figsize=(8, 6))\n",
"plt.plot(df['x'], df['y'], 'o')\n",
"plt.title(\"\")\n",
"plt.xlabel('x')\n",
"plt.ylabel('y')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>iter</th>\n",
" <th>a</th>\n",
" <th>b</th>\n",
" <th>loss</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>18</td>\n",
" <td>0.34115</td>\n",
" <td>-2.84881</td>\n",
" <td>3.31067</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" iter a b loss\n",
"0 18 0.34115 -2.84881 3.31067"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"query = '''\n",
"\n",
"with\n",
" recursive agg as (\n",
" select\n",
" sum(x) s_x,\n",
" sum(y) s_y,\n",
" sum(x*x) s_x2,\n",
" sum(y*y) s_y2,\n",
" sum(x*y) s_xy,\n",
" count(*) n\n",
" from lr\n",
" ),\n",
" gd(iter, a, b, loss) as (\n",
" select\n",
" 0, cast(1.0 as decimal(10, 5)), cast(1.0 as decimal(10, 5)), cast(100.0 as decimal(10, 5))\n",
" from lr\n",
" union all\n",
" select\n",
" iter+1,\n",
" a-0.01*(n*a+b*s_x-s_y)/n,\n",
" b-0.01*(a*s_x+b*s_x2-s_xy)/n,\n",
" (n*pow(a-0.01*(n*a+b*s_x-s_y)/n,2)\n",
" +pow(b-0.01*(a*s_x+b*s_x2-s_xy),2)*s_x2\n",
" +s_y2\n",
" +2*(a-0.01*(n*a+b*s_x-s_y)/n)*(b-0.01*(a*s_x+b*s_x2-s_xy))*s_x\n",
" -2*(a-0.01*(n*a+b*s_x-s_y)/n)*s_y\n",
" -2*(b-0.01*(a*s_x+b*s_x2-s_xy))*s_xy)/(2*n)\n",
" from\n",
" gd, agg\n",
" where\n",
" iter < 5000\n",
" and loss > 0.1\n",
" and abs(\n",
" loss-(n*pow(a-0.01*(n*a+b*s_x-s_y)/n,2)\n",
" +pow(b-0.01*(a*s_x+b*s_x2-s_xy),2)*s_x2\n",
" +s_y2\n",
" +2*(a-0.01*(n*a+b*s_x-s_y)/n)*(b-0.01*(a*s_x+b*s_x2-s_xy))*s_x\n",
" -2*(a-0.01*(n*a+b*s_x-s_y)/n)*s_y\n",
" -2*(b-0.01*(a*s_x+b*s_x2-s_xy))*s_xy)/(2*n)) > 0.01\n",
" )\n",
"select * from gd order by iter desc limit 1\n",
"'''\n",
"\n",
"result = pd.read_sql(query, conn)\n",
"result"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"a = result['a'].values[-1]\n",
"b = result['b'].values[-1]\n",
"x_line = np.linspace(0, 10, 100)\n",
"y_line = a + b * x_line\n",
"\n",
"plt.figure(figsize=(8, 6))\n",
"plt.plot(df['x'], df['y'], 'o')\n",
"plt.plot(x_line, y_line, label='predict')\n",
"plt.xlabel('x')\n",
"plt.ylabel('y')\n",
"plt.show()"
]
}
],
"metadata": {
"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.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment