Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb
2022-06-26 22:20:00 +02:00

410 lines
55 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": 55,
"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": 56,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Stopień: 2\n",
"[1, 2, 3]\n"
]
}
],
"source": [
"rand_coeffs = (random.randrange(-10, 10), random.randrange(-10, 10), random.randrange(-10,10))\n",
"coeffs = []\n",
"#coeffs = [2, -5, 4] # a, b, c\n",
"#coeffs = [17, -8, 4] # a, b, c\n",
"\n",
"k = int(input(\"Podaj stopień wielomianu: \"))\n",
"print('Stopień: {}'.format(k))\n",
"\n",
"for i in range(k+1):\n",
" a = int(input('Podaj {} współczynnik wielomianu: '.format(i+1)))\n",
" coeffs.append(a)\n",
"\n",
"print(coeffs)"
]
},
{
"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": 57,
"metadata": {},
"outputs": [],
"source": [
"def eval_2nd_degree(coeffs, x, k):\n",
" y = 0\n",
"\n",
" for i in range(len(coeffs)):\n",
" a = coeffs[i]*x**(k-i)\n",
" y += a\n",
" return y\n",
"\n",
"#eval_2nd_degree(coeffs, 2, k)\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": 58,
"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": 59,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-3.97652539 5.12289902 0.81603889 -4.21468549 7.29999822 6.80214713\n",
" 5.12999406 -2.53404436 -5.49920761 8.378254 -7.46372758 9.86734656\n",
" 4.8149328 6.19203961 -6.38598843 6.71630077 1.01277528 9.94551208\n",
" 0.43640911 0.97816101 -1.16523849 2.44180092 -8.97602849 2.82340563\n",
" -7.02243684 -6.05657589 -6.7288575 1.22080707 8.1319712 -9.53796227\n",
" -2.7554347 -6.77738836 2.37331025 -6.13297674 9.17486304 2.5028872\n",
" 6.24318809 0.77218811 -9.98325959 -5.63262972 6.25902107 5.51014874\n",
" 6.1640148 4.72398673 -4.78847828 8.68457944 -9.88763602 6.27522868\n",
" -3.68361737 0.38206885 5.92106547 1.95099718 2.29306717 7.99642986\n",
" -1.45767721 -3.62004766 -9.65908783 2.18931831 -6.10757568 5.65887017\n",
" -3.93428386 -5.92527032 -5.28481895 1.2284518 -0.25110658 -5.26058855\n",
" -7.89031713 6.18149346 5.79201652 -8.15007796 0.68707937 5.4565716\n",
" 9.46307956 9.90004237 -9.24364221 4.70422637 -4.13537182 2.25176354\n",
" 4.15610024 -0.3163456 1.17286334 -2.64623937 -9.99866372 1.52434893\n",
" -8.11925897 0.39344416 -3.51950194 2.25860641 0.32732711 -6.46956416\n",
" -0.80515794 -4.11088739 -6.31912324 8.8255148 -4.82190706 -7.29749101\n",
" 0.65692064 9.14346455 -5.09824179 2.9668068 ]\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_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": 60,
"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": 62,
"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": 63,
"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": 64,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "'list' object is not callable",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32mc:\\DATA\\#Mike\\#Studia\\Magisterka\\Magisterka\\MATAM\\Matma_AI_cyber\\Projekt_2\\fixed\\algorytm.ipynb Cell 19'\u001b[0m in \u001b[0;36m<cell line: 1>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000017?line=0'>1</a>\u001b[0m GD \u001b[39m=\u001b[39m gradient_descent(\u001b[39m1500\u001b[39;49m, \u001b[39m0.0001\u001b[39;49m)\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000017?line=2'>3</a>\u001b[0m plt\u001b[39m.\u001b[39mfigure(figsize\u001b[39m=\u001b[39m(\u001b[39m20\u001b[39m,\u001b[39m10\u001b[39m))\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000017?line=3'>4</a>\u001b[0m plt\u001b[39m.\u001b[39mplot(xs, ys, \u001b[39m'\u001b[39m\u001b[39mg+\u001b[39m\u001b[39m'\u001b[39m, label \u001b[39m=\u001b[39m \u001b[39m'\u001b[39m\u001b[39moriginal\u001b[39m\u001b[39m'\u001b[39m)\n",
"\u001b[1;32mc:\\DATA\\#Mike\\#Studia\\Magisterka\\Magisterka\\MATAM\\Matma_AI_cyber\\Projekt_2\\fixed\\algorytm.ipynb Cell 17'\u001b[0m in \u001b[0;36mgradient_descent\u001b[1;34m(epochs, lr)\u001b[0m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000015?line=2'>3</a>\u001b[0m rand_coeffs_to_test \u001b[39m=\u001b[39m rand_coeffs\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000015?line=3'>4</a>\u001b[0m \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m \u001b[39mrange\u001b[39m(epochs):\n\u001b[1;32m----> <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000015?line=4'>5</a>\u001b[0m loss \u001b[39m=\u001b[39m calc_gradient_2nd_poly_for_GD(rand_coeffs_to_test, hundred_xs, ys, lr, k)\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000015?line=5'>6</a>\u001b[0m rand_coeffs_to_test \u001b[39m=\u001b[39m loss[\u001b[39m1\u001b[39m]\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000015?line=6'>7</a>\u001b[0m losses\u001b[39m.\u001b[39mappend(loss[\u001b[39m0\u001b[39m])\n",
"\u001b[1;32mc:\\DATA\\#Mike\\#Studia\\Magisterka\\Magisterka\\MATAM\\Matma_AI_cyber\\Projekt_2\\fixed\\algorytm.ipynb Cell 15'\u001b[0m in \u001b[0;36mcalc_gradient_2nd_poly_for_GD\u001b[1;34m(coeffs, inputs_x, outputs_y, lr, k)\u001b[0m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000013?line=7'>8</a>\u001b[0m \u001b[39mglobals\u001b[39m()[\u001b[39m'\u001b[39m\u001b[39m%s\u001b[39;00m\u001b[39m_s\u001b[39m\u001b[39m'\u001b[39m \u001b[39m%\u001b[39m i] \u001b[39m=\u001b[39m []\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000013?line=9'>10</a>\u001b[0m y_bars \u001b[39m=\u001b[39m eval_2nd_degree(coeffs, inputs_x, k)\n\u001b[1;32m---> <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000013?line=12'>13</a>\u001b[0m \u001b[39mfor\u001b[39;00m x,y,y_bar \u001b[39min\u001b[39;00m \u001b[39mlist\u001b[39;49m(\u001b[39mzip\u001b[39;49m(inputs_x, outputs_y, y_bars)): \u001b[39m# take tuple of (x datapoint, actual y label, predicted y label)\u001b[39;00m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000013?line=13'>14</a>\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000013?line=14'>15</a>\u001b[0m \u001b[39m x_squared = x**k \u001b[39;00m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000013?line=15'>16</a>\u001b[0m \u001b[39m partial_a = x_squared * (y - y_bar)\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000013?line=20'>21</a>\u001b[0m \u001b[39m c_s.append(partial_c)\u001b[39;00m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000013?line=21'>22</a>\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/DATA/%23Mike/%23Studia/Magisterka/Magisterka/MATAM/Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb#ch0000013?line=22'>23</a>\u001b[0m \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m \u001b[39mrange\u001b[39m(\u001b[39mlen\u001b[39m(coeffs)):\n",
"\u001b[1;31mTypeError\u001b[0m: 'list' object is not callable"
]
}
],
"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": null,
"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": null,
"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.9.1 64-bit (system)",
"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.9.1"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "a8ea2fdcb542f7ad5e541ceaa4e664e5167814f5e1f9d57a269097b55ff58c8d"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}