Skip to content

Instantly share code, notes, and snippets.

@Ogaday
Created September 4, 2025 16:27
Show Gist options
  • Save Ogaday/5ec1145fe80aebcf1c938d19f4381e82 to your computer and use it in GitHub Desktop.
Save Ogaday/5ec1145fe80aebcf1c938d19f4381e82 to your computer and use it in GitHub Desktop.
Example models
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "b53e9afe",
"metadata": {},
"outputs": [],
"source": [
"from typing import Optional\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"from model import make_train_test_data, LinearModel, NeighboursModel, train_model"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "8199fb44",
"metadata": {},
"outputs": [],
"source": [
"SEED = 0\n",
"BIAS = 1.0\n",
"NOISE = 10.0\n",
"K_NEIGHBOURS = 5"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "532e8c7e",
"metadata": {},
"outputs": [],
"source": [
"def fit_lm(X: np.ndarray, y: np.ndarray) -> LinearModel:\n",
" intercept = y.mean()\n",
" gradient = (y.max() - y.min()) / (X.max() - X.min())\n",
" model = LinearModel(intercept=intercept, gradient=gradient).fit(X, y)\n",
" return model\n",
"\n",
"\n",
"def fit_knn(X: np.ndarray, y: np.ndarray, k_neighbours: int = 1) -> NeighboursModel:\n",
" model = NeighboursModel(k_neighbours=k_neighbours).fit(X, y)\n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "1cb96f69",
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = make_train_test_data(seed=SEED, bias=BIAS, noise=NOISE)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "edb6bf95",
"metadata": {},
"outputs": [],
"source": [
"\n",
"def plot_model(\n",
" model,\n",
" X: np.ndarray,\n",
" y: np.ndarray,\n",
" *,\n",
" name: Optional[str] = None,\n",
" x_test: Optional[np.ndarray] = None,\n",
" y_test: Optional[np.ndarray] = None,\n",
" ax=None\n",
"):\n",
" if ax is None:\n",
" fig, ax = plt.subplots()\n",
" train_plot = ax.scatter(X, y)\n",
" xx = np.linspace(X.min(), X.max()).reshape(-1, 1)\n",
" model_line, *_ = ax.plot(xx, model.predict(xx))\n",
" if name:\n",
" ax.set_title(name)\n",
" if x_test is not None and y_test is not None:\n",
" test_plot = ax.scatter(x_test, y_test)\n",
" score = model.score(x_test, y_test)\n",
" ax.legend([train_plot, test_plot, model_line], [\"Train set\", \"Test set\", f\"Predictions (score: {score:.3f})\"])\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "aca8ced3",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABbYAAAIQCAYAAABdfTicAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAA2nNJREFUeJzs3Xlc1NX+x/HXDLssg6gImiHuIu5laaZWmqS5taiVqd3Sst3qlvarjDazVeuWduterWxRS80ladG8ZVqk5oqaGi4ZiEmCqGwz398fE5Mj2wADw/J+Ph48dL5zvud7vtDynsP5fo7JMAwDEREREREREREREZEawuzpAYiIiIiIiIiIiIiIlIUmtkVERERERERERESkRtHEtoiIiIiIiIiIiIjUKJrYFhEREREREREREZEaRRPbIiIiIiIiIiIiIlKjaGJbRERERERERERERGoUTWyLiIiIiIiIiIiISI2iiW0RERERERERERERqVE0sS0iIiIiIiIiIiIiNYomtkVEXHDgwAFMJhPz5s3z9FBqlIp839auXYvJZGLt2rVuH5eIiIiIeM748eNp3rx5uc8NCgoqtV1BDn3ppZfKdR35W0V+Xv369aNfv34utc3KyiI8PJwPPvjA6dqu/Lwr25w5czj//PPJycnx9FBE5Cya2BaROm/evHmYTCY2btzo6aFUmieffBKTyYTZbObw4cOF3s/MzCQgIACTycTdd9/tgRGKiIiISHVSkJH9/f05cuRIoff79etHbGysB0ZWd5lMJkwmE7fddluR7//f//2fo80ff/xRxaOruFmzZhEcHMzo0aOr7Jr9+vVzfM/O/oqLi3NqN378eHJzc3nrrbeqbGwiUjpvTw9ARKQmiIqK4syZM/j4+Hh6KBXi5+fHRx99xMMPP+x0fPHixR4akYiIiIhUZzk5OTz//PO8/vrrbuvz7bffxmazua2/usTf359PP/2UN998E19fX6f3PvroI/z9/cnOzvbQ6MovLy+PWbNmMXnyZLy8vKr02ueddx7Tp093OtakSROn1/7+/owbN45XXnmFe+65B5PJVJVDFJFiaMW2iIgLClarVHXIKovTp0+X2mbQoEF89NFHhY5/+OGHDB48uDKGJSIiIiI1WJcuXXj77bf5/fff3danj48Pfn5+buuvJrDZbG6ZcI6LiyMzM5NVq1Y5HV+/fj3Jyck1NtOvWLGCY8eOMXLkyCq/tsViYcyYMU5fl19+eaF2I0eO5ODBg3zzzTdVPkYRKZomtkVEXFBUreiCem9Hjhxh+PDhBAUF0ahRIx566CGsVqvT+TabjZkzZ9KhQwf8/f1p3Lgxt99+O3/++adTu88++4zBgwfTpEkT/Pz8aNmyJU8//XSh/goe/dy0aRN9+vShXr16PProo6Xex4033siWLVvYvXu341hqaipr1qzhxhtvLPKctLQ0br31Vho3boy/vz+dO3fm3XffLdTuxIkTjB8/HovFQmhoKOPGjePEiRNF9rl7926uu+46wsLC8Pf354ILLmDZsmWljl9EREREqtajjz6K1Wrl+eefd6n9/Pnz6d69OwEBAYSFhTF69OhCpfCKqtl8/Phxbr75ZkJCQhxZcuvWrcXu1+JKBi/w6quvEhUVRUBAAH379mXHjh2F2qxZs4ZLL72UwMBAQkNDGTZsGLt27Sp13PB32b+zFZT4++CDD+jQoQN+fn4kJCQA8PHHH9O9e3eCg4MJCQmhY8eOzJo1q8ixn6tp06b06dOHDz/80On4Bx98QMeOHYstD7No0SLHz6Vhw4aMGTOmyBIzS5cuJTY2Fn9/f2JjY1myZEmR/bn6+cZVS5cupXnz5rRs2bLUtlu2bKFRo0b069ePrKyscl3vXPn5+aX21b17d8LCwvjss8/cck0RqThNbIuIVIDVamXgwIE0aNCAl156ib59+/Lyyy/z73//26nd7bffzj//+U8uueQSZs2axS233MIHH3zAwIEDycvLc7SbN28eQUFBPPDAA8yaNYvu3bvzxBNPMGXKlELXPn78OFdddRVdunRh5syZXHbZZaWOt0+fPpx33nlOQXjBggUEBQUVubrjzJkz9OvXj/fff5+bbrqJF198EYvFwvjx453Ct2EYDBs2jPfff58xY8bwzDPP8NtvvzFu3LhCfe7cuZOLL76YXbt2MWXKFF5++WUCAwMZPnx4scFZRERERDwjOjqasWPHurRq+9lnn2Xs2LG0bt2aV155hfvvv5/Vq1fTp0+fYhc8gH2SdMiQIXz00UeMGzeOZ599lpSUlCKzJLiewQHee+89XnvtNe666y6mTp3Kjh07uPzyyzl69Kijzddff83AgQNJS0vjySef5IEHHmD9+vVccsklHDhwwKXvU1HWrFnD5MmTGTVqFLNmzaJ58+Z89dVX3HDDDdSvX58ZM2bw/PPP069fP77//nuX+73xxhtZvny5YyI2Pz+fRYsWFbtQZd68eYwcORIvLy+mT5/OhAkTWLx4Mb1793b6uXz55Zdce+21mEwmpk+fzvDhw7nllluK3IvI1c83rlq/fj3dunUrtd1PP/3E5ZdfTteuXVm1apVjY8msrCz++OOPUr8yMjIK9fnLL78QGBhIcHAwERERPP7448XeQ7du3cr0sxKRSmaIiNRxc+fONQDjp59+KrZNcnKyARhz5851HBs3bpwBGE899ZRT265duxrdu3d3vP7uu+8MwPjggw+c2iUkJBQ6fvr06ULXvv3224169eoZ2dnZjmN9+/Y1AGPOnDku3eO0adMMwDh27Jjx0EMPGa1atXK8d+GFFxq33HKLYRiGARh33XWX472ZM2cagDF//nzHsdzcXKNnz55GUFCQkZmZaRiGYSxdutQAjBdeeMHRLj8/37j00ksLfd+uuOIKo2PHjk73Y7PZjF69ehmtW7d2HPvmm28MwPjmm29cukcRERERcZ+zM/L+/fsNb29v495773W837dvX6NDhw6O1wcOHDC8vLyMZ5991qmf7du3G97e3k7Hx40bZ0RFRTlef/rppwZgzJw503HMarUal19+ebkzeEF+DwgIMH777TfH8R9//NEAjMmTJzuOdenSxQgPDzeOHz/uOLZ161bDbDYbY8eOLXbcBQqy9tkAw2w2Gzt37nQ6ft999xkhISFGfn5+oX5KU5DV09PTDV9fX+P99983DMMwVq5caZhMJuPAgQNOud8w7Nk9PDzciI2NNc6cOePoa8WKFQZgPPHEE07fh8jISOPEiROOY19++aUBON13WT7f9O3b1+jbt2+J95WXl2eYTCbjwQcfLPTeuHHjjMDAQMMwDGPdunVGSEiIMXjwYKfPEgXtgFK/zh3LP/7xD+PJJ580Pv30U+O9994zhg4dagDGyJEjixzrxIkTjYCAgBLvR0SqjlZsi4hU0B133OH0+tJLL+XXX391vF60aBEWi4UBAwY4rRbo3r07QUFBTjXaAgICHH8/efIkf/zxB5deeimnT592Kh8C9o0gb7nlljKP98Ybb2Tfvn389NNPjj+LW93x+eefExERwQ033OA45uPjw7333ktWVhb/+9//HO28vb2ZNGmSo52Xlxf33HOPU3/p6emsWbOGkSNHOu7vjz/+4Pjx4wwcOJC9e/cW+UikiIiIiHhOixYtuPnmm/n3v/9NSkpKkW0WL16MzWZj5MiRTpk3IiKC1q1bl1iXOCEhAR8fHyZMmOA4Zjabueuuu4o9p7QMXmD48OE0bdrU8bpHjx5cdNFFfP755wCkpKSwZcsWxo8fT1hYmKNdp06dGDBggKNdefTt25eYmBinY6GhoZw6dYqvvvqq3P3Wr1+fuLg4x945H374Ib169SIqKqpQ240bN5KWlsadd96Jv7+/4/jgwYNp164dK1euBP7+PowbNw6LxeJoN2DAgEL3UJbPN65IT0/HMAzq169fbJtvvvmGgQMHcsUVV7B48eJCNdoffvhhvvrqq1K/Xn75Zafz/vOf/zBt2jSuueYabr75Zj777DMmTJjAwoUL+eGHHwqNo379+pw5c8al/Y1EpPJ5e3oAIiI1mb+/P40aNXI6Vr9+fafacnv37iUjI4Pw8PAi+0hLS3P8fefOnTz22GOsWbOGzMxMp3bnPjbXtGnTQjuhu6Jr1660a9eODz/8kNDQUCIiIorcHAXg4MGDtG7dGrPZ+feg7du3d7xf8GdkZKTjUcACbdu2dXq9b98+DMPg8ccf5/HHHy/ymmlpaU4fPkRERETE8x577DHef/99nn/++SLrQe/duxfDMGjdunWR5/v4+BTbd0GWrFevntPxVq1aFdnelQxeoKjxtGnThoULFzquDYVzK9gz7xdffMGpU6cIDAwsdvzFiY6OLnTszjvvZOHChVx11VU0bdqUK6+8kpEjRxIXF1emvm+88UZuvvlmDh06xNKlS3nhhReKbFfS/bVr145169Y5tSvq+9W2bVs2b97seF2WzzdlYRhGkcezs7MZPHgw3bt3Z+HChXh7F57KiomJKTQBX14PPvggb7/9Nl9//TUXX3xxkWM8t6a6iHiGJrZFRCrAy8ur1DY2m43w8HA++OCDIt8vCOUnTpygb9++hISE8NRTT9GyZUv8/f3ZvHkzjzzyCDabzem8s1d3l9WNN97I7NmzCQ4OZtSoUYUmritLwT089NBDDBw4sMg2xX2AERERERHPadGiBWPGjOHf//53kfu/2Gw2TCYTq1atKjIjn7sAoiJcyeCVobjJzOI2rSwqr4eHh7Nlyxa++OILVq1axapVq5g7dy5jx44tcoP24gwdOhQ/Pz/GjRtHTk4OI0eOdPncinL1842rwsLCMJlMxW486efnx6BBg/jss89ISEjg6quvLtQmIyODM2fOlHotX19fp5X5RWnWrBlgX0l+rj///JN69epV6LOYiLiPJrZFRCpZy5Yt+frrr7nkkktKDEBr167l+PHjLF68mD59+jiOJycnu31MN954I0888QQpKSm8//77xbaLiopi27Zt2Gw2p8nvgrIoBY87RkVFsXr1arKyspw+tOzZs8epvxYtWgD2FTv9+/d32/2IiIiISOV77LHHmD9/PjNmzCj0XsuWLTEMg+joaNq0aVOmfqOiovjmm284ffq006rtffv2VXjMe/fuLXTsl19+oXnz5o5rQ+HcCvbM27BhQ8dq7fr16xe5CWbBamdX+fr6MmTIEIYMGYLNZuPOO+/krbfe4vHHH3d5kUdAQADDhw9n/vz5XHXVVTRs2LDIdmff37lPae7Zs8cpz0PR369zvzeufr5xlbe3Ny1btiz2c4/JZOKDDz5g2LBhXH/99axatYp+/fo5tbnvvvtc+sVA3759Wbt2bYltCkraFDVBn5yc7Hh6VUQ8TzW2RUQq2ciRI7FarTz99NOF3svPz3eE44KVJ2c/gpebm8ubb77p9jG1bNmSmTNnMn36dHr06FFsu0GDBpGamsqCBQucxvz6668TFBRE3759He3y8/OZPXu2o53VauX111936i88PJx+/frx1ltvFVmf8dixYxW9NRERERGpJC1btmTMmDG89dZbpKamOr13zTXX4OXlRXx8fKGSEoZhcPz48WL7HThwIHl5ebz99tuOYzabjTfeeKPCY166dKnTHi6JiYn8+OOPXHXVVQBERkbSpUsX3n33XadJ6x07dvDll18yaNAgx7GWLVuSkZHBtm3bHMdSUlJYsmSJy+M59/tgNpvp1KkTADk5OWW6t4ceeohp06YVW+IP4IILLiA8PJw5c+Y49b9q1Sp27drF4MGDAefvw9klEL/66iuSkpKc+nT1801Z9OzZk40bNxb7vq+vL4sXL+bCCy9kyJAhJCYmOr1fnhrbmZmZhb7nhmHwzDPPABT5hOnmzZvp1atXme9PRCqHVmyLiPzlv//9LwkJCYWO33fffRXqt2/fvtx+++1Mnz6dLVu2cOWVV+Lj48PevXtZtGgRs2bN4rrrrqNXr17Ur1+fcePGce+992IymXj//feLrTVXUa7c18SJE3nrrbcYP348mzZtonnz5nzyySd8//33zJw5k+DgYACGDBnCJZdcwpQpUzhw4AAxMTEsXry4UF1wgDfeeIPevXvTsWNHJkyYQIsWLTh69CgbNmzgt99+Y+vWrW6/VxERERFxj//7v//j/fffZ8+ePXTo0MFxvGXLljzzzDNMnTqVAwcOMHz4cIKDg0lOTmbJkiVMnDiRhx56qMg+hw8fTo8ePXjwwQfZt28f7dq1Y9myZY5SEBWpZ9yqVSt69+7NpEmTyMnJYebMmTRo0ICHH37Y0ebFF1/kqquuomfPntx6662cOXOG119/HYvFwpNPPuloN3r0aB555BFGjBjBvffey+nTp5k9ezZt2rRxqkFdkttuu4309HQuv/xyzjvvPA4ePMjrr79Oly5dyrwSuHPnznTu3LnENj4+PsyYMYNbbrmFvn37csMNN3D06FFmzZpF8+bNmTx5sqPt9OnTGTx4ML179+Yf//gH6enpvP7663To0IGsrCxHO1c/35TFsGHDeP/99/nll1+KXfEfEBDAihUruPzyy7nqqqv43//+R2xsLFC+GtubN2/mhhtu4IYbbqBVq1acOXOGJUuW8P333zNx4kS6devm1H7Tpk2kp6czbNiwMl1HRCqPJrZFRP5y9mrjs40fP77Cfc+ZM4fu3bvz1ltv8eijj+Lt7U3z5s0ZM2YMl1xyCQANGjRgxYoVPPjggzz22GPUr1+fMWPGcMUVVxRbj7qyBQQEsHbtWqZMmcK7775LZmYmbdu2Ze7cuU7fF7PZzLJly7j//vuZP38+JpOJoUOH8vLLL9O1a1enPmNiYti4cSPx8fHMmzeP48ePEx4eTteuXXniiSeq+A5FREREpCxatWrFmDFjiiz7MGXKFNq0acOrr75KfHw8YK9XfOWVVzJ06NBi+/Ty8mLlypWOchJms5kRI0Ywbdo0LrnkEvz9/cs93rFjx2I2m5k5cyZpaWn06NGDf/3rX0RGRjra9O/fn4SEBKZNm8YTTzyBj48Pffv2ZcaMGU4bQDZo0IAlS5bwwAMP8PDDDxMdHc306dPZu3evyxPbBXXK33zzTU6cOEFERASjRo3iySefrLR9b8aPH0+9evV4/vnneeSRRwgMDGTEiBHMmDGD0NBQR7u4uDgWLVrEY489xtSpU2nZsiVz587ls88+K1S+w5XPN2UxZMgQGjZsyMKFC3nssceKbRcSEsIXX3xBnz59GDBgAN9991259+iJiori0ksvZcmSJaSmpmI2m2nfvj1z5sxh4sSJhdovWrSI888/v1BJFxHxHJNRWUsBRURERERERETKaenSpYwYMYJ169aVa7JUapann36auXPnsnfvXo9tEFqcnJwcmjdvzpQpUyr8RK+IuI9qbIuIiIiIiIiIR505c8bpdcF+LSEhIYVKQkjtNHnyZLKysvj44489PZRC5s6di4+PD3fccYenhyIiZ9GKbRERERERERHxqNtuu40zZ87Qs2dPcnJyWLx4MevXr+e5555j6tSpnh6eiIhUQ5rYFhERERERERGP+vDDD3n55ZfZt28f2dnZtGrVikmTJnH33Xd7emgiIlJNaWJbRERERERERERERGoU1dgWERERERERERERkRpFE9siIiIiIiIiIiIiUqN4e3oAVcFms/H7778THByMyWTy9HBERERExE0Mw+DkyZM0adIEs1lrNuoSZXwRERGR2snVjF8nJrZ///13mjVr5ulhiIiIiEglOXz4MOedd56nhyFVSBlfREREpHYrLePXiYnt4OBgwP7NCAkJ8fBoRERERMRdMjMzadasmSPvSd2hjC8iIiJSO7ma8evExHbBo4khISEKvSIiIiK1kEpR1D3K+CIiIiK1W2kZX4UIRURERERERERERKRG0cS2iIiIiIiIiIiIiNQomtgWERERERERERERkRqlTtTYdoXNZiM3N9fTwxCpk3x8fPDy8vL0MERERKSWUcYX8RxlfBERqWya2AZyc3NJTk7GZrN5eigidVZoaCgRERHa/EtERETcQhlfxPOU8UVEpDLV+YltwzBISUnBy8uLZs2aYTarOotIVTIMg9OnT5OWlgZAZGSkh0ckIiIiNZ0yvohnKeOLiEhVqPMT2/n5+Zw+fZomTZpQr149Tw9HpE4KCAgAIC0tjfDwcD2yKCIiIhWijC/iecr4IiJS2er80gWr1QqAr6+vh0ciUrcVfOjMy8vz8EhERESkplPGF6kelPFFRKQy1fmJ7QKq+SXiWfp3UERERNxN+ULEs/TvoIiIVCZNbIuIiIiIiIiIiIhIjaKJbXFo3rw5M2fO9PQwRERERETETZTxRUREpLbSxHYNZDKZSvx68skny9XvTz/9xMSJE9072DJYu3YtJpOJEydOeGwMIiIiIiKeoIwvIiIiUjbenh5AbWG1GSQmp5N2MpvwYH96RIfhZa6cemIpKSmOvy9YsIAnnniCPXv2OI4FBQU5/m4YBlarFW/v0n/UjRo1cu9ARURERERqMGV8ERERkepLK7bdIGFHCr1nrOGGt3/gvo+3cMPbP9B7xhoSdqSUfnI5REREOL4sFgsmk8nxevfu3QQHB7Nq1Sq6d++On58f69atY//+/QwbNozGjRsTFBTEhRdeyNdff+3U77mPKZpMJt555x1GjBhBvXr1aN26NcuWLStxbG+++SatW7fG39+fxo0bc9111znes9lsTJ8+nejoaAICAujcuTOffPIJAAcOHOCyyy4DoH79+phMJsaPH++eb5iIiIiISBkp4/9NGV9ERESqI01sV1DCjhQmzd9MSka20/HUjGwmzd9cacG3NFOmTOH5559n165ddOrUiaysLAYNGsTq1av5+eefiYuLY8iQIRw6dKjEfuLj4xk5ciTbtm1j0KBB3HTTTaSnpxfZduPGjdx777089dRT7Nmzh4SEBPr06eN4f/r06bz33nvMmTOHnTt3MnnyZMaMGcP//vc/mjVrxqeffgrAnj17SElJYdasWe77hoiIiIiIuEgZ/2/K+CIiIlJdqRRJBVhtBvHLkzCKeM8ATED88iQGxERU2iOLxXnqqacYMGCA43VYWBidO3d2vH766adZsmQJy5Yt4+677y62n/Hjx3PDDTcA8Nxzz/Haa6+RmJhIXFxcobaHDh0iMDCQq6++muDgYKKioujatSsAOTk5PPfcc3z99df07NkTgBYtWrBu3Treeust+vbtS1hYGADh4eGEhoZW+HsgIiIiIlJWyvjOlPFFRESkutLEdgUkJqcXWsVxNgNIycgmMTmdni0bVN3AgAsuuMDpdVZWFk8++SQrV64kJSWF/Px8zpw5U+pqjk6dOjn+HhgYSEhICGlpaUW2HTBgAFFRUbRo0YK4uDji4uIcjzju27eP06dPOwVxgNzcXEcwFhERkZrNMAxy8m34+3h5eigi5aaM70wZX0RERKorTWxXQNrJ4gNvedq5U2BgoNPrhx56iK+++oqXXnqJVq1aERAQwHXXXUdubm6J/fj4+Di9NplM2Gy2ItsGBwezefNm1q5dy5dffskTTzzBk08+yU8//URWVhYAK1eupGnTpk7n+fn5lfX2REREpJrJOJ3H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M3Xxdia8t5H0U7m0jwxhxT29ueWS6BIntQsUhONhXZrSs2UDj01qT5q/2Sn0AqRmZDNp/mYSdqQUc6aIlEYZXxm/QGVl/MDAQGbPns2ECROIiIgocQzh4eFEREQ4vs6dsFfGFxFxD1cz/vwfDvLMyl0APDigDbdd2sIt16+p+V4T2+cwDIPTufke+To3XJZVQEAAubm5jterV69mz549fPXVV6xYsYK8vDwGDhxIcHAw3333Hd9//70jPBac9/LLLzNv3jz++9//sm7dOtLT01myZEmJ1x07diwfffQRr732Grt27eKtt94iKCiIZs2aOVYA7Nmzh5SUFGbNmlVkH+PHj2fjxo0sW7aMDRs2YBgGgwYNcip5cfr0aV566SXef/99vv32Ww4dOsRDDz0EQH5+PsOHD6dv375s27aNDRs2MHHiREym4j/sr1u3jgsuuMDxurQ+Vq5cyYgRIxg0aBA///wzq1evpkePHmW+hxkzZvDOO++wc+dOwsPDufvuu9mwYQMff/wx27Zt4/rrrycuLs4pMJtMJubNm1fsvWzYsIE+ffo4rdgZOHAge/bs4c8//yzynJycHPz9nR91CQgIIDs7m02bNhV5zr59+0hISKBv377FjqU4PXr0IDExkZycnDKfKyJSW2w9fILBr63jo8RDmEwwsU8Llt7VizaNgz09NJdZbQbxy5OK3OG94Fj88iSVJZFqRRlfGV8Zv/iMX5IuXboQGRnJgAED+P777wu9r4wvIlJ1Pt30G48t3QHApH4tufvyVm7ptybne5UiOceZPCsxT3zhkWsnPTWQer5l/5EYhsHq1av54osvuOeeexzHAwMDeeeddxxBaP78+dhsNt555x1HkJs7dy6hoaGsXbuWK6+8kpkzZzJ16lSuueYaAObMmcMXXxT//fjll19YuHAhX331Ff379wfsq3wLFDyOGB4eTmhoaJF97N27l2XLlvH999/Tq1cvwL46oVmzZixdupTrr78egLy8PObMmUPLli0BuPvuu3nqqacA+2N6GRkZXH311Y7327dvX+y4T5w4QUZGBk2a/F1Yv7Q+nn32WUaPHk18fLzjWOfOnct8D2+++abjvEOHDjF37lwOHTrkGMtDDz1EQkICc+fOdZT7aNu2LRaLpdj7SU1NJTo62ulY48aNHe/Vr1+/0DkDBw5k5syZfPTRR4wcOZLU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",
"text/plain": [
"<Figure size 1800x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"lm = fit_lm(X_train, y_train)\n",
"knn = fit_knn(X_train, y_train, k_neighbours=K_NEIGHBOURS)\n",
"\n",
"fig, axs = plt.subplots(1, 2, figsize=(18, 6), sharex=True, sharey=True)\n",
"plot_model(lm, X_train, y_train, name=\"Linear Model\", x_test=X_test, y_test=y_test, ax=axs[0])\n",
"plot_model(knn, X_train, y_train, name=\"Neighbours Model (k=5)\", x_test=X_test, y_test=y_test, ax=axs[1])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "76c2a6ba",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9308834744932162"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lm.score(X_test, y_test)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "dca4a561",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9146345869852457"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"knn.score(X_test, y_test)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "c3003190",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9308834744932162"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_model(model_type=\"linear_regression\", lr_intercept=lm.intercept, lr_gradient=lm.gradient, bias=BIAS, seed=SEED)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "013322ff",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9146345869852457"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_model(model_type=\"nearest_neighbour\", k_neighbours=K_NEIGHBOURS, bias=BIAS, seed=SEED)"
]
}
],
"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.12.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
from typing import Literal, Optional
import numpy as np
from scipy.spatial.distance import cdist
from sklearn.base import BaseEstimator, RegressorMixin
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
def make_train_test_data(
n_samples: int = 100, bias: float = 0.0, noise: float = 0.0, seed: Optional[int] = None
) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
"""Generate a 1D linear dataset with a train/test split.
Parameters
----------
n_samples
The number of total rows in the combined dataset (train & test).
bias
The offset used to generate the dataset.
noise
The random error used to generate the dataset.
seed
The random seed used to generate the dataset. Used to control reproducibility.
Returns
-------
X_train, X_test, y_train, y_test: tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]
"""
state = np.random.RandomState(seed=seed)
X, y = make_regression(
n_samples=n_samples,
n_features=1,
n_informative=1,
bias=bias,
noise=noise,
random_state=state,
)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=state)
return X_train, X_test, y_train, y_test
class LinearModel(RegressorMixin, BaseEstimator):
"""Simple 1D linear regression model with fixed intercept and gradient.
Attributes
----------
intercept
The intercept, or offset of the model
gradient
The gradient, or slope of the model
"""
def __init__(self, intercept: float = 0, gradient: float = 0):
"""Create a new LinearModel instance.
Parameters
----------
intercept
The intercept, or offset of the model
gradient
The gradient, or slope of the model
"""
self.intercept = intercept
self.gradient = gradient
def fit(self, X, y) -> "LinearModel":
"""Fit the linear model.
This a no-op, as intercept and gradient are supplied on initialisation.
Parameters
----------
X
1D training features, with shape (n_samples, 1).
y
1D training targets, with shape (n_samples,).
Returns
-------
LinearModel
Linear model instance.
"""
self.is_fitted_ = True
return self
def predict(self, X) -> np.ndarray:
"""Produce predictions.
Parameters
----------
X
1D features, with shape (n_samples, 1).
Returns
-------
np.ndarray
Predicted targets.
"""
return np.array(X * self.gradient + self.intercept).ravel()
class NeighboursModel(RegressorMixin, BaseEstimator):
"""Simple k-nearest neighbours model.
Attributes
----------
k_neighbours
The number of neighbours.
"""
def __init__(self, k_neighbours: int = 1):
"""Create a new NeighboursModel instance.
Parameters
----------
k_neighbours
The number of neighbours.
"""
self.k_neighbours = k_neighbours
def fit(self, X, y) -> "NeighboursModel":
"""Fit the neighbours model.
Parameters
----------
X
1D training features, with shape (n_samples, 1).
y
1D training targets, with shape (n_samples,).
Returns
-------
NeighboursModel
k-nn model instance.
"""
self._X = X
self._y = y
self.is_fitted = True
return self
def predict(self, X):
"""Produce predictions.
Parameters
----------
X
1D features, with shape (n_samples, 1).
Returns
-------
np.ndarray
Predicted targets.
"""
return self._y[cdist(X, self._X).argsort(axis=1)[:, : self.k_neighbours]].mean(axis=1)
def train_model(
model_type: Literal["linear_regression", "nearest_neighbour"],
lr_intercept: float = 0.0,
lr_gradient: float = 0.0,
k_neighbours: int = 1,
n_samples: int = 100,
bias: int = 10,
noise: float = 10,
seed: int = 42,
):
"""Train a model with the supplied parameters.
Generates a dataset with the bias, noise and seed parameters, and fits and scores the model.
Returns
-------
score: float
The R2 score of the model on the test set.
"""
X_train, X_test, y_train, y_test = make_train_test_data(
n_samples=n_samples, bias=bias, noise=noise, seed=seed
)
if model_type == "linear_regression":
model = LinearModel(intercept=lr_intercept, gradient=lr_gradient)
elif model_type == "nearest_neighbour":
model = NeighboursModel(k_neighbours=k_neighbours)
else:
raise ValueError(f"Unrecognised model_type: '{model_type}'")
return model.fit(X_train, y_train).score(X_test, y_test)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment