diff --git a/wyk/02_Regresja_liniowa.ipynb b/wyk/02_Regresja_liniowa.ipynb
index 66086cd..8d481a7 100644
--- a/wyk/02_Regresja_liniowa.ipynb
+++ b/wyk/02_Regresja_liniowa.ipynb
@@ -40,7 +40,7 @@
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 2,
"metadata": {
"slideshow": {
"slide_type": "notes"
@@ -48,13 +48,16 @@
},
"outputs": [],
"source": [
+ "# Przydatne importy\n",
+ "\n",
"import numpy as np\n",
"import matplotlib\n",
- "import matplotlib.pyplot as pl\n",
+ "import matplotlib.pyplot as plt\n",
"import ipywidgets as widgets\n",
+ "import pandas as pd\n",
"\n",
"%matplotlib inline\n",
- "%config InlineBackend.figure_format = 'svg'\n",
+ "%config InlineBackend.figure_format = \"svg\"\n",
"\n",
"from IPython.display import display, Math, Latex"
]
@@ -66,66 +69,13 @@
"slide_type": "slide"
}
},
- "source": [
- "### Dane"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "6.1101,17.592\n",
- "\n",
- "5.5277,9.1302\n",
- "\n",
- "8.5186,13.662\n",
- "\n",
- "7.0032,11.854\n",
- "\n",
- "5.8598,6.8233\n",
- "\n",
- "8.3829,11.886\n",
- "\n",
- "7.4764,4.3483\n",
- "\n",
- "8.5781,12\n",
- "\n",
- "6.4862,6.5987\n",
- "\n",
- "5.0546,3.8166\n",
- "\n"
- ]
- }
- ],
- "source": [
- "with open('data01_train.csv') as data:\n",
- " for line in data.readlines()[:10]:\n",
- " print(line)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "subslide"
- }
- },
"source": [
"### Wczytanie danych"
]
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 6,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -136,24 +86,37 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "x = [6.1101, 5.5277, 8.5186, 7.0032, 5.8598, 8.3829, 7.4764, 8.5781, 6.4862, 5.0546]\n",
- "y = [17.592, 9.1302, 13.662, 11.854, 6.8233, 11.886, 4.3483, 12.0, 6.5987, 3.8166]\n"
+ " x y\n",
+ "0 6.1101 17.5920\n",
+ "1 5.5277 9.1302\n",
+ "2 8.5186 13.6620\n",
+ "3 7.0032 11.8540\n",
+ "4 5.8598 6.8233\n",
+ "5 8.3829 11.8860\n",
+ "6 7.4764 4.3483\n",
+ "7 8.5781 12.0000\n",
+ "8 6.4862 6.5987\n",
+ "9 5.0546 3.8166\n"
]
}
],
"source": [
- "import csv\n",
- "\n",
- "reader = csv.reader(open('data01_train.csv'), delimiter=',')\n",
- "\n",
- "x = list()\n",
- "y = list()\n",
- "for xi, yi in reader:\n",
- " x.append(float(xi))\n",
- " y.append(float(yi)) \n",
- " \n",
- "print('x = {}'.format(x[:10])) \n",
- "print('y = {}'.format(y[:10]))"
+ "data = pd.read_csv(\"data01_train.csv\", names=[\"x\", \"y\"])\n",
+ "print(data[:10])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "x = data[[\"x\"]].to_numpy().flatten()\n",
+ "y = data[[\"y\"]].to_numpy().flatten()"
]
},
{
@@ -267,12 +230,58 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 50,
"metadata": {
"slideshow": {
"slide_type": "skip"
}
},
+ "outputs": [],
+ "source": [
+ "# Funkcje rysujące wykres kropkowy oraz prostą regresyjną\n",
+ "\n",
+ "def regdots(x, y): \n",
+ " fig = plt.figure(figsize=(16*.6, 9*.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, y, c='r', s=50, label='Dane')\n",
+ " \n",
+ " ax.set_xlabel(u'Wielkość miejscowości [dzies. tys. mieszk.]')\n",
+ " ax.set_ylabel(u'Dochód firmy [dzies. tys. dolarów]')\n",
+ " ax.margins(.05, .05)\n",
+ " plt.ylim(min(y) - 1, max(y) + 1)\n",
+ " plt.xlim(min(x) - 1, max(x) + 1)\n",
+ " return fig\n",
+ "\n",
+ "def regline(fig, fun, theta, x):\n",
+ " ax = fig.axes[0]\n",
+ " x0, x1 = min(x), max(x)\n",
+ " X = [x0, x1]\n",
+ " Y = [fun(theta, x) for x in X]\n",
+ " ax.plot(X, Y, linewidth='2',\n",
+ " label=(r'$y={theta0}{op}{theta1}x$'.format(\n",
+ " theta0=theta[0],\n",
+ " theta1=(theta[1] if theta[1] >= 0 else -theta[1]),\n",
+ " op='+' if theta[1] >= 0 else '-')))\n",
+ "\n",
+ "def legend(fig):\n",
+ " ax = fig.axes[0]\n",
+ " handles, labels = ax.get_legend_handles_labels()\n",
+ " # try-except block is a fix for a bug in Poly3DCollection\n",
+ " try:\n",
+ " fig.legend(handles, labels, fontsize='15', loc='lower right')\n",
+ " except AttributeError:\n",
+ " pass"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
"outputs": [
{
"data": {
@@ -317,89 +326,89 @@
"C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5 \r\n",
"C -1.836992 3.163008 -0.937635 3.535534 0 3.535534 \r\n",
"z\r\n",
- "\" id=\"md053813acf\" style=\"stroke:#ff0000;\"/>\r\n",
+ "\" id=\"m60bb03830c\" style=\"stroke:#ff0000;\"/>\r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
@@ -408,10 +417,10 @@
" \r\n",
" \r\n",
+ "\" id=\"m083554a0d3\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -479,7 +488,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -505,7 +514,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -536,7 +545,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -578,7 +587,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -594,7 +603,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -610,7 +619,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -626,7 +635,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -1057,10 +1066,10 @@
" \r\n",
" \r\n",
+ "\" id=\"mb721cc4e99\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -1073,7 +1082,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -1086,7 +1095,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -1100,7 +1109,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -1114,7 +1123,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -1128,7 +1137,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -1348,7 +1357,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -1384,7 +1393,7 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
+ " \r\n",
" \r\n",
" \r\n",
" \r\n",
@@ -1401,48 +1410,13 @@
}
],
"source": [
- "# Funkcje rysujące wykres kropkowy oraz prostą regresyjną\n",
- "\n",
- "def regdots(x, y): \n",
- " fig = pl.figure(figsize=(16*.6, 9*.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, y, c='r', s=50, label='Dane')\n",
- " \n",
- " ax.set_xlabel(u'Wielkość miejscowości [dzies. tys. mieszk.]')\n",
- " ax.set_ylabel(u'Dochód firmy [dzies. tys. dolarów]')\n",
- " ax.margins(.05, .05)\n",
- " pl.ylim(min(y) - 1, max(y) + 1)\n",
- " pl.xlim(min(x) - 1, max(x) + 1)\n",
- " return fig\n",
- "\n",
- "def regline(fig, fun, theta, x):\n",
- " ax = fig.axes[0]\n",
- " x0, x1 = min(x), max(x)\n",
- " X = [x0, x1]\n",
- " Y = [fun(theta, x) for x in X]\n",
- " ax.plot(X, Y, linewidth='2',\n",
- " label=(r'$y={theta0}{op}{theta1}x$'.format(\n",
- " theta0=theta[0],\n",
- " theta1=(theta[1] if theta[1] >= 0 else -theta[1]),\n",
- " op='+' if theta[1] >= 0 else '-')))\n",
- "\n",
- "def legend(fig):\n",
- " ax = fig.axes[0]\n",
- " handles, labels = ax.get_legend_handles_labels()\n",
- " # try-except block is a fix for a bug in Poly3DCollection\n",
- " try:\n",
- " fig.legend(handles, labels, fontsize='15', loc='lower right')\n",
- " except AttributeError:\n",
- " pass\n",
- "\n",
"fig = regdots(x,y)\n",
"legend(fig)"
]
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 52,
"metadata": {
"slideshow": {
"slide_type": "notes"
@@ -1458,7 +1432,7 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": 53,
"metadata": {
"slideshow": {
"slide_type": "notes"
@@ -1479,7 +1453,7 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 55,
"metadata": {
"slideshow": {
"slide_type": "subslide"
@@ -1489,7 +1463,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "ee3dee078fac4b469781165479aab88d",
+ "model_id": "f54c3887f3474dd5873fd23e9e8f2c1a",
"version_major": 2,
"version_minor": 0
},
@@ -1506,7 +1480,7 @@
""
]
},
- "execution_count": 7,
+ "execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
@@ -1633,7 +1607,7 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": 56,
"metadata": {
"slideshow": {
"slide_type": "fragment"
@@ -1649,7 +1623,7 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 59,
"metadata": {
"slideshow": {
"slide_type": "notes"
@@ -1666,12 +1640,12 @@
" X = [x0, x1]\n",
" Y = [fun(theta, x) for x in X]\n",
" cost = J(fun, theta, xx, yy)\n",
- " ax.plot(X, Y, linewidth='2',\n",
+ " ax.plot(X, Y, linewidth=\"2\", \n",
" label=(r'$y={theta0}{op}{theta1}x, \\; J(\\theta)={cost:.3}$'.format(\n",
" theta0=theta[0],\n",
" theta1=(theta[1] if theta[1] >= 0 else -theta[1]),\n",
" op='+' if theta[1] >= 0 else '-',\n",
- " cost=cost)))\n",
+ " cost=str(cost))))\n",
"\n",
"sliderTheta02 = widgets.FloatSlider(min=-10, max=10, step=0.1, value=0, description=r'$\\theta_0$', width=300)\n",
"sliderTheta12 = widgets.FloatSlider(min=-5, max=5, step=0.1, value=0, description=r'$\\theta_1$', width=300)\n",
@@ -1695,7 +1669,7 @@
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": 60,
"metadata": {
"slideshow": {
"slide_type": "subslide"
@@ -1705,7 +1679,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "11d4fe5294534f8bb1b7f92d0b101618",
+ "model_id": "426285fc9dee403da315e39906ebee75",
"version_major": 2,
"version_minor": 0
},
@@ -1722,7 +1696,7 @@
""
]
},
- "execution_count": 10,
+ "execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
@@ -1757,7 +1731,7 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": 63,
"metadata": {
"slideshow": {
"slide_type": "notes"
@@ -1771,7 +1745,7 @@
" return lambda theta: J(fun, theta, x, y)\n",
"\n",
"def costplot(hypothesis, x, y, theta1=1.0):\n",
- " fig = pl.figure(figsize=(16*.6, 9*.6))\n",
+ " fig = plt.figure(figsize=(16*.6, 9*.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.set_xlabel(r'$\\theta_0$')\n",
@@ -1792,7 +1766,7 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": 64,
"metadata": {
"slideshow": {
"slide_type": "subslide"
@@ -1802,7 +1776,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "87612824448b43d68e93ffefa96e08ea",
+ "model_id": "cef353c79906496e9f3eef01996a3cda",
"version_major": 2,
"version_minor": 0
},
@@ -1819,7 +1793,7 @@
""
]
},
- "execution_count": 12,
+ "execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
@@ -1830,7 +1804,7 @@
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": 66,
"metadata": {
"slideshow": {
"slide_type": "notes"
@@ -1846,7 +1820,7 @@
"%matplotlib inline\n",
"\n",
"def costplot3d(hypothesis, x, y, show_gradient=False):\n",
- " fig = pl.figure(figsize=(16*.6, 9*.6))\n",
+ " fig = plt.figure(figsize=(16*.6, 9*.6))\n",
" ax = fig.add_subplot(111, projection='3d')\n",
" fig.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0)\n",
" ax.set_xlabel(r'$\\theta_0$')\n",
@@ -1871,7 +1845,7 @@
" ax.set_zlim3d(-100, 800);\n",
"\n",
" N = range(0, 800, 20)\n",
- " pl.contour(X, Y, Z, N, zdir='z', offset=-100, cmap='coolwarm', alpha=1)\n",
+ " plt.contour(X, Y, Z, N, zdir='z', offset=-100, cmap='coolwarm', alpha=1)\n",
" \n",
" ax.plot([-3.89578088] * 2,\n",
" [ 1.19303364] * 2,\n",
@@ -1900,7 +1874,7 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 67,
"metadata": {
"slideshow": {
"slide_type": "subslide"
@@ -2787,12 +2761,12 @@
" \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
" \r\n",
" \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- " \r\n",
- "