Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb

375 lines
75 KiB
Plaintext
Raw Normal View History

2022-06-25 10:11:35 +02:00
{
"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",
2022-06-26 23:29:56 +02:00
"execution_count": 429,
2022-06-25 10:11:35 +02:00
"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",
2022-06-26 23:29:56 +02:00
"execution_count": 430,
2022-06-25 10:11:35 +02:00
"metadata": {},
2022-06-26 23:29:56 +02:00
"outputs": [],
2022-06-25 10:11:35 +02:00
"source": [
2022-06-26 23:29:56 +02:00
"coeffs = [2, -5, 4]\n",
2022-06-26 16:38:17 +02:00
"\n",
2022-06-26 22:20:00 +02:00
"k = int(input(\"Podaj stopień wielomianu: \"))\n",
2022-06-26 23:29:56 +02:00
"rand_coeffs = [ random.randrange(-10, 10) for i in range(k+1) ]"
2022-06-25 10:11:35 +02:00
]
},
{
"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",
2022-06-26 23:29:56 +02:00
"execution_count": 431,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [],
"source": [
2022-06-26 23:29:56 +02:00
"def eval_polynomial(coeffs, x, k):\n",
2022-06-26 22:20:00 +02:00
" y = 0\n",
2022-06-26 16:38:17 +02:00
"\n",
2022-06-26 23:29:56 +02:00
" for i in range(k+1):\n",
2022-06-26 22:20:00 +02:00
" a = coeffs[i]*x**(k-i)\n",
" y += a\n",
2022-06-26 23:29:56 +02:00
" return y"
2022-06-25 10:11:35 +02:00
]
},
{
"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",
2022-06-26 23:29:56 +02:00
"execution_count": 432,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [],
"source": [
2022-06-26 23:29:56 +02:00
"def eval_polynomial_jitter(coeffs, x, j, k):\n",
" y = eval_polynomial(coeffs, x, k)\n",
2022-06-25 10:11:35 +02:00
" \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",
2022-06-26 23:29:56 +02:00
"execution_count": 433,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2022-06-26 23:29:56 +02:00
"[ 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"
2022-06-25 10:11:35 +02:00
]
},
{
"data": {
2022-06-26 23:29:56 +02:00
"image/png": "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
2022-06-25 10:11:35 +02:00
"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",
2022-06-26 23:29:56 +02:00
" y = eval_polynomial_jitter(coeffs, x, j, len(coeffs)-1)\n",
2022-06-25 10:11:35 +02:00
" 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",
2022-06-26 23:29:56 +02:00
"execution_count": 434,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [],
"source": [
"def loss_mse(ys, y_bar):\n",
2022-06-26 16:38:17 +02:00
" return sum((ys - y_bar)*(ys - y_bar)) / len(ys)"
2022-06-25 10:11:35 +02:00
]
},
{
"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",
2022-06-26 23:29:56 +02:00
"execution_count": 435,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [],
"source": [
2022-06-26 23:29:56 +02:00
"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",
2022-06-25 10:11:35 +02:00
" \n",
2022-06-26 23:29:56 +02:00
" y_bars = eval_polynomial(coeffs, inputs_x, k)\n",
2022-06-26 16:38:17 +02:00
"\n",
2022-06-26 23:29:56 +02:00
" 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",
2022-06-25 10:11:35 +02:00
" \n",
2022-06-26 23:29:56 +02:00
" n = len(y_bars)\n",
2022-06-25 10:11:35 +02:00
" \n",
2022-06-26 23:29:56 +02:00
" for i in range(k+1):\n",
" derivative = (-2 / n) * sum(partial_derivatives[i])\n",
" new_coeffs[i] = coeffs[i] - lr * derivative\n",
" \n",
2022-06-25 10:11:35 +02:00
" \n",
" #update with these new coeffs:\n",
2022-06-26 23:29:56 +02:00
" new_y_bar = eval_polynomial(new_coeffs, inputs_x, k)\n",
2022-06-25 10:11:35 +02:00
" \n",
" updated_model_loss = loss_mse(outputs_y, new_y_bar)\n",
2022-06-26 23:29:56 +02:00
" return updated_model_loss, new_coeffs, new_y_bar"
2022-06-25 10:11:35 +02:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Minimalizacja\n",
"Funkcja powtarza proces wyznaczenia nowych współczynników wielomianu zadaną ilość razy - epoch."
]
},
{
"cell_type": "code",
2022-06-26 23:29:56 +02:00
"execution_count": 436,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [],
"source": [
2022-06-26 23:29:56 +02:00
"def gradient_descent(epochs, lr, k):\n",
2022-06-25 10:11:35 +02:00
" losses = []\n",
" rand_coeffs_to_test = rand_coeffs\n",
" for i in range(epochs):\n",
2022-06-26 23:29:56 +02:00
" loss = calc_gradient_poly_for_GD(rand_coeffs_to_test, hundred_xs, ys, lr, k)\n",
2022-06-25 10:11:35 +02:00
" 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",
2022-06-26 23:29:56 +02:00
"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."
2022-06-25 10:11:35 +02:00
]
},
{
"cell_type": "code",
2022-06-26 23:29:56 +02:00
"execution_count": 437,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [
{
2022-06-26 23:29:56 +02:00
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
2022-06-25 10:11:35 +02:00
}
],
"source": [
2022-06-26 23:29:56 +02:00
"GD = gradient_descent(1500, 0.0001, k)\n",
2022-06-25 10:11:35 +02:00
"\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",
2022-06-26 23:29:56 +02:00
"execution_count": 438,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2022-06-26 23:29:56 +02:00
"Początkowe współczynniki [-8, -1, -3]\n",
"Wyznaczone współczynniki [2.0470388756371727, -5.710817671350023, -1.943138081266058]\n",
2022-06-25 10:11:35 +02:00
"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",
2022-06-26 23:29:56 +02:00
"execution_count": 439,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [
{
"data": {
2022-06-26 23:29:56 +02:00
"image/png": "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
2022-06-25 10:11:35 +02:00
"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": {
2022-06-26 23:29:56 +02:00
"display_name": "Python 3.8.9 64-bit",
2022-06-25 10:11:35 +02:00
"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",
2022-06-26 23:29:56 +02:00
"version": "3.8.9"
2022-06-25 10:11:35 +02:00
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
2022-06-26 23:29:56 +02:00
"hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
2022-06-25 10:11:35 +02:00
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}