diff --git a/Projekt_2/fixed/algorytm.ipynb b/Projekt_2/fixed/algorytm.ipynb new file mode 100644 index 0000000..ce19495 --- /dev/null +++ b/Projekt_2/fixed/algorytm.ipynb @@ -0,0 +1,386 @@ +{ + "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": 98, + "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": 99, + "metadata": {}, + "outputs": [], + "source": [ + "rand_coeffs = (random.randrange(-10, 10), random.randrange(-10, 10), random.randrange(-10,10))\n", + "coeffs = [2, -5, 4] # a, b, c" + ] + }, + { + "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": 100, + "metadata": {}, + "outputs": [], + "source": [ + "def eval_2nd_degree(coeffs, x):\n", + " a = (coeffs[0]*(x*x))\n", + " b = coeffs[1]*x\n", + " c = coeffs[2]\n", + " y = a+b+c\n", + " return y\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": 101, + "metadata": {}, + "outputs": [], + "source": [ + "def eval_2nd_degree_jitter(coeffs, x, j):\n", + " y = eval_2nd_degree(coeffs, x)\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": 102, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-2.75898766 -5.65016775 -2.64800795 -0.87530755 -8.01730191 -0.07202148\n", + " 5.28994963 -0.73685206 -8.69865485 7.11491828 3.53780935 5.6983085\n", + " -3.07830759 1.28764607 9.45509424 6.95589075 -9.90311757 -2.30741362\n", + " 0.85246282 -4.39966538 0.79658004 3.29939139 -1.77080971 -8.61248702\n", + " -8.08537204 -8.46573256 5.29314956 8.89274736 -5.489419 -9.54545965\n", + " 0.57426227 1.98898479 0.28600353 -3.3779621 -6.74739724 -9.74245438\n", + " 6.70940724 -8.87576881 2.22682743 0.5484296 -5.13845562 -6.39800992\n", + " 3.76662938 0.84736151 1.02810373 6.79544869 2.20334512 3.65087577\n", + " -9.40928261 -0.51270946 9.95897626 4.22555829 3.24859186 7.78895395\n", + " 2.92230082 2.48586306 -7.51038001 4.53569191 1.27276562 0.75734371\n", + " -3.47811458 -2.76641217 0.3687908 5.73108176 -3.10855301 2.15342573\n", + " 9.14193125 9.51722955 -0.73921274 9.39733669 -8.08203669 -1.68282233\n", + " 0.63287602 2.9995979 -0.17714689 1.99519815 3.651222 3.90420391\n", + " 4.96344081 9.64202473 8.79805941 -5.23101012 -9.18668126 -9.79448374\n", + " -5.26154655 6.52710444 -7.58126901 -2.83931574 -9.23639541 4.23583082\n", + " -3.42590506 -3.22933046 -5.75833418 8.25154698 -8.96797588 -0.79300038\n", + " 0.30593884 -6.6657409 -6.58569143 -9.75881443]\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "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": 103, + "metadata": {}, + "outputs": [], + "source": [ + "def loss_mse(ys, y_bar):\n", + " return sum((ys - y_bar)*(ys - y_bar)) / len(ys)\n" + ] + }, + { + "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": 104, + "metadata": {}, + "outputs": [], + "source": [ + "def calc_gradient_2nd_poly_for_GD(coeffs, inputs_x, outputs_y, lr): \n", + " a_s = []\n", + " b_s = []\n", + " c_s = []\n", + " \n", + " y_bars = eval_2nd_degree(coeffs, inputs_x)\n", + "\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**2 \n", + " partial_a = x_squared * (y - y_bar)\n", + " a_s.append(partial_a)\n", + " partial_b = x * (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)\n", + " \n", + " updated_model_loss = loss_mse(outputs_y, new_y_bar)\n", + " return updated_model_loss, new_model_coeffs, new_y_bar\n", + " \n", + " " + ] + }, + { + "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": 105, + "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)\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": 106, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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8IAH5D73uU/+8i//cp3j7uf7v//780M/9EO5xz3ukWc+85m54YYbknSVRs973vNyv/vdL4uLi/njP/7jnHHGGTn99NPzjGc8I4cOHUqS/MEf/EG+8zu/M2eccUbe8573HL7sXq+XF7/4xUmSSy+9NA9/+MNzv/vdLw94wAPyqU99Ks9//vPzrne9K6effnpe8pKXpN/v57GPfWyS5Atf+EIe//jH5773vW8e/OAH50Mf+tDhy/zpn/7pzM3N5W53u1te+tKXbu2OXkEwBAAAAGzK3FxXKbRnT7c7N7e1y3v5y1+eO97xjnnnO9+ZW9/61jc57Yorrsi73/3uvPnNb87zn//8JMlJJ52UN7zhDfnABz6Qd77znXne856X1tq6ruv9739//tf/+l/52Mc+lk996lN5/etfnyT5+te/ngc96EH54Ac/mFNOOSWvfe1r8573vCeXXHJJ9uzZk9e85jW54oorMj8/n/e85z1597vfnY997GOrXsdTnvKUPPvZz84HP/jB/N3f/V3ucIc75EUvelEe+tCH5pJLLskv/MIv3GT7+fn53P/+98+HPvSh/Oqv/mrOOuusw6d94hOfyFvf+ta8//3vz8LCQq677rp1369r0UoGAAAAbMrsbNc+1u93odBW28jW8vjHPz7HHXdc7nWve+XKK69MkrTW8ku/9Ev527/92xx33HG5/PLLc+WVV+bbvu3bjnl5Z5xxRu52t7slSZ785Cfn3e9+d37sx34se/bsyROf+MQkyYEDB3LxxRfngQ98YJLk3/7t33K7290u73vf+zI3N5fb3va2SZKf+ImfyP/9v//3Jpf/1a9+NZdffnme8IQnJOlCrGN597vfnQsvvDBJ8gM/8AO5+uqr85WvfCVJ8kM/9EM58cQTc+KJJ+Z2t7tdrrzyym1ptxMMAQAAAJs2O7uzgdCyE0888fD+5aqg17zmNbnqqqty8cUX54QTTshpp52Wa665Zl2XV1WrHj7ppJMOzyvUWstTn/rU7N+//ybbvvGNb9zszdi0lbd/z549uf7667flcrfUSlZVvaq6vKouGfw9ZsVp51TVpVX1j1X1yK0PFQAAAOBGX/7yl3O7290uJ5xwQt75znfmM5/5zLrP+/73vz///M//nBtuuCGvfe1r833f930322bfvn153etel8997nNJujmAPvOZz+RBD3pQLrro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", + "text/plain": [ + "
" + ] + }, + "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": 107, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Początkowe współczynniki (-5, -5, 4)\n", + "Wyznaczone współczynniki (1.9655100088406912, -4.317400439992125, 4.040348505930957)\n", + "Oryginalne współczynniki [2, -5, 4]\n" + ] + } + ], + "source": [ + "\n", + "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": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "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 +}