diff --git a/wyk/03_Regresja_liniowa_2.ipynb b/wyk/03_Regresja_liniowa_2.ipynb index 3e786c8..322d53d 100644 --- a/wyk/03_Regresja_liniowa_2.ipynb +++ b/wyk/03_Regresja_liniowa_2.ipynb @@ -47,46 +47,38 @@ }, { "cell_type": "code", - "execution_count": 70, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "y : price x1: isNew x2: rooms x3: floor x4: location x5: sqrMetres\n", - "476118.0 False 3 1 Centrum 78 \n", - "459531.0 False 3 2 Sołacz 62 \n", - "411557.0 False 3 0 Sołacz 15 \n", - "496416.0 False 4 0 Sołacz 14 \n", - "406032.0 False 3 0 Sołacz 15 \n", - "450026.0 False 3 1 Naramowice 80 \n", - "571229.15 False 2 4 Wilda 39 \n", - "325000.0 False 3 1 Grunwald 54 \n", - "268229.0 False 2 1 Grunwald 90 \n" + " y:price x1:isNew x2:rooms x3:floor x4:location x5:sqrMetres\n", + "1 476118.0 False 3 1 Centrum 78\n", + "2 459531.0 False 3 2 Sołacz 62\n", + "3 411557.0 False 3 0 Sołacz 15\n", + "4 496416.0 False 4 0 Sołacz 14\n", + "5 406032.0 False 3 0 Sołacz 15\n", + "... ... ... ... ... ... ...\n", + "1335 349000.0 False 4 0 Szczepankowo 29\n", + "1336 399000.0 False 5 0 Szczepankowo 68\n", + "1337 234000.0 True 2 7 Wilda 50\n", + "1338 210000.0 True 2 1 Wilda 65\n", + "1339 279000.0 True 2 2 Łazarz 36\n", + "\n", + "[1339 rows x 6 columns]\n" ] } ], "source": [ - "import csv\n", + "import numpy as np\n", + "import pandas as pd\n", "\n", - "reader = csv.reader(open(\"data02_train.tsv\", encoding=\"utf-8\"), delimiter=\"\\t\")\n", - "for i, row in enumerate(list(reader)[:10]):\n", - " if i == 0:\n", - " print(\n", - " \" \".join(\n", - " [\n", - " \"{}: {:8}\".format(\"x\" + str(j) if j > 0 else \"y \", entry)\n", - " for j, entry in enumerate(row)\n", - " ]\n", - " )\n", - " )\n", - " else:\n", - " print(\" \".join([\"{:12}\".format(entry) for entry in row]))\n" + "data = pd.read_csv(\"data02_train.tsv\", sep=\"\\t\")\n", + "data.rename(columns={col: f\"x{i}:{col}\" if i > 0 else f\"y:{col}\" for i, col in enumerate(data.columns)}, inplace=True)\n", + "data.index = np.arange(1, len(data) + 1)\n", + "print(data)" ] }, { @@ -221,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 6, "metadata": { "slideshow": { "slide_type": "skip" @@ -231,33 +223,37 @@ "source": [ "# Wersje macierzowe funkcji rysowania wykresów punktowych oraz krzywej regresyjnej\n", "\n", - "\n", - "def hMx(theta, X):\n", - " return X * theta\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", "\n", "\n", - "def regdotsMx(X, y):\n", + "def h(theta, x):\n", + " return x * theta\n", + "\n", + "\n", + "def regdots(x, y, xlabel=\"populacja\", ylabel=\"zysk\"):\n", " fig = plt.figure(figsize=(16 * 0.6, 9 * 0.6))\n", " ax = fig.add_subplot(111)\n", " fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)\n", - " ax.scatter([X[:, 1]], [y], c=\"r\", s=50, label=\"Dane\")\n", + " ax.scatter([x[:, 1]], [y], c=\"r\", s=50, label=\"Dane\")\n", "\n", - " ax.set_xlabel(\"Populacja\")\n", - " ax.set_ylabel(\"Zysk\")\n", + " ax.set_xlabel(xlabel)\n", + " ax.set_ylabel(ylabel)\n", " ax.margins(0.05, 0.05)\n", " plt.ylim(y.min() - 1, y.max() + 1)\n", - " plt.xlim(np.min(X[:, 1]) - 1, np.max(X[:, 1]) + 1)\n", + " plt.xlim(np.min(x[:, 1]) - 1, np.max(x[:, 1]) + 1)\n", " return fig\n", "\n", "\n", - "def reglineMx(fig, fun, theta, X):\n", + "def regline(fig, fun, theta, x):\n", " ax = fig.axes[0]\n", - " x0, x1 = np.min(X[:, 1]), np.max(X[:, 1])\n", - " L = [x0, x1]\n", - " LX = np.matrix([1, x0, 1, x1]).reshape(2, 2)\n", + " x_min = np.min(x[:, 1])\n", + " x_max = np.max(x[:, 1])\n", + " x_range = [x_min, x_max]\n", + " x_matrix = np.matrix([1, x_min, 1, x_max]).reshape(2, 2)\n", " ax.plot(\n", - " L,\n", - " fun(theta, LX),\n", + " x_range,\n", + " fun(theta, x_matrix),\n", " linewidth=\"2\",\n", " label=(\n", " r\"$y={theta0:.2}{op}{theta1:.2}x$\".format(\n", @@ -273,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 9, "metadata": { "slideshow": { "slide_type": "notes" @@ -284,45 +280,41 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[ 1. 3. 1. 78.]\n", - " [ 1. 3. 2. 62.]\n", - " [ 1. 3. 0. 15.]\n", - " [ 1. 4. 0. 14.]\n", - " [ 1. 3. 0. 15.]]\n", - "(1339, 4)\n", - "\n", - "[[476118.]\n", - " [459531.]\n", - " [411557.]\n", - " [496416.]\n", - " [406032.]]\n", - "(1339, 1)\n" + "x[:5]=matrix([[ 1., 3., 1., 78.],\n", + " [ 1., 3., 2., 62.],\n", + " [ 1., 3., 0., 15.],\n", + " [ 1., 4., 0., 14.],\n", + " [ 1., 3., 0., 15.]])\n", + "x.shape=(1339, 4)\n", + "y[:5]=matrix([[476118.],\n", + " [459531.],\n", + " [411557.],\n", + " [496416.],\n", + " [406032.]])\n", + "y.shape=(1339, 1)\n" ] } ], "source": [ - "# Wczytwanie danych z pliku za pomocą numpy – regresja liniowa wielu zmiennych – notacja macierzowa\n", + "# Wczytwanie danych z pliku – regresja liniowa wielu zmiennych – notacja macierzowa\n", "\n", - "import pandas\n", + "import pandas as pd\n", "\n", - "data = pandas.read_csv(\n", + "data = pd.read_csv(\n", " \"data02_train.tsv\", delimiter=\"\\t\", usecols=[\"price\", \"rooms\", \"floor\", \"sqrMetres\"]\n", ")\n", "m, n_plus_1 = data.values.shape\n", "n = n_plus_1 - 1\n", - "Xn = data.values[:, 1:].reshape(m, n)\n", + "xn = data.values[:, 1:].reshape(m, n)\n", "\n", "# Dodaj kolumnę jedynek do macierzy\n", - "XMx = np.matrix(np.concatenate((np.ones((m, 1)), Xn), axis=1)).reshape(m, n_plus_1)\n", - "yMx = np.matrix(data.values[:, 0]).reshape(m, 1)\n", + "x = np.matrix(np.concatenate((np.ones((m, 1)), xn), axis=1)).reshape(m, n_plus_1)\n", + "y = np.matrix(data.values[:, 0]).reshape(m, 1)\n", "\n", - "print(XMx[:5])\n", - "print(XMx.shape)\n", - "\n", - "print()\n", - "\n", - "print(yMx[:5])\n", - "print(yMx.shape)\n" + "print(f\"{x[:5]=}\")\n", + "print(f\"{x.shape=}\")\n", + "print(f\"{y[:5]=}\")\n", + "print(f\"{y.shape=}\")\n" ] }, { @@ -349,7 +341,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 10, "metadata": { "slideshow": { "slide_type": "notes" @@ -373,16 +365,16 @@ "from IPython.display import display, Math, Latex\n", "\n", "\n", - "def JMx(theta, X, y):\n", + "def J(theta, X, y):\n", " \"\"\"Wersja macierzowa funkcji kosztu\"\"\"\n", " m = len(y)\n", - " J = 1.0 / (2.0 * m) * ((X * theta - y).T * (X * theta - y))\n", - " return J.item()\n", + " cost = 1.0 / (2.0 * m) * ((X * theta - y).T * (X * theta - y))\n", + " return cost.item()\n", "\n", "\n", - "thetaMx = np.matrix([10, 90, -1, 2.5]).reshape(4, 1)\n", + "theta = np.matrix([10, 90, -1, 2.5]).reshape(4, 1)\n", "\n", - "cost = JMx(thetaMx, XMx, yMx)\n", + "cost = J(theta, x, y)\n", "display(Math(r\"\\Large J(\\theta) = %.4f\" % cost))\n" ] }, @@ -410,7 +402,30 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 13, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "# Wyświetlanie macierzy w LaTeX-u\n", + "\n", + "\n", + "def latex_matrix(matrix):\n", + " ltx = r\"\\left[\\begin{array}\"\n", + " m, n = matrix.shape\n", + " ltx += \"{\" + (\"r\" * n) + \"}\"\n", + " for i in range(m):\n", + " ltx += r\" & \".join([(\"%.4f\" % j.item()) for j in matrix[i]]) + r\" \\\\ \"\n", + " ltx += r\"\\end{array}\\right]\"\n", + " return ltx\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, "metadata": { "slideshow": { "slide_type": "notes" @@ -434,20 +449,20 @@ "from IPython.display import display, Math, Latex\n", "\n", "\n", - "def dJMx(theta, X, y):\n", + "def dJ(theta, X, y):\n", " \"\"\"Wersja macierzowa gradientu funckji kosztu\"\"\"\n", " return 1.0 / len(y) * (X.T * (X * theta - y))\n", "\n", "\n", - "thetaMx = np.matrix([10, 90, -1, 2.5]).reshape(4, 1)\n", + "theta = np.matrix([10, 90, -1, 2.5]).reshape(4, 1)\n", "\n", "display(\n", " Math(\n", " r\"\\large \\theta = \"\n", - " + LatexMatrix(thetaMx)\n", + " + latex_matrix(theta)\n", " + r\"\\quad\"\n", " + r\"\\large \\nabla J(\\theta) = \"\n", - " + LatexMatrix(dJMx(thetaMx, XMx, yMx))\n", + " + latex_matrix(dJ(theta, x, y))\n", " )\n", ")\n" ] @@ -476,7 +491,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 16, "metadata": { "slideshow": { "slide_type": "notes" @@ -500,7 +515,7 @@ "# Implementacja algorytmu gradientu prostego za pomocą numpy i macierzy\n", "\n", "\n", - "def GDMx(fJ, fdJ, theta, X, y, alpha, eps):\n", + "def gradient_descent(fJ, fdJ, theta, X, y, alpha, eps):\n", " current_cost = fJ(theta, X, y)\n", " history = [[current_cost, theta]]\n", " while True:\n", @@ -515,16 +530,15 @@ " return theta, history\n", "\n", "\n", - "thetaStartMx = np.zeros((n + 1, 1))\n", + "theta_start = np.zeros((n + 1, 1))\n", "\n", "# Zmieniamy wartości alpha (rozmiar kroku) oraz eps (kryterium stopu)\n", - "thetaBestMx, history = GDMx(JMx, dJMx, thetaStartMx, XMx, yMx, alpha=0.0001, eps=0.1)\n", + "theta_best, history = gradient_descent(J, dJ, theta_start, x, y, alpha=0.0001, eps=0.1)\n", "\n", - "######################################################################\n", "display(\n", " Math(\n", " r\"\\large\\textrm{Wynik:}\\quad \\theta = \"\n", - " + LatexMatrix(thetaBestMx)\n", + " + latex_matrix(theta_best)\n", " + (r\" \\quad J(\\theta) = %.4f\" % history[-1][0])\n", " + r\" \\quad \\textrm{po %d iteracjach}\" % len(history)\n", " )\n", @@ -583,1095 +597,30 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 18, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ + { + "ename": "ValueError", + "evalue": "x and y must be the same size", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn [18], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m theta_start \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mzeros((\u001b[39m2\u001b[39m, \u001b[39m1\u001b[39m))\n\u001b[0;32m----> 3\u001b[0m fig \u001b[39m=\u001b[39m regdots(x[\u001b[39m1\u001b[39m], y)\n", + "Cell \u001b[0;32mIn [6], line 15\u001b[0m, in \u001b[0;36mregdots\u001b[0;34m(x, y, xlabel, ylabel)\u001b[0m\n\u001b[1;32m 13\u001b[0m ax \u001b[39m=\u001b[39m fig\u001b[39m.\u001b[39madd_subplot(\u001b[39m111\u001b[39m)\n\u001b[1;32m 14\u001b[0m fig\u001b[39m.\u001b[39msubplots_adjust(left\u001b[39m=\u001b[39m\u001b[39m0.1\u001b[39m, right\u001b[39m=\u001b[39m\u001b[39m0.9\u001b[39m, bottom\u001b[39m=\u001b[39m\u001b[39m0.1\u001b[39m, top\u001b[39m=\u001b[39m\u001b[39m0.9\u001b[39m)\n\u001b[0;32m---> 15\u001b[0m ax\u001b[39m.\u001b[39;49mscatter([x[:, \u001b[39m1\u001b[39;49m]], [y], c\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39mr\u001b[39;49m\u001b[39m\"\u001b[39;49m, s\u001b[39m=\u001b[39;49m\u001b[39m50\u001b[39;49m, label\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39mDane\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n\u001b[1;32m 17\u001b[0m ax\u001b[39m.\u001b[39mset_xlabel(xlabel)\n\u001b[1;32m 18\u001b[0m ax\u001b[39m.\u001b[39mset_ylabel(ylabel)\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/matplotlib/__init__.py:1423\u001b[0m, in \u001b[0;36m_preprocess_data..inner\u001b[0;34m(ax, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1420\u001b[0m \u001b[39m@functools\u001b[39m\u001b[39m.\u001b[39mwraps(func)\n\u001b[1;32m 1421\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39minner\u001b[39m(ax, \u001b[39m*\u001b[39margs, data\u001b[39m=\u001b[39m\u001b[39mNone\u001b[39;00m, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 1422\u001b[0m \u001b[39mif\u001b[39;00m data \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m-> 1423\u001b[0m \u001b[39mreturn\u001b[39;00m func(ax, \u001b[39m*\u001b[39;49m\u001b[39mmap\u001b[39;49m(sanitize_sequence, args), \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1425\u001b[0m bound \u001b[39m=\u001b[39m new_sig\u001b[39m.\u001b[39mbind(ax, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n\u001b[1;32m 1426\u001b[0m auto_label \u001b[39m=\u001b[39m (bound\u001b[39m.\u001b[39marguments\u001b[39m.\u001b[39mget(label_namer)\n\u001b[1;32m 1427\u001b[0m \u001b[39mor\u001b[39;00m bound\u001b[39m.\u001b[39mkwargs\u001b[39m.\u001b[39mget(label_namer))\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/matplotlib/axes/_axes.py:4512\u001b[0m, in \u001b[0;36mAxes.scatter\u001b[0;34m(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, edgecolors, plotnonfinite, **kwargs)\u001b[0m\n\u001b[1;32m 4510\u001b[0m y \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mma\u001b[39m.\u001b[39mravel(y)\n\u001b[1;32m 4511\u001b[0m \u001b[39mif\u001b[39;00m x\u001b[39m.\u001b[39msize \u001b[39m!=\u001b[39m y\u001b[39m.\u001b[39msize:\n\u001b[0;32m-> 4512\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\u001b[39m\"\u001b[39m\u001b[39mx and y must be the same size\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m 4514\u001b[0m \u001b[39mif\u001b[39;00m s \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m 4515\u001b[0m s \u001b[39m=\u001b[39m (\u001b[39m20\u001b[39m \u001b[39mif\u001b[39;00m mpl\u001b[39m.\u001b[39mrcParams[\u001b[39m'\u001b[39m\u001b[39m_internal.classic_mode\u001b[39m\u001b[39m'\u001b[39m] \u001b[39melse\u001b[39;00m\n\u001b[1;32m 4516\u001b[0m mpl\u001b[39m.\u001b[39mrcParams[\u001b[39m'\u001b[39m\u001b[39mlines.markersize\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m*\u001b[39m\u001b[39m*\u001b[39m \u001b[39m2.0\u001b[39m)\n", + "\u001b[0;31mValueError\u001b[0m: x and y must be the same size" + ] + }, { "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2022-10-14T11:21:36.808157\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.6.1, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], + "image/png": "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XfPss89GbW1trFixIqqrq+Oyyy6LNWvWxMDAwEkfp6+vL3p6eobcAAAARqqo8Dly5EgMDAxEdXX1kPHq6uro7Owcds2+ffti8+bNMTAwEFu3bo37778/Hn744fja17520sdpbm6Oqqqqwi2fzxezTQAAgCHG/FvdBgcHY+rUqfH444/H3Llzo6GhIe69995Yv379SdesWrUquru7C7eDBw+O9TYBAICEFfXlBlOmTImysrLo6uoaMt7V1RXTpk0bds306dPjrLPOirKyssLYBz/4wejs7Iz+/v4oLy8/YU0ul4tcLlfM1gAAAE6qqCs+5eXlMXfu3GhrayuMDQ4ORltbW9TW1g675pprronXXnstBgcHC2OvvvpqTJ8+fdjoAQAAGG1Fv9WtsbExNmzYEN/73vdi9+7d8fnPfz56e3tj+fLlERGxdOnSWLVqVWH+5z//+fjTn/4Ud9xxR7z66quxZcuWWLNmTaxYsWL0ngUAAMApFP07Pg0NDXH48OFYvXp1dHZ2xpw5c6K1tbXwhQcHDhyI0tK/91Q+n4/nn38+7rrrrrjiiiti5syZcccdd8Tdd989es8CAADgFIr+HZ8zwe/4AADAP48z/js+AAAAE5HwAQAAkid8AACA5AkfAAAgecIHAABInvABAACSJ3wAAIDkCR8AACB5wgcAAEie8AEAAJInfAAAgOQJHwAAIHnCBwAASJ7wAQAAkid8AACA5AkfAAAgecIHAABInvABAACSJ3wAAIDkCR8AACB5wgcAAEie8AEAAJInfAAAgOQJHwAAIHnCBwAASJ7wAQAAkid8AACA5AkfAAAgecIHAABInvABAACSJ3wAAIDkCR8AACB5wgcAAEie8AEAAJInfAAAgOQJHwAAIHnCBwAASJ7wAQAAkid8AACA5AkfAAAgecIHAABInvABAACSJ3wAAIDkCR8AACB5wgcAAEie8AEAAJInfAAAgOQJHwAAIHnCBwAASJ7wAQAAkid8AACA5AkfAAAgecIHAABInvABAACSJ3wAAIDkCR8AACB5wgcAAEie8AEAAJInfAAAgOQJHwAAIHnCBwAASJ7wAQAAkid8AACA5AkfAAAgecIHAABInvABAACSJ3wAAIDkCR8AACB5wgcAAEie8AEAAJInfAAAgOQJHwAAIHnCBwAASJ7wAQAAkid8AACA5I0ofFpaWmLW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cY3kjP2ju+++O2bMmHHCf3TwlpGcs1/84hfxxBNPREdHxzjskIluJGds37598bOf/Sw+85nPxNatW+O1116LL3zhC/Hmm29GU1PTeGybCWYk5+ymm26KI0eOxMc+9rHIsiyOHz8et912m7e6MWpO9tq/p6cn/vKXv8TZZ599Wvdzxq/4wLvd2rVrY+PGjfH0009HRUXFmd4OiTh27FgsWbIkNmzYEFOmTDnT2yFRg4ODMXXq1Hj88cdj7ty50dDQEPfee2+sX7/+TG+NhGzbti3WrFkTjz32WOzcuTN+9KMfxZYtW+LBBx8801uDIc74FZ8pU6ZEWVlZdHV1DRnv6uqKadOmDbtm2rRpRc3nn9tIzthbHnrooVi7dm389Kc/jSuuuGIst8kEV+w5++1vfxv79++PhQsXFsYGBwcjImLSpEmxd+/euOiii8Z200woI/m7bPr06XHWWWdFWVlZYeyDH/xgdHZ2Rn9/f5SXl4/pnpl4RnLO7r///liyZEnccsstERFx+eWXR29vb9x6661x7733Rmmp/5+dd+Zkr/0rKytP+2pPxLvgik95eXnMnTs32traCmODg4PR1tYWtbW1w66pra0dMj8i4oUXXjjpfP65jeSMRUR84xvfiAcffDBaW1tj3rx547FVJrBiz9mll14aL7/8cnR0dBRun/zkJwvfWJPP58dz+0wAI/m77JprronXXnutENUREa+++mpMnz5d9DCskZyzN95444S4eSu2//bZdXhnRu21f3HfuzA2Nm7cmOVyuezJJ5/MfvOb32S33nprdt5552WdnZ1ZlmXZkiVLspUrVxbm//KXv8wmTZqUPfTQQ9nu3buzpqam7KyzzspefvnlM/UUeJcr9oytXbs2Ky8vzzZv3pz94Q9/KNyOHTt2pp4CE0Cx5+wf+VY33k6xZ+zAgQPZueeem33xi1/M9u7dmz333HPZ1KlTs6997Wtn6ikwARR7zpqamrJzzz03+/73v5/t27cv+8lPfpJddNFF2Y033nimngLvcseOHct27dqV7dq1K4uI7JFHHsl27dqV/f73v8+yLMtWrlyZLVmypDB/37592TnnnJP953/+Z7Z79+6spaUlKysry1pbW4t63HdF+GRZln3rW9/KLrjggqy8vDybP39+9qtf/arwz6699tps2bJlQ+b/4Ac/yC6++OKsvLw8+/CHP5xt2bJlnHfMRFPMGXv/+9+fRcQJt6ampvHfOBNKsX+X/X/Ch9NR7Bl76aWXspqamiyXy2UXXnhh9vWvfz07fvz4OO+aiaaYc/bmm29mX/nKV7KLLrooq6ioyPL5fPaFL3wh+9///d/x3zgTwosvvjjs66y3ztWyZcuya6+99oQ1c+bMycrLy7MLL7ww++///u+iH7cky1yDBAAA0nbGP+MDAAAw1oQPAACQPOEDAAAkT/gAAADJEz4AAEDyhA8AAJA84QMAACRP+AAAAMkTPgAAQPKEDwAAkDzhAwAAJE/4AAAAyfs/oHyzuxnlbAQAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -1681,28 +630,18 @@ } ], "source": [ - "# Wczytwanie danych z pliku za pomocą numpy – wersja macierzowa\n", - "data = np.loadtxt(\"data01_train.csv\", delimiter=\",\")\n", - "m, n_plus_1 = data.shape\n", - "n = n_plus_1 - 1\n", - "Xn = data[:, 0:n].reshape(m, n)\n", + "theta_start = np.zeros((2, 1))\n", "\n", - "# Dodaj kolumnę jedynek do macierzy\n", - "XMx = np.matrix(np.concatenate((np.ones((m, 1)), Xn), axis=1)).reshape(m, n_plus_1)\n", - "yMx = np.matrix(data[:, 1]).reshape(m, 1)\n", - "\n", - "thetaStartMx = np.zeros((2, 1))\n", - "\n", - "fig = regdotsMx(XMx, yMx)\n", - "theta_e1, history1 = GDMx(\n", - " JMx, dJMx, thetaStartMx, XMx, yMx, alpha=0.01, eps=0.01\n", - ") # niebieska linia\n", - "reglineMx(fig, hMx, theta_e1, XMx)\n", - "theta_e2, history2 = GDMx(\n", - " JMx, dJMx, thetaStartMx, XMx, yMx, alpha=0.01, eps=0.000001\n", - ") # pomarańczowa linia\n", - "reglineMx(fig, hMx, theta_e2, XMx)\n", - "legend(fig)\n" + "fig = regdots(x[1], y)\n", + "# theta_e1, history1 = GDMx(\n", + "# JMx, dJMx, thetaStartMx, XMx, yMx, alpha=0.01, eps=0.01\n", + "# ) # niebieska linia\n", + "# reglineMx(fig, hMx, theta_e1, XMx)\n", + "# theta_e2, history2 = GDMx(\n", + "# JMx, dJMx, thetaStartMx, XMx, yMx, alpha=0.01, eps=0.000001\n", + "# ) # pomarańczowa linia\n", + "# reglineMx(fig, hMx, theta_e2, XMx)\n", + "# legend(fig)\n" ] }, { @@ -1731,9 +670,9 @@ "display(\n", " Math(\n", " r\"\\theta_{10^{-2}} = \"\n", - " + LatexMatrix(theta_e1)\n", + " + latex_matrix(theta_e1)\n", " + r\"\\quad\\theta_{10^{-6}} = \"\n", - " + LatexMatrix(theta_e2)\n", + " + latex_matrix(theta_e2)\n", " )\n", ")\n" ] @@ -2148,3602 +1087,7 @@ "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2022-10-14T11:22:55.380282\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.6.1, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], + "image/svg+xml": "\n\n\n \n \n \n \n 2022-10-14T11:22:55.380282\n image/svg+xml\n \n \n Matplotlib v3.6.1, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "text/plain": [ "
" ] @@ -5860,2014 +1204,7 @@ "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2022-10-14T11:23:02.698988\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.6.1, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], + "image/svg+xml": "\n\n\n \n \n \n \n 2022-10-14T11:23:02.698988\n image/svg+xml\n \n \n Matplotlib v3.6.1, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "text/plain": [ "
" ] @@ -7969,1636 +1306,7 @@ "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2022-10-14T11:23:08.721094\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.6.1, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], + "image/svg+xml": "\n\n\n \n \n \n \n 2022-10-14T11:23:08.721094\n image/svg+xml\n \n \n Matplotlib v3.6.1, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "text/plain": [ "
" ]