Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb
2022-06-26 23:29:56 +02:00

375 lines
75 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": 429,
"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": 430,
"metadata": {},
"outputs": [],
"source": [
"coeffs = [2, -5, 4]\n",
"\n",
"k = int(input(\"Podaj stopień wielomianu: \"))\n",
"rand_coeffs = [ random.randrange(-10, 10) for i in range(k+1) ]"
]
},
{
"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": 431,
"metadata": {},
"outputs": [],
"source": [
"def eval_polynomial(coeffs, x, k):\n",
" y = 0\n",
"\n",
" for i in range(k+1):\n",
" a = coeffs[i]*x**(k-i)\n",
" y += a\n",
" return y"
]
},
{
"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": 432,
"metadata": {},
"outputs": [],
"source": [
"def eval_polynomial_jitter(coeffs, x, j, k):\n",
" y = eval_polynomial(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": 433,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 9.52487237 4.31728957 -2.86004387 -4.06680766 -7.10993755 -6.3659089\n",
" 3.06102533 6.27143777 9.1380008 2.19180977 4.94214734 8.06342966\n",
" 4.58156633 -8.14890179 5.20520688 -8.59541259 3.6293768 -8.99512129\n",
" -9.31440353 -5.42600609 7.82342339 -1.93271916 -0.81554086 -9.6994592\n",
" 5.13719864 9.45788656 3.70964434 1.27969457 -7.21538999 7.84821922\n",
" -6.92608478 -2.35392424 8.32831454 3.61464536 -0.28674184 -2.87386245\n",
" 4.00068395 3.69653861 9.68378531 -7.278385 -7.90873047 -2.41469174\n",
" -3.51370882 6.49444659 7.17689955 -4.77777697 -2.97134134 -0.6338146\n",
" 0.75355793 -9.65106708 -8.89989426 6.99530143 1.12347522 0.50798599\n",
" -9.02110719 9.84011966 -6.16446615 -2.1919846 6.83936162 7.01254857\n",
" -5.30766773 4.18034124 -9.68850209 -5.30243924 8.6308934 6.94886296\n",
" -3.74310371 -7.17015727 0.50585453 6.5284797 -4.27368615 0.68288962\n",
" 7.23974203 8.16376838 -9.54528187 -8.04775584 -0.09982886 -6.10924399\n",
" -9.93495247 2.91907289 -2.923125 -3.53381594 1.95797436 -7.16019353\n",
" 2.04554788 -1.98013462 7.88027302 6.2077106 2.85884957 -1.95785965\n",
" -7.63680301 8.4529672 -7.24006824 2.41572699 8.19679144 -8.88831243\n",
" -8.57612565 7.081674 -5.74549524 -1.44629504]\n"
]
},
{
"data": {
"image/png": "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",
"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_polynomial_jitter(coeffs, x, j, len(coeffs)-1)\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": 434,
"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": 435,
"metadata": {},
"outputs": [],
"source": [
"def calc_gradient_poly_for_GD(coeffs, inputs_x, outputs_y, lr, k): \n",
" partial_derivatives = [[] for i in range(k+1)]\n",
" new_coeffs = [None for i in range(k+1)]\n",
" \n",
" y_bars = eval_polynomial(coeffs, inputs_x, k)\n",
"\n",
" for x,y,y_bar in list(zip(inputs_x, outputs_y, y_bars)):\n",
" for i in range(k+1):\n",
" partial = x**(k-i) * (y - y_bar)\n",
" partial_derivatives[i].append(partial)\n",
" \n",
" n = len(y_bars)\n",
" \n",
" for i in range(k+1):\n",
" derivative = (-2 / n) * sum(partial_derivatives[i])\n",
" new_coeffs[i] = coeffs[i] - lr * derivative\n",
" \n",
" \n",
" #update with these new coeffs:\n",
" new_y_bar = eval_polynomial(new_coeffs, inputs_x, k)\n",
" \n",
" updated_model_loss = loss_mse(outputs_y, new_y_bar)\n",
" return updated_model_loss, new_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": 436,
"metadata": {},
"outputs": [],
"source": [
"def gradient_descent(epochs, lr, k):\n",
" losses = []\n",
" rand_coeffs_to_test = rand_coeffs\n",
" for i in range(epochs):\n",
" loss = calc_gradient_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.<br/>\n",
"**UWAGA** gdy otrzymamy błąd double scalars - przekroczenie wartości, należy ustawić mniejszy learning rate."
]
},
{
"cell_type": "code",
"execution_count": 437,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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dCi7du3a0HnOP//8NU9fDoR+6Id+KEkyMzOTmZmZ465xs3QIAQAAABvS73dh0KFD3W6/v7nLO//88/PP//zPefzjH58XvehFh7tunvnMZ+Ynf/In84hHPCL3uc998trXvjZJ8sUvfjF79+7NWWedlTPOOCN/8id/ss66+3nUox6V7/qu78r97ne/nH/++bn55puTdJ1Fz3ve8/KgBz0oi4uL+b3f+72cffbZefCDH5xnPetZOXToUJLkt3/7t/ON3/iNOfvss/POd77z8GX3er288IUvTJJcddVVecxjHpMHPehBOeuss/KRj3wkz3/+8/P2t789D37wg/OiF70o/X4/T3ziE5Mkn/70p/PkJz85Z555Zh7+8Ifnfe973+HL/NEf/dHMzc3lPve5T17ykpds7o5eQSAEAAAAbMjcXNcZtGtXtzs3t7nL+43f+I3c/e53z9ve9rbc6U53utVp1157bd7xjnfkzW9+c57//OcnSU4++eS84Q1vyHve85687W1vy/Oe97y01tZ1XZdffnl+7dd+LR/4wAfykY98JK9//euTJF/60pfysIc9LO9973tzyimn5DWveU3e+c535sorr8yuXbvy6le/Otdee23m5+fzzne+M+94xzvygQ98YNXrePrTn57nPOc5ee9735u/+Zu/yd3udre84AUvyCMf+chceeWV+amf+qlbbT8/P5+HPOQhed/73pdf+qVfyrnnnnv4tA996EP5i7/4i1x++eVZWFjIjTfeuO77dS2GjAEAAAAbMjvbDRPr97swaLPDxdby5Cc/OSeccEIe8IAH5LrrrkuStNbyMz/zM/nrv/7rnHDCCbnmmmty3XXX5eu//uuPeXlnn3127nOf+yRJnva0p+Ud73hHvv/7vz+7du3K933f9yVJ9u/fnyuuuCIPfehDkyRf+cpXcpe73CXvfve7Mzc3l1NPPTVJ8oM/+IP5p3/6p1td/he+8IVcc801ecpTnpKkC6+O5R3veEde97rXJUm+/du/PTfccEM+//nPJ0m+67u+KyeddFJOOumk3OUud8l11123JcPqBEIAAADAhs3Obm8QtOykk046vH+5C+jVr351rr/++lxxxRU58cQTc/rpp+erX/3qui6vqlY9fPLJJx+eN6i1lmc84xnZt2/frbZ94xvfeLw347itvP27du3KTTfdtCWXa8gYAAAAMFY+97nP5S53uUtOPPHEvO1tb8vHPvaxdZ/38ssvz7/8y7/k5ptvzmte85p827d922222bt3b1772tfmk5/8ZJJujp+PfexjedjDHpbLLrssN9xwQ2688cb88R//8W3Oe/vb3z6nnXba4fDowIED+fKXv5zb3/72+cIXvrBqTY985CPz6le/Okk3z9Gd73znfO3Xfu26b9PxEAgBAAAAY+XpT396lpaWcsYZZ+TSSy/NN33TN637vA996ENzwQUX5P73v3/ufe97Hx7atdIDHvCA/MIv/EK+4zu+I2eeeWYe+9jH5tprr83d7na39Hq9zM7O5lu/9Vtz//vff9Xr+N3f/d285CUvyZlnnplHPOIR+cQnPpEzzzwzu3btyoMe9KC86EUvutX2vV4vV1xxRc4888w8//nPz6te9aqN3SHHodY76dJ2mpmZaUtLS8MuAwAAAKbSBz/4waOGG5Ok3+/nhS98Yd785jcPu5Qtt9pjWFVXtNZWXdtehxAAAADAlDGpNAAAADBR/v7v/z4//MM/fKvjTjrppMOrhCEQAgAAANKtrHXkClzj6owzzsiVV1457DJ2zPFMB2TIGAAAAEy5k08+OTfccMNxBQsMV2stN9xwQ04++eQNnU+HEAAAAEy50047LVdffXWuv/76YZfCcTj55JNz2mmnbeg8AiEAAACYcieeeGLufe97D7sMdpAhYwAAAABTRiAEAAAAMGUEQgAAAABTpkZhBvGquj7Jx4ZdxybcOcmnhl0EQ+Pxn24e/+nm8cdzYLp5/Kebx3+6efwZl+fAvVprp652wkgEQuOuqpZaazPDroPh8PhPN4//dPP44zkw3Tz+083jP908/kzCc8CQMQAAAIApIxACAAAAmDICoa1xybALYKg8/tPN4z/dPP54Dkw3j/908/hPN48/Y/8cMIcQAAAAwJTRIQQAAAAwZQRCAAAAAFNGILQOVfWfqur9VXVzVc0ccdqFVXVVVf1jVX3nUc5/76p692C711TVnp2pnO0weAyvHPx9tKquPMp2H62qvx9st7TDZbJNqqpXVdeseA484SjbPW7wf+Gqqnr+TtfJ9qiq/6+qPlRV76uqN1TVHY+yndf/BDnW67mqThq8N1w1eL8/fQhlsk2q6p5V9baq+sDg8+B/XWWbuar63Ir3hp8bRq1sj2P9T6/OSwb/A95XVWcNo062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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, k)\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": 438,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Początkowe współczynniki [-8, -1, -3]\n",
"Wyznaczone współczynniki [2.0470388756371727, -5.710817671350023, -1.943138081266058]\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": 439,
"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.8.9 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.8.9"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}