Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb
2022-06-26 16:38:17 +02:00

402 lines
77 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Algorytm najszybszego spadku dla regresji wielomianowej\n",
"\n",
"Algorytm przyjmuje zbiór danych - x oraz y i próbuje wyzaczyć funkcję wilomianową, która najlepiej przewiduje wartości y na podstawie x. Wynikiem jest wyznaczenie współczynników wielomianu.\n",
"\n",
"### Importy"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [],
"source": [
"from matplotlib import pyplot as plt\n",
"import numpy as np\n",
"import random"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Początkowe współczynniki\n",
"Tworzymy losowe początkowe współczynniki wielomianu - od nich algorytm rozpocznie dopasowanie. Oraz oryginalne współczynniki na podstawie których zostanie wyznaczony zbiór danych. Aby zmienić generowany zbiór danych należy zmienić tablicę coeffs."
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2\n"
]
}
],
"source": [
"rand_coeffs = (random.randrange(-10, 10), random.randrange(-10, 10), random.randrange(-10,10))\n",
"coeffs = [2, -5, 4] # a, b, c\n",
"#coeffs = [17, -8, 4] # a, b, c\n",
"\n",
"k = input(\"Podaj stopień wielomianu: \")\n",
"k = int(k)\n",
"print(k)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Wyznaczenie wartości wielomianu\n",
"Funkcja na podstawie współczynników oraz x wyznacza wartość y wielomianu."
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [],
"source": [
"def eval_2nd_degree(coeffs, x, k):\n",
" a = (coeffs[0]*(x**k))\n",
" b = coeffs[1]*(x**(k-1))\n",
" c = coeffs[2]\n",
"\n",
" y = a+b+c\n",
" return y\n",
"\n",
"#eval_2nd_degree(coeffs, 3, 4)\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Wartości wielomianu z szumem\n",
"Funkcja jest analogiczna do poprzedniej - wyznacza wartość wielomianu na podstawie wpółczynników oraz x, ale dodatkowo dodaje szum do wyjściowych wartości - funkcja zostanie użyta przy generowaniu danych."
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [],
"source": [
"def eval_2nd_degree_jitter(coeffs, x, j):\n",
" y = eval_2nd_degree(coeffs, x, k)\n",
" \n",
" interval_min = y-j\n",
" interval_max = y+j\n",
" \n",
" return random.uniform(interval_min, interval_max)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Wygenerowanie danych\n",
"Kod generuje zbiór danych. Na podstawie wartości x od -10 do 10 i losowych współczynników wielomianu generuje wartości y z szumem. Parametr j określa jak moco dane będą zaszumione"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 1.93805554 -7.14146898 4.80847965 6.7923386 -4.9820572 -8.36721666\n",
" -3.03590771 7.10302797 3.6567952 -4.61893312 -7.77544379 4.33448858\n",
" -0.84984343 -0.4818275 7.11385026 -9.51525895 -4.38281891 8.47750482\n",
" 8.4505284 -2.03857269 6.43008266 9.91978403 9.68784877 -6.51416545\n",
" -9.46191372 9.53098301 -3.26192799 4.78375147 -0.48803478 4.2719198\n",
" 7.87940586 -9.71405924 -8.59615622 -0.99001719 -5.70862611 4.81815229\n",
" -4.75636826 3.00461241 8.0931194 -8.73839205 3.5703026 -1.70997658\n",
" 8.397044 -7.13453958 -5.68033115 6.43496878 0.63967305 3.47292048\n",
" -1.96283003 -5.96053698 7.02062456 6.6672641 1.14217053 -9.21276365\n",
" 4.7201797 -5.29291118 3.36596207 4.81029689 -6.72797697 0.21795055\n",
" -9.81276562 1.06328435 7.70633934 4.66017061 -2.2623938 -7.86967321\n",
" -2.87083371 -2.75685526 6.93841449 -2.01111387 -7.23430145 4.37277354\n",
" 0.88088525 8.62278739 -9.56199168 9.86296681 -6.41765534 -9.41510031\n",
" 3.27903273 4.84209117 3.0707047 3.82251549 6.72063776 7.53313017\n",
" 5.93242504 4.2171624 9.82285025 -4.81145849 -7.40363677 5.89354852\n",
" 9.03248351 -0.90170662 -1.86450263 -7.55012017 9.99192671 -1.20030438\n",
" 4.7200473 -6.71344168 1.93127689 -1.30512735]\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIQAAAJOCAYAAADGcdzeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAwGklEQVR4nO3dfZRse1kf+O8zXHUmYgTlhiAvXsYhTtCZoNYARpNzZkBBVsyVrIyDmVE0ZqERXDrLTBSdWLs0yRBHzdJkJKKyAtGIxFc0aEKMfVzOErUPc+VVh6vCcK9XuIi8jS4c9Jk/uk7TnNvnnH6r2lW1P5+1zurde+/qfvpU166qb/+e36+6OwAAAABMx38ydgEAAAAArJdACAAAAGBiBEIAAAAAEyMQAgAAAJgYgRAAAADAxAiEAAAAACZGIAQA7JSq+saq+v6LPvcEX6ur6r844blDVf3gRXxfAICzuG3sAgAAbqSqvjTJ1yX5pCTvTfITSZ7f3e++0W26+x+f9Ouf5tyxVNW/THJPd/+vY9cCAOwOI4QAgI1UVV+X5J8k+V+SfGySJyf5xCSvqqqPvMFt/LELAOAEBEIAwMapqj+bZJHkq7v757r7/+vutyT5wiR3JPmflucNVfWjVfWDVfXeJF96fTtWVX1JVb21qn6/qv5BVb2lqp565PY/uNy+Y9n29eyq+n+q6p1V9U1Hvs4Tq+qXq+rdVXVfVf3zGwVTx/w8j62qK1X1vqp6VZKHXXf831TV71XVe6rqF6vqU5b7n5Pkf0zy96vq/VX108v931BVv7X8em+sqmee6T8aAJgsgRAAsIn+cpL/NMmPH93Z3e9P8sokn3Nk951JfjTJQ5L80NHzq+rxSb4nB6HKI3Iw0uiRt/jen53kk5M8Jck3V9VfXO7/kyT/cw7CnM9cHv+qE/48/zrJ1eVtvzXJs687/rNJHpfkzyV5zbWfo7tftNz+tu5+cHd//vL830ryV5Y/zyLJD1bVI05YCwCAQAgA2EgPS/LO7v7gMcfuy4ePsPnl7v7J7v7T7v6j6879m0l+urt/qbv/OMk3J+lbfO9Fd/9Rd/96kl9P8peSpLuvdveru/uDy9FK35vk0q1+kKp6TJL/Jsk/6O4PdPcvJvnpo+d094u7+33d/YEkQ5K/VFUfe6Ov2d3/prt/d/kz/0iSNyd54q1qAQC4RiAEAGyidyZ52A3mBHrE8vg1b7vJ1/mEo8e7+w+T/P4tvvfvHdn+wyQPTpKq+gtV9TPL1q73JvnHua716yY1/EF3/79H9r312kZVPaiqXrBsAXtvkrcsD93way/b4O5atq+9O8mnnrAWAIAkAiEAYDP9cpIPJPkbR3dW1YOTfF6Snz+y+2Yjfu5L8qgjt//Pknz8GWt6YZLfSPK47v6zSb4xSZ3gdvcleWhVffSRfY85sv23ctD29tQctIDdca3c5ccP+/mq6hOTfF+S5yX5+O5+SJLXn7AWAIAkAiEAYAN193tyMDfOP6uqp1fVR1TVHUlenuSeJP/qhF/qR5N8flX95eUE0EPOHpx8TJL3Jnl/Vf2XSf7uSW7U3W9Nsp9kUVUfWVWfneTzj5zyMTkIv34/yZ/Jwcijo96e5D8/8vlH5yAkuj9JqurLcjBCCADgxARCAMBG6u5vy8EonG/PQRDzKzlo/3rKcq6dk3yNNyT56iQvy8FInfcneUcOApjT+ns5GM3zvhyM0PmRU9z2byV5UpJ3JZkneemRYy/NQQvZvUnemOTV1932B5I8ftke9pPd/cYk35GDUVRvT/JfJfk/T/3TAACTVt23mlcRAGA3LFvO3p2Dtq/fGbkcAIDRGCEEAOy0qvr8qvozyzl8vj3J6/KhiZsBACZJIAQA7Lo7k/zu8t/jkjyrDZEGACZOyxgAAADAxBghBAAAADAxt41dQJI87GEP6zvuuGPsMgAAAAB2xtWrV9/Z3bcfd2wjAqE77rgj+/v7Y5cBAAAAsDOq6q03OqZlDAAAAGBiBEIAAAAAEyMQAgAAAJgYgRAAAADAxAiEAAAAACZGIAQAAAAwMQIhAAAAgIkRCAEAAABMjEAIAAAAYGIEQgAAAAATIxACAAAAmBiBEAAAAMDECIQAAAAAJkYgBAAAADAxAiEAAACAiREIAQAAAEyMQAgAAABgYgRCAAAAABMjEAIAAACYGIEQAAAAwMQIhNZg2BvOdRwAAADgIgmE1mBxZXGu4wAAAAAXSSAEAAAAMDECoRUZ9obUolKLSpLD7WvtYbc6DgAAALAq1d1j15DZbNb7+/tjl7Eytaj0/Mb/z7c6DgAAAHBaVXW1u2fHHTNCCAAAAGBiBEJrML80P9dxAAAAgIukZQwAAABgB2kZAwAAAOCQQAgAAABgYgRCAAAAABMjEAIAAACYGIEQAAAAwMQIhAAAAAAmRiAEAAAAMDECIQAAAICJEQgBAAAATIxACAAAAGBibhkIVdWjq+oXquqNVfWGqvqa5f6hqu6tqruW/55x5DbPr6q7q+o3q+ppq/wBAAAAADidk4wQ+mCSr+vuxyd5cpLnVtXjl8f+aXc/YfnvlUmyPPasJJ+S5OlJvqeqHrSC2jfSsDeMXQIAAADATd0yEOru+7r7Ncvt9yV5U5JH3uQmdyZ5WXd/oLt/J8ndSZ54EcVug8WVxdglAAAAANzUqeYQqqo7knxakl9Z7npeVb22ql5cVQ9d7ntkkrcdudk9OSZAqqrnVNV+Ve3ff//9p68cAAAAgDM5cSBUVQ9O8mNJvra735vkhUk+KckTktyX5DtO8427+0XdPevu2e23336am26cYW9ILSq1qCQ53NY+BgAAAGyi205yUlV9RA7CoB/q7h9Pku5++5Hj35fkZ5af3pvk0Udu/qjlvp01XB4yXB6SHIRBPe9xCwIAAAC4iZOsMlZJfiDJm7r7O4/sf8SR056Z5PXL7VckeVZVfVRVPTbJ45L86sWVDAAAAMB5nGSE0Gcl+eIkr6uqu5b7vjHJF1XVE5J0krck+Yok6e43VNXLk7wxByuUPbe7/+Riy95c80vzsUsAAAAAuKnqHr+9aTab9f7+/thlAAAAAOyMqrra3bPjjp1qlTEAAAAAtp9ACAAAAGBiBEIAAAAAEyMQAgAAAJgYgRAAAADAxAiEAAAAACZGIAQAAAAwMQIhAAAAgIkRCAEAAABMjEAIAAAAYGIEQgAAAAATIxACAAAAmBiBEAAAAMDECIQAAAAAJkYgBAAAADAxAiEAAACAiREIAQAAAEyMQAgAAABgYgRCAAAAABMjEAIAAACYGIEQAAAAwMQIhAAAAAAmRiAEAAAAMDECoQ017A1jlwAAAADsKIHQhlpcWYxdAgAAALCjBEIAAAAAEyMQ2iDD3pBaVGpRSXK4rX0MAAAAuEjV3WPXkNls1vv7+2OXsVFqUen5+PcNAAAAsJ2q6mp3z447ZoQQAAAAwMQIhDbU/NJ87BIAAACAHSUQ2lDD5WHsEgAAAIAdJRACAAAAmBiB0A6xGhkAAABwEgKhDXLeQGdxZXExhQAAAAA7TSC0QQQ6AAAAwDoIhLbcsDekFpVaVJIcbmsfAwAAAG6kunvsGjKbzXp/f3/sMkYx7A3HjgyaX5qfeqWxWlR6Pv79CQAAAIyvqq529+y4Y7etuxg+3HB5OAx+BDoAAADAOmgZ2yHzS/OxSwAAAAC2gEBog5w30DltixkAAAAwTQKhDSLQAQAAANZBIAQAAAAwMQIhAAAAgIkRCG24YW8YuwQAAABgxwiENtziymLsEgAAAIAdIxACAAAAmBiB0AYa9obUolKLSpLDbe1jAAAAwEWo7h67hsxms97f3x+7jI1Ui0rPx7+PAAAAgO1SVVe7e3bcMSOEAAAAACZGILTh5pfmY5cAAAAA7BiB0IYbLg9jlwAAAADsGIEQAAAAwMQIhAAAAAAmRiAEAAAAMDECIQAAAICJEQgBAAAATIxACAAAAGBiBEIAAAAAEyMQAgAAAJgYgRAAAADAxAiEAAAAACZGIAQAAAAwMQIhAAAAgIkRCAEAAABMjEAIAAAAYGIEQgAAAAATIxACAAAAmBiBEAAAAMDECIQAAAAAJkYgBAAAADAxAiEAAACAiREIAQAAAEyMQAgAAABgYgRCAAAAABNzy0Coqh5dVb9QVW+sqjdU1dcs939cVb2qqt68/PjQ5f6qqu+uqrur6rVV9emr/iEAAAAAOLmTjBD6YJKv6+7HJ3lykudW1eOTfEOSn+/uxyX5+eXnSfJ5SR63/PecJC+88KoBAAAAOLNbBkLdfV93v2a5/b4kb0ryyCR3JnnJ8rSXJPmC5fadSV7aB16d5CFV9YiLLhwAAACAsznVHEJVdUeST0vyK0ke3t33LQ/9XpKHL7cfmeRtR252z3Lf9V/rOVW1X1X7999//2nrBgAAAOCMThwIVdWDk/xYkq/t7vcePdbdnaRP8427+0XdPevu2e23336amwIAAABwDicKhKrqI3IQBv1Qd//4cvfbr7WCLT++Y7n/3iSPPnLzRy33AQAAALABTrLKWCX5gSRv6u7vPHLoFUmevdx+dpKfOrL/S5arjT05yXuOtJYBAAAAMLLbTnDOZyX54iSvq6q7lvu+MckLkry8qr48yVuTfOHy2CuTPCPJ3Un+MMmXXWTBAAAAAJzPLQOh7v6lJHWDw0855vxO8txz1gUAAADAipxqlTEAAAAAtp9AiEkZ9oaxSwAAAIDRCYSYlMWVxdglAAAAwOgEQgAAAAATIxBi5w17Q2pRqcXB3OjXtrWPAQAAMFV1sCjYuGazWe/v749dBhNQi0rPx/+dBwAAgFWrqqvdPTvumBFCAAAAABMjEGJnHdcSNr80X38hAAAAsGEEQuys41YUGy4P6y8EAAAANoxACAAAAGBiBELsFCuKAQAAwK1ZZYydZUUxAAAApswqY6ycETgAAACwPQRCXIjjJnAemxXFAAAA4HgCIXaWFcUAAADgeAIhzswEzgAAALCdTCrNhTCBMwAAAGwWk0oDAAAAcEggxIUwgTMAAABsD4EQF8IEzgAAALA9BEIAAAAAEyMQAgAAAJgYgRAAAADAxAiEAAAAACZGIAQAAAAwMQIhAAAAgIkRCAEAAABMjEAIAAAAYGIEQgAAAAATIxACAAAAmBiBEAAAAMDECIQAAAAAJkYgBAAAADAxAiEAAACAiREIAQAAAEyMQAgAAABgYgRCAAAAABMjEIKbGPaGsUsAAACACycQgptYXFmMXQIAAABcOIEQAAAAwMQIhOA6w96QWlRqUUlyuK19DAAAgF1R3T12DZnNZr2/vz92GfAAtaj0fPzHCAAAAJxWVV3t7tlxx4wQAgAAAJgYgRDcxPzSfOwSAAAA4MIJhOAmhsvD2CUAAADAhRMIAQAAAEyMQAgAAABgYgRCAAAAABMjEAIAAAAmbdgbxi5h7QRCnNgUHyAAAADsvsWVxdglrJ1AiBOb4gMEAAAAdpFACFbIqCoAAIDNNOwNqUWlFpUkh9tTeR9X3T12DZnNZr2/vz92GRxj2BuOHRk0vzTPcHk419c9z+23RS0qPR//MQYAAMCN7ep7t6q62t2zY48JhDipi3yA7OqD7XpT+TkBAAC22a6+d7tZIKRlDC7Y1IcdAgAAbJv5pfnYJaydEUKc2HnbvFbVfrbJdjVlBgAAYPNpGWPjTCUoOe7nnMr8SQAAAIxLyxiM5Lhhh8eNkgIAAIB1Eggxiqn0ZxoJBAAAwCYSCDGKqQUlJpoGAABgk5hDCNZsKvMnAQAAMC5zCAEAAABwSCAEazaV+ZMAAADYXAIhWLOpzZ8EAADA5hEIwcSYyBoAAACBEEzM4spi7BIAAAAYmUAIAAAAYGIEQjABw96QWlRqUUlyuK19DAAA2Ebey5xfdffYNWQ2m/X+/v7YZcAk1KLS8/Ef9wAAAGflfc3JVNXV7p4dd8wIIQAAAICJEQjBxMwvzccuAQAA4NRMhXGxtIwBAAAAW0XL2MloGQMAAADgkEAIAAAA2Cqmwjg/gRAAAACwVYbLw9glbL1bBkJV9eKqekdVvf7IvqGq7q2qu5b/nnHk2POr6u6q+s2qetqqCgcAAADgbE4yQuhfJnn6Mfv/aXc/YfnvlUlSVY9P8qwkn7K8zfdU1YMuqlgAAAAAzu+WgVB3/2KSd53w692Z5GXd/YHu/p0kdyd54jnqAwAAAOCCnWcOoedV1WuXLWUPXe57ZJK3HTnnnuW+B6iq51TVflXt33///ecoAxj2hrFLAAAAYIucNRB6YZJPSvKEJPcl+Y7TfoHuflF3z7p7dvvtt5+xDCBJFlcWY5cAAADAFjlTINTdb+/uP+nuP03yfflQW9i9SR595NRHLfcBAAAAsCHOFAhV1SOOfPrMJNdWIHtFkmdV1UdV1WOTPC7Jr56vROA4w96QWlRqUUlyuK19DAAAgFup7r75CVU/nORykocleXuS+fLzJyTpJG9J8hXdfd/y/G9K8reTfDDJ13b3z96qiNls1vv7+2f8EYBaVHp+88cyAAAA01JVV7t7dtyx22514+7+omN2/8BNzv9HSf7RycsDAAAA1m3YGzJcHsYug5GcZ5UxYEPML821igEAAKdicZppEwjBDhguDy7mAAAAnJhACAAAACbC4jRcc8tJpdfBpNJwNsPe8SOD5pfmeoEBAICbsjjN7jvXpNLA5houf2gSOBdzAAAATkrLGAAAAEzQ/NJ87BIYkUAIdoSLOQAAcBqmmZg2gRDsCBdzAAAATkogBAAAADAxAiEAAACAiREIAQAAAEyMQAgAAABgYgRCAAAAABMjEAIAAACYGIEQAAAAMBnD3jB2CRtBIAQAAABMxuLKYuwSNoJACAAAAGBiBEIAAADATrm+LWzYG1KLSi0qSQ63p9w+Vt09dg2ZzWa9v78/dhkAAADADqhFpefH5x03O7Zrqupqd8+OO2aEEAAAAMDECIQAAACArXfStrD5pfkI1W0eLWMAAADATplSW9jNaBkDAAAA4JBACAAAANgp2sJuTSAEAAAAO2qqy6oPl4exS9h4AiEAAADYUYsri7FLYEMJhAAAAAAmRiAEAAAAO+Sky68zbZadB1Zq2Bv07wIAwEgsvz5tlp0HRqNnGQAAYPMIhAAAAGBHWX6dGxEIARdOzzIAAGwG0zdwI+YQAlZKzzIAAMA4zCEEAAAAwCGBELBSepYBAAA2j0AIWCk9ywAAAJtHIAQAAAAwMQIhWDMrbQEAAKvi/QYnJRCCNVtcWYxdAgAAsKO83+CkBEIAAAAAEyMQgjUY9obUolKLSpLDbcM5AQCA8/J+42JN5f+tunvsGjKbzXp/f3/sMmAtalHp+fiPOwAAYPd4v3F+u/R/WFVXu3t23DEjhAAAAAAmRiAEaza/NB+7BAAAYEd5v3E2U2y70zIGAAAAsKRlDAAAAICdJBACAAAAWJpK251ACAAAAGBpuDyMXcJaCIQAAAAAJkYgBAAAAGe0y6tQsdsEQgAAAHBGiyuLsUuAMxEIAQAAAEyMQAgAAABOYdgbUotKLSpJDre1j7FNqrvHriGz2az39/fHLgMAAABOpRaVno//vhqOU1VXu3t23DEjhAAAAAAmRiAEAAAAN3CrNrD5pfl6CoELJhACAACAG7jVKmLD5eFCv595iFgXgRAAAABsCMvYsy4CIQAAADjCKmJMgVXGAAAA4AbWsYrYsDccOzJofml+4S1pTMvNVhm7bd3FAAAAAB8yXB4Ogx/L2LMuWsYAAADgBqwixq4SCAEAAMANrLtlSwDFugiEAAAAYEOYM4h1EQgBAAAATIxACM7IkpMAAABsK4EQnNFxy0ICAADANhAIAQAAAEyMQAhOYdgbUotKLSpJDre1jwEAALBNqrvHriGz2az39/fHLgNOpRaVno//+AEAAIDjVNXV7p4dd8wIIQAAAICJEQjBGc0vzccuAQAAAM5EIARnNFwexi4BAACAM5r6XLACIQAAAGByFlcWY5cwKoEQAAAAwMTcMhCqqhdX1Tuq6vVH9n1cVb2qqt68/PjQ5f6qqu+uqrur6rVV9emrLB4AAADgpIa9IbWo1KKS5HB7iu1jt1x2vqr+apL3J3lpd3/qct+3JXlXd7+gqr4hyUO7++ur6hlJvjrJM5I8Kcl3dfeTblWEZecBAACAdapFpec3z0S23bmWne/uX0zyrut235nkJcvtlyT5giP7X9oHXp3kIVX1iDNVDQAAAMBKnHUOoYd3933L7d9L8vDl9iOTvO3Iefcs9z1AVT2nqvarav/+++8/YxkAAAAApze/NB+7hFGde1LpPug5O/UYq+5+UXfPunt2++23n7cMYAdNsY8XAABYj+HyMHYJozprIPT2a61gy4/vWO6/N8mjj5z3qOU+gFOb+jKQAAAAq3LWQOgVSZ693H52kp86sv9LlquNPTnJe460lgEAAAA7zCj/7XGSZed/OMkvJ/nkqrqnqr48yQuSfE5VvTnJU5efJ8krk/x2kruTfF+Sr1pJ1cDOsgwkAABsL6P8t8ctl51fB8vOA8eZwjKQAACwS7yG3yznWnYeAACA7WOENetilP92MkII2FjD3jD5mf8BAM7KSA3G4PdusxghBGwlYRAAAMBqCIQAAAB2hNYdxja/NB+7BE5IyxgAAMAO2uXWHVMLwMloGQMAAGBnWNoczk8gBAAAsIO07gA3IxACAADYQbvWUmV+JLhY5hACAABgq+zy/EhwkcwhBAAAAMAhgRAAAABbxfxIcH4CIQAAALbKrs2PBGMQCAEAAABMjEAIAAAAVshKaGwigRAAAACs0OLKYuwS4AEEQgAAAAATIxACAACACzbsDalFpRaVJIfb2sfYFNXdY9eQ2WzW+/v7Y5cBAAAAF64WlZ6P/96b6amqq909O+6YEUIAAAAAEyMQAgxbBQCAFZpfmo9dAjyAQAiw6gEAAKzQcHkYuwR4AIEQAAAAW8+odzgdgRBMlFUPAABYt1W+1jTqHU7HKmOAVQ8AAFiLVb7u9JoWHsgqYwAAAOwco97h7IwQAjLsDSa6AwBgJYa94dh2rvml+YW+BjVCCB7oZiOEBEIAAACshZYxWC8tYwDnZNgxAMBmm1+aj10CbBWBEMAJWLUCAOD8VhnamAIBTkcgBAAAwFocDW2MwIZxCYQAbsCqFQAAq2MENozrtrELANhUw+UPrb5mkkIAAGCXGCEEAADAWhiBDZtDIARwAlatAAB4oNMGOcPlIT3vw5HX17ZNCA3rJxACOAEvUgAAHsg8QLC9BEIAAACsnRHYMC6BEAAAACd2UfMAGYEN46ru8VfNmc1mvb+/P3YZAAAAnIKVWGGzVdXV7p4dd8wIIQAAAICJEQgBAABwJuYBgu0lEAIAAACYGIEQAAAAZ2LZedheAiEAAACAiREIAazZaZdkBQDYJBe17PxpvydwsSw7D7BmlmcFAHbFul7XeP0EZ2PZeQAAAAAOCYQA1mCModUAAKu2ymXnvX6C1dIyBrBmhjwDAJyO109wNlrGAAAAADgkEAJYs1UOrQYA2EVeP8HFEwgBrMDNetuHyzc+BgDAA3n9BBdPIASwAosri7FLAICNZ3JggPEIhAAAgFH4AwrAeARCABfE0qgAAMC2sOw8wApYGnV8w95gvgGADTTsDceODJpfmrtuA1ywmy07LxACWAGB0PjcBwCbz7UaYLVuFghpGQNYAUujAgAAm0wgBLAChryPwzxOANtlHX9A8RwAcDwtYwDsJG0IACSeD4Bp0zIGAAAAwCGBEAA7yTxOANOlhRgO+J3nZrSMAQAAO0vLGFPm9x8tYwAAAAAcEggBAAA7SwsxU6NlkpMSCAEbx5MVbCaPTWAbDZeHsUvghDzPXIzh8pCe92Gr2LVtjwWuJxACNs7iymLsEoBjeGwCsEqeZ2C9BEIAAACwg7RMcjMCIWAj6HWGzeSxCcAqeZ5ZLW1i3Ixl54GNY3lM2EwemwCskucZuHiWnQcAAADgkEAI2Dh6nWEzeWwCsEqeZ2C9tIwBAAAA7CAtYwAAAAAcEggBAAAATIxACICNYHlZAABYn3MFQlX1lqp6XVXdVVX7y30fV1Wvqqo3Lz8+9GJKBWCXLa4sxi4BAAAm4yJGCP233f2EI5MUfUOSn+/uxyX5+eXnADA6o5AAAODAKlrG7kzykuX2S5J8wQq+BwA7YNgbUotKLSpJDrdXFdwYhQQAAAfOtex8Vf1Okj9I0km+t7tfVFXv7u6HLI9Xkj+49vl1t31OkuckyWMe85jPeOtb33rmOgDYfrWo9Pzsz0mb8j0AAGBTrHLZ+c/u7k9P8nlJnltVf/XowT5Im4595d3dL+ruWXfPbr/99nOWAQDHW/coJICzcE0CYN3OFQh1973Lj+9I8hNJnpjk7VX1iCRZfnzHeYsEYPfNL81X8nWHy0N63ocjg65tD5eHlXw/gLNYdUurwAmA6505EKqqj66qj7m2neRzk7w+ySuSPHt52rOT/NR5iwRg9wlozs4bPeBWzKEGwPXOM0Lo4Ul+qap+PcmvJvm33f1zSV6Q5HOq6s1Jnrr8HABGt6pRSGPzRg+2k5ZWAMZ0rkmlL8psNuv9/f2xywCArWSybNh+q3gcD3vDsYHx/NLcqEyAiVjlpNIALPmLLutkZAFwK7swh5prGsDqGCEEcEGM0mAsfvdg+w17w0qDmm29Tmxr3QCbwgghAADYYKsetbOrc6gBcHYCIYBz0LbDJvBGD7iVbWsT89wKsHpaxgAuiGHtAOyyVbe1HcdzK8D5aBkDAADO5bgVywDYXgIhgAuibQc+RGsHcBo3umZ4bgVYHYEQwAXZpvkZYNWMJLg4wjXGtK75fG50zfDcCrA6AiEAgA0mXGNMw+UhPe/DeXyubW97UCNoBRAIARPhhR+snpWBgNO42TVj1dcNQSuAVcaAibBKCayXx9z5DHvDsW9Y55fmWz8yg+21ylXGrr9mrPoa4hoFTMXNVhm7bd3FAABwc8PlD73x9saVTbHtYeT1Qeu1kUmCVmCqtIwBO0v7CozHykDAacwvzVf+vL2r8yEBnJWWMWAS/IUd2FarbNOBTbXK5+1rI4W8LgCm4GYtY0YIAQBsMGEQXKzFlYVRjAARCAET4YUfAGyPVT9vC1oBtIwBAAA7zsp9wFTdrGVMIAQAAEyGeQWBKTGHEAAA7CArZwJwVgIhAADYUse1QXFz5hUEOCAQAgAAJsOcQQAHBEIAALBFhr0htajUopLkcFv7GACnYVJpAADYUiZIBuBmTCoNAAAAwCGBEAAAbCkTJANwVgIhAADYUiZIBuCsBEIAAIBJqQEmRiAEAABkcWUxdgkArJFACAAAAGBiBEIAADBRw96QWlRqUUlyuK19DGD3VXePXUNms1nv7++PXQYAAExWLSo9H/+9AQAXp6qudvfsuGNGCAEAADvLaCeA4wmEAACAzC/Nxy5hJUyWDXA8gRAAAJDh8jB2CXBmRoLB6QmEAACAnWKy7OkxEgxO77axCwAAALhIw+XhcMSTybIBjmeEEAAAMElGDG03I8HgfARCAABsBW/yOIubTZatzWi7DZeH9LwPR4Bd2zYfFpyMQAgAgK3gzTtnIRwAOJ5ACAAAmAxtRrvpZiPBgONV9/gTrM1ms97f3x+7DAAANsywNxw7Mmh+aW7kB+dmwmlg11XV1e6eHXfMKmMAAGwsq0UBwGpoGQMAACZJmxEwZQIhAAC2gjfvXDRth8CUCYQAANgK3rwDwMURCAGwdawEA3B+rqUA0yYQAmDrHLfiEACn41q6u4R9wEkIhAAAAHaIsA84CYEQAFth2BtSi0otKkkOt/0VFODkXEsBuKa6e+waMpvNen9/f+wyANgStaj0fPznL9glw95g0uaJcS3dLcPecOzIoPmlucc2TFhVXe3u2XHHjBAC2HD+agusgxYT2G7D5SE978OQ79q2MAi4EYEQwIbzJu2B5pfmY5cAsPVcSwGmTSAEwNbx1064GOaTmTbX0t0l7ANOwhxCABvIPADAuplPBgB2z83mELpt3cUAcGvD5Q9N7upNGgAAcNG0jAEAoMUEACZGIASw4bxJA9ZBOyoATItACGDDeZMGAABcNIEQAAAAwMQIhAAAAAAmRiAEAAAAMDECIQAAAICJEQgBAAAATIxACAAAAGBiBEIAABM07A1jlwAAjEggBAAwQYsri7FLAABGJBACAAAAmBiBEADARAx7Q2pRqUUlyeG29jEAmJ7q7rFryGw26/39/bHLAACYjFpUej7+60AAYHWq6mp3z447ZoQQAAAAwMQIhAAAJmh+aT52CTAabZIAAiEAgEkaLg9jlwCjscoegEAIAAAAYHIEQgAAwM6zyh7Ah1vZKmNV9fQk35XkQUm+v7tfcKNzrTIGAACsi1X2gKlY+ypjVfWgJP9Hks9L8vgkX1RVj1/F9wKAXeev1wAAXLRVtYw9Mcnd3f3b3f3HSV6W5M4VfS8A2GkmPwW4WFbZA1hdIPTIJG878vk9y32Hquo5VbVfVfv333//isoAAAD4cFbZAxhxUunuflF3z7p7dvvtt49VBgBsJJOfbif3DwCwLVYyqXRVfWaSobuftvz8+UnS3f/bceebVBoAbszkp9vDfQUAbJK1Tyqd5NeSPK6qHltVH5nkWUlesaLvBQAAAMAprCQQ6u4PJnlekn+X5E1JXt7db1jF9wKAXWfy082mvQ8A2EYraRk7LS1jAMAu0DIGAGySMVrGAAAAANhQAiEA4AG0O52N9j7YDK5hALemZQwAeACtT8A2cw0DOKBlDAAAYMkIIgCBEACMapPelKxrtaxN+pmB3XGaa9jiymLN1QFsHi1jADCiTW1rWGVdm/ozA7vjVtcZ1yFgKrSMAQAAk7auUZAA20IgBABrtg1vSi56taxt+JmB3XHcNWy4PKTnfTgy6Nr2cHlYc3UAm0HLGACMaIptC1P8mYHN4joETIWWMQAAgKWLHgUJsI0EQgAwoim+KZnizwxsFm1iAFrGAAAAAHaSljEAAAAADgmEAAAAACZGIAQAAAAwMQIhAAAAgIkRCAEAAABMjEAIAAA2yLA3jF0CABMgEAIAgA2yuLIYuwQAJkAgBAAAADAxAiEAABjZsDekFpVaVJIcbmsfA2BVqrvHriGz2az39/fHLgMAAEZXi0rPx3+NDsD2q6qr3T077pgRQgAAAAATIxACAIANMr80H7sEACZAIAQAG+DaPCHmCwGGy8PZb+saAsAJCYQAYANcW2Z6V5eb9iYV1mNXryEAXDyBEACwct6kAgBsFoEQAIzkuGWmr3203DRwUpasB+AsLDsPABds2BtOPQfItWWmd2m56WFvOHZk0PzS/FxzpAA3tkvXEADOz7LzALBG2qMODJeH9LwP35xe2xYGAQCMTyAEABvg2jLTlpvmImgVmi7XEABOSssYAFwA7VE3d5Y2Os5O2xAAkNy8ZUwgBAAXzJtxxuZ3EABIzCEEALDzrDQFAJzGbWMXAAC7xhwejGG4/KG2PCOEAIBbMUIIAC6YuXIAANh0AiEAgB1jlBoAcCsCIQCAHWOUGgBwKwIhAAAAgIkRCAEAAABMjEAIAAAAYGIEQgAAAAATIxACAAAAmBiBEAAAW2HYG8YuAQB2hkAIAICtsLiyGLsEANgZAiEAAACAiREIAQCwsYa9IbWo1KKS5HBb+xgAnE9199g1ZDab9f7+/thlAABbZtgbMlwexi6DNalFpefjv3YFgG1RVVe7e3bcMSOEAICtZU4ZAICzEQgBALAV5pfmY5cAADtDIAQAbBVzykyX9kAAuDjmEAIAtpY5ZQAAbswcQgDAzjBCCADg/IwQAgC2lhFCAAA3ZoQQAAAAAIcEQgDA1rLqFADA2QiEAICtZdUpAICzEQgBAAAATIxACAAAAGBiBEIAAAAAEyMQAgAAAJgYgRAAAADAxAiEAAAAACZGIAQAAAAwMQIhAAAAgIkRCAEAAABMjEAIAAAAYGIEQgAAAAATIxACAAAAmBiBEAAAAMDECIQAAAAAJkYgBAAAADAxAiEAAACAiREIAQAAAEyMQAgAAABgYgRCAAAAABMjEAIAAACYmOrusWtIVd2f5K1j13ELD0vyzrGLYDTu/2lz/+N3YNrc/9Pm/p829/+0uf+nbVfu/0/s7tuPO7ARgdA2qKr97p6NXQfjcP9Pm/sfvwPT5v6fNvf/tLn/p839P21TuP+1jAEAAABMjEAIAAAAYGIEQif3orELYFTu/2lz/+N3YNrc/9Pm/p829/+0uf+nbefvf3MIAQAAAEyMEUIAAAAAEyMQAgAAAJgYgdARVfXfV9UbqupPq2p23bHnV9XdVfWbVfW0G9z+sVX1K8vzfqSqPnI9lXPRlvffXct/b6mqu25w3luq6nXL8/bXXCYrUlVDVd175HfgGTc47+nLa8LdVfUN666T1aiq/72qfqOqXltVP1FVD7nBeR7/O+RWj+eq+qjlc8Pdy+f6O0YokxWoqkdX1S9U1RuXrwO/5phzLlfVe448L3zzGLWyOre6pteB715eA15bVZ8+Rp1cvKr65COP7buq6r1V9bXXneMasEOq6sVV9Y6qev2RfR9XVa+qqjcvPz70Brd99vKcN1fVs9dX9WqYQ+iIqvqLSf40yfcm+Xvdvb/c//gkP5zkiUk+Icl/SPIXuvtPrrv9y5P8eHe/rKr+RZJf7+4XrvNn4OJV1XckeU93f8sxx96SZNbd71x7YaxMVQ1J3t/d336Tcx6U5P9O8jlJ7knya0m+qLvfuJYiWZmq+twk/7G7P1hV/yRJuvvrjznvLfH43wkneTxX1Vcl+a+7+yur6llJntnd/8MoBXOhquoRSR7R3a+pqo9JcjXJF1x3/1/OwWvDvzZOlazara7pyz8OfXWSZyR5UpLv6u4nra9C1mH5fHBvkid191uP7L8c14CdUVV/Ncn7k7y0uz91ue/bkryru1+w/MPQQ69//VdVH5dkP8ksSefg+eIzuvsP1voDXCAjhI7o7jd1928ec+jOJC/r7g909+8kuTsH4dChqqok/12SH13uekmSL1hhuazB8n79whwEgnDUE5Pc3d2/3d1/nORlObhWsOW6+9939weXn746yaPGrIe1OMnj+c4cPLcnB8/1T1k+R7Dluvu+7n7Ncvt9Sd6U5JHjVsUGujMHbx67u1+d5CHLMJHd8pQkv3U0DGL3dPcvJnnXdbuPPs/f6L3805K8qrvftQyBXpXk6auqcx0EQifzyCRvO/L5PXngC4WPT/LuI28ijjuH7fNXkry9u998g+Od5N9X1dWqes4a62L1nrccEv7iGwwZPcl1ge33t5P87A2OefzvjpM8ng/PWT7XvycHz/3skGUr4Kcl+ZVjDn9mVf16Vf1sVX3KeitjDW51Tfe8Pw3Pyo3/EOwasNse3t33Lbd/L8nDjzln564Dt41dwLpV1X9I8uePOfRN3f1T666H8Zzwd+GLcvPRQZ/d3fdW1Z9L8qqq+o1l4syGu9n9n+SFSb41By8OvzXJd+QgGGBHnOTxX1XflOSDSX7oBl/G4x92SFU9OMmPJfna7n7vdYdfk+QTu/v9y9ahn0zyuDWXyGq5pk9cHcz/+teTPP+Yw64BE9LdXVWTmFtncoFQdz/1DDe7N8mjj3z+qOW+o34/B0NHb1v+5fC4c9ggt/pdqKrbkvyNJJ9xk69x7/LjO6rqJ3LQduDFwxY46bWgqr4vyc8cc+gk1wU21Ake/1+a5K8leUrfYLI9j/+dcpLH87Vz7lk+P3xsDp772QFV9RE5CIN+qLt//PrjRwOi7n5lVX1PVT3MHGK74wTXdM/7u+/zkrymu99+/QHXgEl4e1U9orvvW7aDvuOYc+5NcvnI549KsreG2lZGy9jJvCLJs+pghZHH5iAN/tWjJyzfMPxCkr+53PXsJEYcbbenJvmN7r7nuINV9dHLySdTVR+d5HOTvP64c9ku180J8Mwcf7/+WpLH1cHqgh+ZgyHGr1hHfaxWVT09yd9P8te7+w9vcI7H/245yeP5FTl4bk8Onuv/443CQrbLci6oH0jypu7+zhuc8+evzRlVVU/MwWtogeCOOOE1/RVJvqQOPDkHC47cF3bJDTsDXAMm4ejz/I3ey/+7JJ9bVQ9dTinxuct9W2tyI4RupqqemeSfJbk9yb+tqru6+2nd/YblCmJvzEH7wHOvrTBWVa9M8ne6+3eTfH2Sl1XVP0zyf+XgxQXb6wE9xFX1CUm+v7ufkYO+0p9YPjfcluRfd/fPrb1KVuHbquoJOWgZe0uSr0g+/P5frkD1vBw8CTwoyYu7+w0j1cvF+udJPioHLQNJ8urlylIe/zvqRo/nqvqWJPvd/YocPKf/q6q6OwcTUT5rvIq5YJ+V5IuTvK6q7lru+8Ykj0mS7v4XOQgB/25VfTDJHyV5lkBwpxx7Ta+qr0wOfwdemYMVxu5O8odJvmykWlmBZRD4OVm+5lvuO3r/uwbskKr64RyM9HlYVd2TZJ7kBUleXlVfnuStOVhYKFU1S/KV3f13uvtdVfWtOfhDUpJ8S3dfPzn1VrHsPAAAAMDEaBkDAAAAmBiBEAAAAMDECIQAAAAAJkYgBAAAADAxAiEAAACAiREIAQAAAEyMQAgAAABgYv5/L74DwN0/qisAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 1440x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"hundred_xs=np.random.uniform(-10,10,100)\n",
"print(hundred_xs)\n",
"\n",
"j=50\n",
"x_y_pairs = []\n",
"for x in hundred_xs:\n",
" y = eval_2nd_degree_jitter(coeffs, x, j)\n",
" x_y_pairs.append((x,y))\n",
" \n",
"xs = []\n",
"ys = []\n",
"for a,b in x_y_pairs:\n",
" xs.append(a)\n",
" ys.append(b)\n",
" \n",
"plt.figure(figsize=(20,10))\n",
"plt.plot(xs, ys, 'g+')\n",
"plt.title('Original data')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Funkcja straty\n",
"Do określenia jak mocno przewidziane wartości y są różne zostanie użyta kwadratowa funkcja straty."
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [],
"source": [
"def loss_mse(ys, y_bar):\n",
" return sum((ys - y_bar)*(ys - y_bar)) / len(ys)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Gradient\n",
"Funkcja przyjmuje współczynniki wielomianu, x, y oraz parametr prękości uczenia i wylicza za pomocą gradientu nowe wartości współczynników wielomianu."
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [],
"source": [
"def calc_gradient_2nd_poly_for_GD(coeffs, inputs_x, outputs_y, lr, k): \n",
" a_s = []\n",
" b_s = []\n",
" c_s = []\n",
" \n",
" y_bars = eval_2nd_degree(coeffs, inputs_x, k)\n",
"\n",
"\n",
" # tu zamiast 2 dodałem k i w potencial_b k-1, czy tylko to powinno byś zmiaenione?\n",
" for x,y,y_bar in list(zip(inputs_x, outputs_y, y_bars)): # take tuple of (x datapoint, actual y label, predicted y label)\n",
" x_squared = x**k \n",
" partial_a = x_squared * (y - y_bar)\n",
" a_s.append(partial_a)\n",
" partial_b = x**(k-1) * (y-y_bar)\n",
" b_s.append(partial_b)\n",
" partial_c = (y-y_bar)\n",
" c_s.append(partial_c)\n",
" \n",
" num = [i for i in y_bars]\n",
" n = len(num)\n",
" \n",
" gradient_a = (-2 / n) * sum(a_s)\n",
" gradient_b = (-2 / n) * sum(b_s)\n",
" gradient_c = (-2 / n) * sum(c_s)\n",
"\n",
"\n",
" a_new = coeffs[0] - lr * gradient_a\n",
" b_new = coeffs[1] - lr * gradient_b\n",
" c_new = coeffs[2] - lr * gradient_c\n",
" \n",
" new_model_coeffs = (a_new, b_new, c_new)\n",
" \n",
" #update with these new coeffs:\n",
" new_y_bar = eval_2nd_degree(new_model_coeffs, inputs_x, k)\n",
" \n",
" updated_model_loss = loss_mse(outputs_y, new_y_bar)\n",
" return updated_model_loss, new_model_coeffs, new_y_bar"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Minimalizacja\n",
"Funkcja powtarza proces wyznaczenia nowych współczynników wielomianu zadaną ilość razy - epoch."
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [],
"source": [
"def gradient_descent(epochs, lr):\n",
" losses = []\n",
" rand_coeffs_to_test = rand_coeffs\n",
" for i in range(epochs):\n",
" loss = calc_gradient_2nd_poly_for_GD(rand_coeffs_to_test, hundred_xs, ys, lr, k)\n",
" rand_coeffs_to_test = loss[1]\n",
" losses.append(loss[0])\n",
" #print(losses)\n",
" return loss[0], loss[1], loss[2], losses #(updated_model_loss, new_model_coeffs, new_y_bar, saved loss updates)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Uruchomienie\n",
"Wartości wyznaczonego wielomionu zostają wyświetlone na wykresie z porównaniem do zbioru danych."
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Zjc1Rgqwsr20DwFg80w7DwA7SHtUpzfTS5ttxw9OF05LBgEAjJ6EEACMgYVppk03zVbQKjS57EMAWCstYwCwBbRHrW4jbXRsnLYhACBZvWVMQggAtpiDcUbNaxAASIwhBACw55lpCgBYj5NGHQAA7DXG8GAUejM3tuWpEAIATkSFEABsMWPlAAAw7iSEAAD2GFVqAMCJSAgBAOwxqtQAgBMxhhAAAABMuOuuuy6XXXZZrrnmmlGHwgaceuqpOeOMM3LyySev+TISQgAAADDhLrvsstzqVrfKmWeemaoadTisQ2stV199dS677LLc5S53WfPltIwBAADAhLvmmmty2mmnSQbtQlWV0047bd3VXRJCAAAAgGTQLraR505CCAAAAGDCSAgBALAr9Pq9UYcAwBKj2Dc/8pGPzBe+8IVVt/mlX/qlvOUtb9nQ9ff7/TzqUY/a0GV3EwkhAAB2hbmL50YdAgBL7OS+ubWWG264IW9605ty61vfetVtn/e85+WhD33ozgS2S0kIAQAAAGPhN37jN3Kve90r97rXvfKiF70on/jEJ3L3u9895557bu51r3vlU5/6VM4888x89rOfTZJccMEFufvd757v+Z7vyROf+MS84AUvSJI85SlPyatf/eokyZlnnpnZ2dmcffbZufe9752PfOQjSZJ3v/vdmZ6ezv3ud7886EEPyj/+4z+O5k6PiIQQAABjq9fvpeYqNdcNlrlwWvsYwOhs1775kksuyctf/vK8613vyjvf+c689KUvzec///l89KMfzc/+7M/mgx/8YO585zsf3/7v//7v85rXvCbvfe978xd/8ReZn59f8bpve9vb5j3veU+e/vSnH08afcd3fEfe9ra35R/+4R/yvOc9L8997nM3Ff9uc9KoAwAA2Khev5feTG/UYbCNejM3Psc1V2mzbbQBAbBt++a3v/3teexjH5tv/MZvTJI87nGPy9ve9rbc+c53zgMf+MCbbf+Od7wjj370o3Pqqafm1FNPzQ/90A+teN2Pe9zjkiTf9V3flde+9rVJki9+8Yt58pOfnI9+9KOpqlx33XVbcj92CxVCAMCuZUwZANj7FhJEm3HKKackSfbt25frr78+SXL++efne7/3e/OBD3wg//t//+9cc801m76d3URCCACAXWH2wOyoQwBgia3cNz/4wQ/O61//+nzta1/LV7/61bzuda/Lgx/84BW3/+7v/u7jiZyvfOUreeMb37iu2/viF7+YO97xjkmS3//9399M6LuShBAAsKsYU2ZyaQ8EGD9buW8+++yz85SnPCXnnHNOHvCAB+RnfuZncpvb3GbF7e9///vnh3/4h3PWWWflEY94RO5973vnm7/5m9d8e7/wC7+QQ4cO5X73u9/xqqFJUq2Nvg97amqqrTb4EwDAcowpAwBb48Mf/nDucY97jDqMdfvKV76SW97ylvna176WhzzkIbnwwgtz9tlnjzqskVjuOayqS1prU8ttr0IIANhVVAgBAAvOO++83Pe+983ZZ5+dxz/+8RObDNoIs4wBALuKWacAgAV/9Ed/NOoQdi0VQgAAAAATRkIIANi1zDoFALAxEkIAwK5l1ikAgI2REAIAAACYMBJCAAAAABNGQggAAABYt8EgOXy4W26FF7/4xbnHPe6R29zmNnn+85+/4eu55S1vuTUBrcHv//7v55nPfGaS5Hd/93dz0UUXrbjtJz7xiZvMijY/P5+f+7mf2/YYV2LaeQAAAGBdBoPk4MHk6NFk//7kyJFkenpz1/nbv/3bectb3pIzzjhja4LchGPHjmXfvn3ruszTnva0VdcvJIR+/Md/PEkyNTWVqampDce4WSqEAAAAgHXp97tk0LFj3bLf39z1Pe1pT8s//dM/5RGPeERe+MIXHq+6ecpTnpKf+7mfy4Me9KDc9a53zatf/eokyVe+8pUcPHgwZ599du5973vnz//8z9cYdz8PechD8oM/+IO5+93vnqc97Wm54YYbknSVRc9+9rNzn/vcJ4PBIH/4h3+Yc845J/e9733z1Kc+NceOHUuSvPzlL8+///f/Puecc07e8Y53HL/uXq+XF7zgBUmSj33sY3noQx+a+9znPjn77LPz8Y9/PM95znPytre9Lfe9733zwhe+MP1+P4961KOSJJ/73OfymMc8JmeddVYe+MAH5n3ve9/x6/ypn/qpzMzM5K53vWte/OIXb+6BXkRCCAAAAFiXmZmuMmjfvm45M7O56/vd3/3d3OEOd8hb3/rW3OY2t7nJuiuuuCJvf/vb88Y3vjHPec5zkiSnnnpqXve61+U973lP3vrWt+bZz352Wmtruq13v/vd+R//43/kQx/6UD7+8Y/nta99bZLkq1/9ah7wgAfkve99b0477bS86lWvyjve8Y5ceuml2bdvX175ylfmiiuuyOzsbN7xjnfk7W9/ez70oQ8textPetKT8oxnPCPvfe9783d/93e5/e1vn+c///l58IMfnEsvvTQ///M/f5PtZ2dnc7/73S/ve9/78qu/+qs599xzj6/7yEc+kr/6q7/Ku9/97szNzeW6665b8+O6Gi1jAAAAwLpMT3dtYv1+lwzabLvYah7zmMfkFre4Re55z3vmyiuvTJK01vLc5z43f/u3f5tb3OIWufzyy3PllVfm277t2054feecc07uete7Jkme+MQn5u1vf3t+5Ed+JPv27cvjH//4JMmRI0dyySWX5P73v3+S5Otf/3pud7vb5V3veldmZmZy+umnJ0l+7Md+LP/3//7fm1z/l7/85Vx++eV57GMfm6RLXp3I29/+9rzmNa9Jknzf931frr766nzpS19KkvzgD/5gTjnllJxyyim53e1ulyuvvHJL2uokhAAAAIB1m57e3kTQglNOOeX46YUqoFe+8pW56qqrcskll+Tkk0/OmWeemWuuuWZN11dVy/5/6qmnHh83qLWWJz/5yTl8+PBNtn3961+/0buxYYvv/759+3L99ddvyfVqGQMAAAB2lS9+8Yu53e1ul5NPPjlvfetb88lPfnLNl333u9+df/7nf84NN9yQV73qVfme7/mem21z8ODBvPrVr85nPvOZJN0YP5/85CfzgAc8IBdffHGuvvrqXHfddfmzP/uzm132Vre6Vc4444zjyaNrr702X/va13KrW90qX/7yl5eN6cEPfnBe+cpXJunGObrtbW+bb/qmb1rzfdoICSEAAABgV3nSk56U+fn53Pve985FF12U7/iO71jzZe9///vnmc98Zu5xj3vkLne5y/HWrsXuec975pd/+ZfzsIc9LGeddVa+//u/P1dccUVuf/vbp9frZXp6Ot/93d+de9zjHsvexh/8wR/kxS9+cc4666w86EEPyr/+67/mrLPOyr59+3Kf+9wnL3zhC2+yfa/XyyWXXJKzzjorz3nOc/KKV7xifQ/IBtRaB13aTlNTU21+fn7UYQAAAMBE+vCHP7xicmMv6ff7ecELXpA3vvGNow5lyy33HFbVJa21Zee2VyEEAAAAMGEMKg0AAADsKe9///vzEz/xEzc575RTTjk+SxgSQgAAAEC6mbWWzsC1W9373vfOpZdeOuowdsxGhgPSMgYA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",
"text/plain": [
"<Figure size 1440x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"GD = gradient_descent(1500, 0.0001)\n",
"\n",
"plt.figure(figsize=(20,10))\n",
"plt.plot(xs, ys, 'g+', label = 'original')\n",
"plt.plot(xs, GD[2], 'b.', label = 'final_prediction')\n",
"plt.title('Original vs Final prediction after Gradient Descent')\n",
"plt.legend(loc=\"lower right\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Wyznaczone współczynniki wielomianu"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Początkowe współczynniki (7, 5, -6)\n",
"Wyznaczone współczynniki (2.1546532016162714, -4.490001059494276, -5.122120484596819)\n",
"Oryginalne współczynniki [2, -5, 4]\n"
]
}
],
"source": [
"print(\"Początkowe współczynniki {}\".format(rand_coeffs))\n",
"print(\"Wyznaczone współczynniki {}\".format(GD[1]))\n",
"print(\"Oryginalne współczynniki {}\".format(coeffs))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Funkcja straty\n",
"Wykres przedstawia jak zmianiała się wartość funkcji straty w kolejnych krokach algorytmu."
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 1440x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(20,10))\n",
"plt.plot(GD[3], 'b-', label = 'loss')\n",
"plt.title('Loss over 1500 iterations')\n",
"plt.legend(loc=\"lower right\")\n",
"plt.xlabel('Iterations')\n",
"plt.ylabel('MSE')\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.10.4 64-bit",
"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.10.4"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}