Matma_AI_cyber/Projekt_2/fixed/algorytm.ipynb

402 lines
77 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 16:38:17 +02:00
"execution_count": 67,
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 16:38:17 +02:00
"execution_count": 68,
2022-06-25 10:11:35 +02:00
"metadata": {},
2022-06-26 16:38:17 +02:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2\n"
]
}
],
2022-06-25 10:11:35 +02:00
"source": [
"rand_coeffs = (random.randrange(-10, 10), random.randrange(-10, 10), random.randrange(-10,10))\n",
2022-06-26 16:38:17 +02:00
"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)"
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 16:38:17 +02:00
"execution_count": 69,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [],
"source": [
2022-06-26 16:38:17 +02:00
"def eval_2nd_degree(coeffs, x, k):\n",
" a = (coeffs[0]*(x**k))\n",
" b = coeffs[1]*(x**(k-1))\n",
2022-06-25 10:11:35 +02:00
" c = coeffs[2]\n",
2022-06-26 16:38:17 +02:00
"\n",
2022-06-25 10:11:35 +02:00
" y = a+b+c\n",
" return y\n",
2022-06-26 16:38:17 +02:00
"\n",
"#eval_2nd_degree(coeffs, 3, 4)\n",
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 16:38:17 +02:00
"execution_count": 70,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [],
"source": [
"def eval_2nd_degree_jitter(coeffs, x, j):\n",
2022-06-26 16:38:17 +02:00
" y = eval_2nd_degree(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 16:38:17 +02:00
"execution_count": 71,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2022-06-26 16:38:17 +02:00
"[ 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"
2022-06-25 10:11:35 +02:00
]
},
{
"data": {
2022-06-26 16:38:17 +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",
" 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",
2022-06-26 16:38:17 +02:00
"execution_count": 72,
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 16:38:17 +02:00
"execution_count": 73,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [],
"source": [
2022-06-26 16:38:17 +02:00
"def calc_gradient_2nd_poly_for_GD(coeffs, inputs_x, outputs_y, lr, k): \n",
2022-06-25 10:11:35 +02:00
" a_s = []\n",
" b_s = []\n",
" c_s = []\n",
" \n",
2022-06-26 16:38:17 +02:00
" y_bars = eval_2nd_degree(coeffs, inputs_x, k)\n",
2022-06-25 10:11:35 +02:00
"\n",
2022-06-26 16:38:17 +02:00
"\n",
" # tu zamiast 2 dodałem k i w potencial_b k-1, czy tylko to powinno byś zmiaenione?\n",
2022-06-25 10:11:35 +02:00
" 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",
2022-06-26 16:38:17 +02:00
" x_squared = x**k \n",
2022-06-25 10:11:35 +02:00
" partial_a = x_squared * (y - y_bar)\n",
" a_s.append(partial_a)\n",
2022-06-26 16:38:17 +02:00
" partial_b = x**(k-1) * (y-y_bar)\n",
2022-06-25 10:11:35 +02:00
" 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",
2022-06-26 16:38:17 +02:00
" new_y_bar = eval_2nd_degree(new_model_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 16:38:17 +02:00
" return updated_model_loss, new_model_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 16:38:17 +02:00
"execution_count": 74,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [],
"source": [
"def gradient_descent(epochs, lr):\n",
" losses = []\n",
" rand_coeffs_to_test = rand_coeffs\n",
" for i in range(epochs):\n",
2022-06-26 16:38:17 +02:00
" loss = calc_gradient_2nd_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",
"Wartości wyznaczonego wielomionu zostają wyświetlone na wykresie z porównaniem do zbioru danych."
]
},
{
"cell_type": "code",
2022-06-26 16:38:17 +02:00
"execution_count": 75,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [
{
"data": {
2022-06-26 16:38:17 +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": [
"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",
2022-06-26 16:38:17 +02:00
"execution_count": 76,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2022-06-26 16:38:17 +02:00
"Początkowe współczynniki (7, 5, -6)\n",
"Wyznaczone współczynniki (2.1546532016162714, -4.490001059494276, -5.122120484596819)\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 16:38:17 +02:00
"execution_count": 77,
2022-06-25 10:11:35 +02:00
"metadata": {},
"outputs": [
{
"data": {
2022-06-26 16:38:17 +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 16:38:17 +02:00
"display_name": "Python 3.10.4 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 16:38:17 +02:00
"version": "3.10.4"
2022-06-25 10:11:35 +02:00
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
2022-06-26 16:38:17 +02:00
"hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
2022-06-25 10:11:35 +02:00
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}