praca-magisterska/docs/images/plots.ipynb

195 lines
72 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import music21\n",
"from music21.midi import MidiFile\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import mido"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# midi messages"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "<meta message set_tempo tempo=500000 time=0>\n<meta message time_signature numerator=4 denominator=4 clocks_per_click=24 notated_32nd_notes_per_beat=8 time=0>\n<meta message end_of_track time=1>\n<meta message track_name name='Guitar' time=0>\nprogram_change channel=0 program=30 time=0\nnote_on channel=0 note=48 velocity=100 time=0\nnote_on channel=0 note=53 velocity=100 time=0\nnote_on channel=0 note=60 velocity=100 time=0\nnote_on channel=0 note=48 velocity=0 time=220\nnote_on channel=0 note=48 velocity=100 time=0\nnote_on channel=0 note=53 velocity=0 time=0\nnote_on channel=0 note=55 velocity=100 time=0\nnote_on channel=0 note=60 velocity=0 time=0\nnote_on channel=0 note=60 velocity=100 time=0\nnote_on channel=0 note=48 velocity=0 time=220\nnote_on channel=0 note=48 velocity=100 time=0\nnote_on channel=0 note=55 velocity=0 time=0\nnote_on channel=0 note=55 velocity=100 time=0\nnote_on channel=0 note=60 velocity=0 time=0\nnote_on channel=0 note=60 velocity=100 time=0\nnote_on channel=0 note=48 velocity=0 time=440\nnote_on channel=0 note=55 velocity=0 time=0\nnote_on channel=0 note=60 velocity=0 time=0\nnote_on channel=0 note=48 velocity=0 time=110\nnote_on channel=0 note=48 velocity=100 time=0\nnote_on channel=0 note=45 velocity=100 time=770\nnote_on channel=0 note=50 velocity=100 time=0\nnote_on channel=0 note=57 velocity=100 time=0\nnote_on channel=0 note=45 velocity=0 time=220\nnote_on channel=0 note=46 velocity=100 time=0\nnote_on channel=0 note=50 velocity=0 time=0\nnote_on channel=0 note=53 velocity=100 time=0\nnote_on channel=0 note=57 velocity=0 time=0\nnote_on channel=0 note=58 velocity=100 time=0\nnote_on channel=0 note=46 velocity=0 time=220\nnote_on channel=0 note=46 velocity=100 time=0\nnote_on channel=0 note=53 velocity=0 time=0\nnote_on channel=0 note=53 velocity=100 time=0\nnote_on channel=0 note=58 velocity=0 time=0\nnote_on channel=0 note=58 velocity=100 time=0\nnote_on channel=0 note=46 velocity=0 time=220\nnote_on channel=0 note=46 velocity=100 time=0\nnote_on channel=0 note=53 velocity=0 time=0\nnote_on channel=0 note=53 velocity=100 time=0\nnote_on channel=0 note=58 velocity=0 time=0\nnote_on channel=0 note=58 velocity=100 time=0\nnote_on channel=0 note=46 velocity=0 time=440\nnote_on channel=0 note=48 velocity=100 time=0\nnote_on channel=0 note=53 velocity=0 time=0\nnote_on channel=0 note=53 velocity=100 time=0\nnote_on channel=0 note=58 velocity=0 time=0\nnote_on channel=0 note=60 velocity=100 time=0\nnote_on channel=0 note=48 velocity=0 time=440\nnote_on channel=0 note=48 velocity=100 time=0\nnote_on channel=0 note=53 velocity=0 time=0\nnote_on channel=0 note=53 velocity=100 time=0\nnote_on channel=0 note=60 velocity=0 time=0\nnote_on channel=0 note=60 velocity=100 time=0\nnote_on channel=0 note=48 velocity=0 time=220\nnote_on channel=0 note=48 velocity=100 time=0\nnote_on channel=0 note=53 velocity=0 time=0\nnote_on channel=0 note=60 velocity=0 time=0\nnote_on channel=0 note=48 velocity=0 time=220\nnote_on channel=0 note=51 velocity=100 time=0\nnote_on channel=0 note=48 velocity=100 time=220\nnote_on channel=0 note=51 velocity=0 time=0\nnote_on channel=0 note=48 velocity=0 time=220\nnote_on channel=0 note=60 velocity=100 time=0\nnote_on channel=0 note=51 velocity=100 time=220\nnote_on channel=0 note=60 velocity=0 time=0\nnote_on channel=0 note=51 velocity=0 time=220\nnote_on channel=0 note=51 velocity=100 time=0\nnote_on channel=0 note=51 velocity=0 time=220\nnote_on channel=0 note=53 velocity=100 time=0\nnote_on channel=0 note=46 velocity=100 time=440\nnote_on channel=0 note=53 velocity=0 time=0\nnote_on channel=0 note=53 velocity=100 time=0\nnote_on channel=0 note=58 velocity=100 time=0\nnote_on channel=0 note=46 velocity=0 time=990\nnote_on channel=0 note=53 velocity=0 time=0\nnote_on channel=0 note=58 velocity=0 time=0\nnote_on channel=0 note=46 velocity=100 time=110\nnote_on channel=0 note=53 velocity=100 time=0\nnote_on channel=0 note=58 velocity=100 time=0\nnote_on channel=0 note=46 velocity=0 time=220\nnote_on channel=0 note=46 velocity=100 time=0\nnote_on channel=0 note=53 velocity=0 time=0\nnote_on channel=0 note=53 velocity=100 time=0\nnote_on channel=0 note=58 velocity=0 time=0\nnote_on channel=0 note=58 velocity=100 time=0\nnote_on channel=0 note=41 velocity=100 time=220\nnote_on channel=0 note=46 velocity=0 time=0\nnote_on channel=0 note=48 velocity=100 time=0\nnote_on channel=0 note=53 velocity=0 time=0\nnote_on channel=0 note=53 velocity=100 time=0\nnote_on channel=0 note=57 velocity=100 time=0\nnote_on channel=0 note=58 velocity=0 time=0\nnote_on channel=0 note=41 velocity=0 time=220\nnote_on channel=0 note=48 velocity=0 time=0\nnote_on channel=0 note=53 velocity=0 time=0\nnote_on channel=0 note=57 velocity=0 time=0\n<meta message end_of_track time=1>\n<meta message track_name name='Melody' time=0>\nprogram_change channel=1 program=1 time=0\nnote_on channel=1 note=60 velocity=100 time=0\nnote_on channel=1 note=60 velocity=0 time=220\nnote_on channel=1 note=62 velocity=100 time=0\nnote_on channel=1 note=62 velocity=0 time=220\nnote_on channel=1 note=63 velocity=100 time=0\nnote_on channel=1 note=63 velocity=0 time=220\nnote_on channel=1 note=62 velocity=100 time=220\nnote_on channel=1 note=62 velocity=0 time=220\nnote_on channel=1 note=75 velocity=100 time=0\nnote_on channel=1 note=58 velocity=100 time=220\nnote_on channel=1 note=75 velocity=0 time=0\nnote_on channel=1 note=75 velocity=100 time=0\nnote_on channel=1 note=58 velocity=0 time=220\nnote_on channel=1 note=75 velocity=0 time=0\nnote_on channel=1 note=75 velocity=100 time=0\nnote_on channel=1 note=75 velocity=0 time=220\nnote_on channel=1 note=75 velocity=100 time=0\nnote_on channel=1 note=75 velocity=0 time=220\nnote_on channel=1 note=72 velocity=100 time=220\nnote_on channel=1 note=72 velocity=0 time=220\nnote_on channel=1 note=75 velocity=100 time=440\nnote_on channel=1 note=75 velocity=0 time=220\nnote_on channel=1 note=72 velocity=100 time=220\nnote_on channel=1 note=72 velocity=0 time=220\nnote_on channel=1 note=75 velocity=100 time=0\nnote_on channel=1 note=75 velocity=0 time=220\nnote_on channel=1 note=72 velocity=100 time=220\nnote_on channel=1 note=72 velocity=0 time=220\nnote_on channel=1 note=75 velocity=100 time=440\nnote_on channel=1 note=75 velocity=0 time=220\nnote_on channel=1 note=72 velocity=100 time=220\nnote_on channel=1 note=72 velocity=0 time=220\nnote_on channel=1 note=70 velocity=100 time=220\nnote_on channel=1 note=70 velocity=0 time=220\nnote_on channel=1 note=70 velocity=100 time=0\nnote_on channel=1 note=70 velocity=0 time=220\nnote_on channel=1 note=70 velocity=100 time=0\nnote_on channel=1 note=70 velocity=0 time=220\nnote_on channel=1 note=70 velocity=100 time=0\nnote_on channel=1 note=70 velocity=0 time=440\nnote_on channel=1 note=71 velocity=100 time=0\nnote_on channel=1 note=71 velocity=0 time=440\n<meta message end_of_track time=1>\n<meta message track_name name='Bass' time=0>\nprogram_change channel=2 program=35 time=0\nnote_on channel=2 note=22 velocity=100 time=0\nnote_on channel=2 note=22 velocity=0 time=220\nnote_on channel=2 note=22 velocity=100 time=0\nnote_on channel=2 note=22 velocity=0 time=220\nnote_on channel=2 note=22 velocity=100 time=0\nnote_on channel=2 note=22 velocity=0 time=220\nnote_on channel=2 note=22 velocity=100 time=0\nnote_on channel=2 note=22 velocity=0 time=220\nnote_on channel=2 note=22 velocity=100 time=0\nnote_on channel=2 note=22 velocity=0 time=220\nnote_on channel=2 note=22 velocity=100 time=0\nnote_on channel=2 note=22 velocity=0 time=220\nnote_on channel=2 note=22 velocity=100 time=0\nnote_on channel=2 note=22 velocity=0 time=220\nnote_on channel=2 note=29 velocity=100 time=0\nnote_on channel=2 note=29 velocity=0 time=220\nnote_on channel=2 note=29 velocity=100 time=0\nnote_on channel=2 note=29 velocity=0 time=220\nnote_on channel=2 note=29 velocity=100 time=0\nnote_on channel=2 note=29 velocity=0 time=220\nnote_on channel=2 note=29 velocity=100 time=0\nnote_on channel=2 note=29 velocity=0 time=220\nnote_on channel=2 note=29 velocity=100 time=0\nnote_on channel=2 note=29 velocity=0 time=220\nnote_on channel=2 note=29 velocity=100 time=0\nnote_on channel=2 note=29 velocity=0 time=220\nnote_on channel=2 note=29 velocity=100 time=0\nnote_on channel=2 note=29 velocity=0 time=220\nnote_on channel=2 note=29 velocity=100 time=0\nnote_on channel=2 note=29 velocity=0 time=220\nnote_on channel=2 note=29 velocity=100 time=0\nnote_on channel=2 note=29 velocity=0 time=220\nnote_on channel=2 note=31 velocity=100 time=0\nnote_on channel=2 note=31 velocity=0 time=220\nnote_on channel=2 note=31 velocity=100 time=0\nnote_on channel=2 note=31 velocity=0 time=220\nnote_on channel=2 note=32 velocity=100 time=220\nnote_on channel=2 note=32 velocity=0 time=220\nnote_on channel=2 note=32 velocity=100 time=0\nnote_on channel=2 note=32 velocity=0 time=220\nnote_on channel=2 note=34 velocity=100 time=220\nnote_on channel=2 note=34 velocity=0 time=220\nnote_on channel=2 note=34 velocity=100 time=0\nnote_on channel=2 note=24 velocity=100 time=220\nnote_on channel=2 note=34 velocity=0 time=0\nnote_on channel=2 note=24 velocity=0 time=220\nnote_on channel=2 note=24 velocity=100 time=0\nnote_on channel=2 note=24 velocity=0 time=220\nnote_on channel=2 note=24 velocity=100 time=0\nnote_on channel=2 note=24 velocity=0 time=220\nnote_on channel=2 note=24 velocity=100 time=0\nnote_on channel=2 note=24 velocity=0 time=220\nnote_on channel=2 note=24 velocity=100 time=0\nnote_on channel=2 note=24 velocity=0 time=220\nnote_on channel=2 note=24 velocity=100 time=0\nnote_on channel=2 note=24 velocity=0 time=220\nnote_on channel=2 note=24 velocity=100 time=0\nnote_on channel=2 note=24 velocity=0 time=220\nnote_on channel=2 note=24 velocity=100 time=0\nnote_on channel=2 note=24 velocity=0 time=220\n<meta message end_of_track time=1>\n<meta message track_name name='Drums' time=0>\nprogram_change channel=9 program=1 time=0\nnote_on channel=9 note=36 velocity=100 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=36 velocity=100 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=36 velocity=100 time=0\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=110\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=49 velocity=100 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=36 velocity=100 time=0\nnote_on channel=9 note=49 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=36 velocity=100 time=0\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=0 time=110\nnote_on channel=9 note=36 velocity=100 time=0\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=0 time=110\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=110\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=49 velocity=100 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=36 velocity=100 time=0\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=49 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=36 velocity=100 time=0\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\nnote_on channel=9 note=38 velocity=100 time=0\nnote_on channel=9 note=36 velocity=100 time=220\nnote_on channel=9 note=38 velocity=0 time=0\nnote_on channel=9 note=36 velocity=0 time=220\n<meta message end_of_track time=1>\n"
}
],
"source": [
"filepath = '/home/altarin/praca-magisterska/docs/images/seq2seq_generated_midi_7.mid'\n",
"mid = mido.MidiFile(filepath)\n",
"for i, track in enumerate(mid.tracks):\n",
" for msg in track:\n",
" print(msg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Regresja liniowa"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "[<matplotlib.lines.Line2D at 0x7fe0d90a1580>]"
},
"metadata": {},
"execution_count": 7
},
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {
"image/png": {
"width": 362,
"height": 248
},
"needs_background": "light"
}
}
],
"source": [
"x = np.arange(0,10)\n",
"y = np.arange(0,10) + np.random.random(10)-0.5\n",
"y_hat = np.arange(0,10)\n",
"plt.scatter(x, y, c='k')\n",
"plt.plot(x,y_hat, c='r')\n",
"# plt.labels\n",
"# plt.savefig('linear_reg.png')"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"# Gradient descent\n",
"\n",
"fx = x^2\n",
"dx = 2x + c\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "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zj1XOvXUwHjXLmn6dEnSzTffrJo1a0qSNmzYoLfffttRgYgGTz/9tHbt2iVJ+s1vfqNLL73UcUUAUBjhHwBKw5hfbfglSVWrVtUdd9zhHf773/+unJycSFeHKLBnzx79+9//9ub33nuvUlJSHFYEAL9G+AeA0vKH//HjpdxcSdKtt96qtLQ0SdK6des0evRoF9XBseeee047duyQJNWvX1+XX36544oA4NcI/wBQWh06SLVrB8Zbtkhz5kiSqlWrpttvv9077aGHHlJu8BcDJIa9e/dq5MiR3vzee+9VuXLlHFYEAMUj/ANAaSUnSwMHFsyDq/5I0vDhw1W9enVJ0urVq/Xuu+9Gujo49Oyzz2rbtm2SpNNOO01XXnml44oAoHiEfwA4FpmZBeMPP5SslSSlpaXptttu85564IEHWPknQezevVuPPPKIN7/nnnuUmprqsCIAKBnhHwCORdeuUrC/X999Jy1e7D11++23q0aNGpKk9evXa9SoUQ4KRKT9+9//1s6dOyVJZ5xxhq6++mrHFQFAyQj/AHAsUlOl/v0L5r7Wn+rVq+tPf/qTN3/wwQd18ODBSFaHCNu2bVuhFX7+8pe/0OsPIKoR/gHgWBWz22++3//+96pTp44k6YcfftALL7wQycoQYY888oj27t0rSWrSpAnr+gOIeoR/ADhWF1wgVaoUGK9aFfgIqly5su69915v/o9//MMLh4gvP/30k5555hlv/uCDD7KbL4CoR/gHgGNVqZLUp0/BvMjV/xtuuEGnBncD3rp1q5544olIVocIeeihh7y2rlatWmnQoEGOKwKAoyP8A8DxOELrT/ny5XX//fd780cffVS//PJLpCpDBKxevVovvfSSN3/ooYdkjHFYEQCUDuEfAI5H375S/o2dixZJGzcWevq3v/2tGjduLEnas2eP/va3v0W4QITT3Xff7W3k1rVrV/Xu3dtxRQBQOoR/ADge1atLvXoVzMeNK/R0SkpKobXfX3zxRa1ZsyZS1SGMZs2apXG+/94jR47kqj+AmEH4B4DjdYTWH0nq16+funTpIknKycnR3XffHanKECbWWt11113e/LLLLlOrVq0cVgQAx4bwDwDHa8AAKSn4bXT2bOnnnws9bYzRyJEjvfmHH36o2bNnR7JChNjYsWM1d+5cSVJqaqr+/ve/O64IAI4N4R8AjletWlLnzoGxtdKECb86pXXr1oXWfr/zzjtlrY1UhQih7OzsQn+9ufXWW3X66ae7KwgAjgPhHwDK4iitP1Jgrf/U1FRJ0ty5c/XOO+9EojKE2JNPPql169ZJkmrUqFFoPwcAiBWEfwAoi4EDC8bTpkk7d/7qlNNPP1233XabN//jH//Ixl8xZvPmzYVWbHrggQdUo0YNhxUBwPEh/ANAWaSnS23bBsY5OdLEicWedt999+mkk06SFNgZ9h//+EekKkQI3H333d4vbE2aNNHNN9/suCIAOD6EfwAoq1K0/lStWrXQ0p+PPfaYvv3223BXhhCYN2+eXn/9dW/+5JNPqlz+Hg8AEGMI/wBQVv7w/9//SiW09FxxxRU677zzJAVuHh0xYkQkqkMZ5OXlafjw4d584MCB6tmzp8OKAKBsCP8AUFZnnik1axYYHzwoTZ5c7GlJSUl66qmnvPmECRP06aefRqJCHKf//Oc/mj9/viSpfPnyeuyxxxxXBABlQ/gHgFAoReuPJLVt21ZXX321N7/lllt04MCBcFaG47R169ZCG3qNGDFCDRo0cFgRAJQd4R8AQsEf/j/+WDp0qMRTH374YW+lmA0bNuihhx4Kd3U4DnfddZd27NghKbBiE0t7AogHhH8ACIVmzaQzzgiM9+yRPv+8xFNr166tRx991Jv/61//0sqVK8NdIY7B9OnTC93k++yzz6pSpUoOKwKA0CD8A0AoGFPq1h9Juuaaa9SxY0dJ0uHDh3XTTTcpLy8vnBWilA4dOqSbbrrJm2dmZuqiiy5yWBEAhA7hHwBCxR/+x48PrPtfgqSkJL3wwgtKSUmRJM2cOVOjRo0Kd4UohUcffVSrV6+WFFii9cknn3RcEQCEDuEfAEKlbVupXr3AePt2aebMI55+9tlnF1ruc8SIEfrxxx/DWSGOYvny5XrwwQe9+UMPPaSTTz7ZYUUAEFqEfwAIlaQkadCggvlRWn8k6f7779cZwXsFdu/erRtvvFHW2nBViCPIycnR1VdfrcOHD0sKrMx0yy23OK4KAEKL8A8AoZSZWTAeN046Sh9/pUqV9Nprr3nzTz75RG+99Va4qsMRjBw5Ul9//bUkKTU1VaNGjVJycrLjqgAgtAj/ABBKnTpJJ5wQGP/4o7RgwVFf0rlzZ916663efPjw4dq8eXO4KkQxVq5cqQceeMCb//Wvf1WTJk0cVgQA4UH4B4BQSkmRMjIK5qVo/ZGkf/7zn94GUrt27aL9J4Ly232ys7MlSa1bt9add97puCoACA/CPwCEWtElP0sR4itXrqxXX33Vm0+cOFEvv/xyOKpDEQ899JDmz58vqaDdJ38VJgCIN4R/AAi1Hj2kqlUD43XrpOXLS/Wyrl27Fmr/ue222/TNN9+Eo0IEzZ49u9DqPn/961919tlnO6wIAMKL8A8AoVahgtS3b8F87NhSv/SRRx5R06ZNJUkHDhzQ5Zdf7rWjILR2796tK664wttcrUuXLrrrrrscVwUA4UX4B4BwOIbdfv0qVqyod955R6mpqZKkRYsW6b777gt1dZB0yy23aOPGjZKktLQ0vfnmm6zuAyDuEf4BIBz69An8BUCSli2T1q4t9UvPOeccPfLII978X//6l6ZMmRLqChPaG2+8obffftubv/TSS0pPT3dYEQBEBuEfAMKhShWpd++C+bhxx/Ty4cOH64ILLvDml112mb7//vtQVZfQli1bpptuusmbDxs2TBdffLHDigAgcgj/ABAux9n6I0lJSUl6/fXXVbduXUnS9u3bdfHFF9P/X0ZZWVnKzMzUgQMHJEmNGjXSU0895bgqAIgcwj8AhEu/foF1/yVp3jzphx+O6eUnnXSSxowZ4/Whz5s3j/Xny8Baq2uuuUZrgy1YlStX1tixY1U1f2UmAEgAhH8ACJeaNaVu3Qrm48cf81t06tRJDz/8sDd/+umn9e6774aiuoTz+OOPa6xv5aWXX36ZXXwBJBzCPwCEUxlaf/KNGDFCg33vc80112jBggVlrSyhfPrpp4WW8bzlllt06aWXOqwIANwg/ANAOGVkSMYExjNmSNu2HfNbGGP02muvqWHDhpKkgwcPKiMjQz8cYxtRolqxYoUuueQSbz3/du3a6bHHHnNcFQC4QfgHgHCqW1fq0CEwzsuTJkw4rrepXr26Pv74Y9WoUUOStHnzZmVkZGjfvn2hqjQubd26Vf3799eePXskSenp6Ro3bpzKly/vuDIAcIPwDwDhFoLWH0k688wzNXbsWKUEbyJetGiRrrrqKuXm5pa1wrh08OBBDR48WBs2bJAUuMF34sSJOumkkxxXBgDuEP4BINwGDSoYf/aZtHv3cb9Vt27d9Mwzz3jzDz/8UL///e9lrS1LhXEnJydHl156qWbNmiUp0Dr1zjvvqHnz5o4rAwC3CP8AEG7160vnnhsYZ2dLkyaV6e1uvPFG3X777d78hRde0F/+8pcyvWc8sdbqpptu0njf6kqPPvqoBgwY4LAqAIgOhH8AiIQQtf7kGzlypC677DJv/re//U1PP/10md83Htxzzz169dVXvfmIESM0YsQIhxUBQPQg/ANAJPjD/6RJUnCH2eOVlJSkUaNG6cILL/SODR8+XKNGjSrT+8a6f/7zn4X2Rbjqqqv06KOPyuSvuAQACY7wDwCR0Lix1KhRYLx/vzRlSpnfMjU1VR988IHatWvnHbv22mv1yiuvlPm9Y9GDDz6oe+65x5v369dPr7zyipKS+FEHAPn4jggAkRLi1h8psILNJ598opYtW0oK9Ltff/31evHFF0Py/rHir3/9q+6//35v3r17d40ZM0blypVzWBUARB/CPwBEij/8f/RR4ObfEKhZs6Y+TbK/cQAAGgtJREFU++wztWrVyjt200036cknnwzJ+0cza63uueeeQjc89+rVSxMnTlSlSpXcFQYAUYrwDwCRcu650qmnBsa7dknTp4fsrWvWrKmpU6eqTZs23rHbbrtNd911l7ezbbzJzs7WsGHD9M9//tM71rt3b02YMIHgDwAlIPwDQKQYE5bWn3w1atTQlClT1L59e+/YyJEjdfnll+vQoUMh/VyuZWVlqV+/fnrjjTe8Y/369dP48eNVsWJFh5UBQHQj/ANAJGVmFozHj5dCvDtvWlqaPvvsM2VkZHjHRo8erV69emnLli0h/VyurF+/Xp06ddLUqVO9Y9dff73GjRunChUqOKwMAKIf4R8AIql9e6lOncB4yxZpzpyQf4pKlSpp7Nixuvnmm71jM2fO1Lnnnquvvvoq5J8vkiZNmqRWrVpp6dKl3rEHH3xQL774olJSUhxWBgCxgfAPAJGUnCwNHFgwD3HrT8GnSdYzzzxTaI37n376SV26dNHTTz8ta21YPm+45Obm6oEHHlDfvn21a9cuSYGlTkeNGqX77vv/7d15lFXlme/x74PIoOIArcGgsRQRjAMdjOGqMYB4wSgoSsfEdeNAOuvGG43GTrymk2416Xa1ayV2Rzt2m5t0ZEU7nRgN4IBiO6CgtiSQtGYBEQdMxBmRyKAl1Hv/2BvqUKmRqjr77FPfz1pn7eGcXfXUy8uuX53z7nf/jfP4S1InGf4lqdpajvvvpSAeEVx++eXce++9DB06FIAtW7ZwySWXMG3aNF5++eVe+b49bdWqVUyYMIFvfetb2/cdeOCBLFq0iAsuuKC4wiSphAz/klRtEyfC3ntn6y++CL/+da9+u6lTp7J06dIdpgKdP38+RxxxBLfeemvNfgrQ1NTEDTfcwNixY3nssce27588eTJLly7lYx/7WIHVSVI5Gf4lqdoGDIDp05u3e2noT6WGhgYWL17MJZdcsn3f22+/zbnnnsspp5zC8uXLe72GrliyZAkf//jHufTSS9m8eTMA/fv35+qrr2bBggXsu+++BVcoSeVU6vAfEQdExI8i4uWIeC8iVkfEdyNin6Jrk6R2VQ79ueOOqnzLQYMGcf3117Nw4UIOPvjg7fvvv/9+jj76aC6++GLWrl1blVrasmbNGs477zzGjx/PExUXQx955JE8+eSTXHXVVeyyyy4FVihJ5Vba8B8RI4GlwCxgCfBPwPPApcATETGswPIkqX1TpsC2G1GtXAkrVlTtW0+YMIGnnnqKL37xi/Trl/0a2Lp1KzfeeCMNDQ189atfZc2aNVWrB+DZZ5/lwgsvZOTIkdxyyy3b9++66658/etf51e/+hXjxo2rak2SVI9KG/6BfwH2Ay5JKc1IKX0tpXQS2R8Bo4FrCq1Oktqz225w6qnN21UY+lNpjz324MYbb2TZsmVMmjRp+/4NGzZw3XXXcfDBB/O5z32OxYsX99o1AVu3buX+++/n7LPPZvTo0Xz/+9/f4WZkM2bMYPny5VxzzTUMHDiwV2qQpL6mlOE/Ig4BpgCrgRtbPH0VsBE4NyJ2r3JpktR5vXi3384aO3YsDz74IHPmzOHDH/7w9v3vv/8+N998MyeeeCIjR47kyiuvZMmSJWzt5k3JGhsbWbx4MZdffjkf+tCHmDp1Kj//+c9pamra/ppjjz12e02HHnpot76fJGlHUauzPLQnIj4P/AD4fymlL7Ty/AKyPw5OTik9uJPfY+m4cePGLV26tHvFSlJb/vhH2HdfaGzMtl94ARoaCiunqamJe+65h2uvvbbNm4HttddeTJgwgfHjxzNmzBjGjBlDQ0MDgwcP3mGu/ZQSGzdu5Pnnn2flypWsWLGCJ554gkWLFrFp06ZWv/bUqVO54oormDhxovP2S+ozjjnmGJYtW7YspXRMx6/uvrLeDnF0vnymjedXkYX/w4CdCv+S1Ov23BNOPhnmz8+258yByy4rrJx+/foxffp0pk+fzhNPPMHs2bO57bbbtt9UC2D9+vXceeed3HnnnTsc279/f4YMGcLgwYPZuHEjGzZs6NSnBPvttx/nnHMOs2bNYuzYsT3+M0mSdlTW8L9XvlzfxvPb9u/d0ReKiLbe2h/T1aIkqcvOOqs5/P/iF4WG/0rHHXccxx13HNdffz333HMPc+fO5aGHHmrzxmBbtmxh3bp1rFu3rsOvfcghhzBp0iTOOusspkyZQv/+Zf1VJEnlU69n3G2fF5dvTJOkvuX006FfP2hqgsceg1dfheHDi65qu0GDBjFz5kxmzpxJSolnnnmGRx55hOXLl7Ny5UpWrlzJK6+8QuO2oUsVBg4cyIgRIzj88MMZM2YMRx55JBMnTqShwKFNktTXlTX8b3tnf682nt+zxeva1Nb4qvwTAeeVk9S79t0XPvEJWLgQUoK5c+HCC4uuqlURwejRoxk9evSfPNfY2Mg777zDpk2b2H333RkyZAi77rprAVVKktpTytl+gN/ly8PaeH5UvmzrmgBJqh01MOtPdw0YMIBhw4Zx4IEHMnToUIO/JNWosob/h/PllIjY4WeIiCHACcBm4L+qXZgkddmZZzavP/wwvPVWcbVIkupaKcN/Suk54H6gAbioxdPfBHYHfpxS2ljl0iSp6w44AMaPz9a3bIG77y62HklS3Spl+M99EXgduCEi5kbEP0TEQ8BlZMN9vlFodZLUFXUw9EeSVPtKG/7zd/8/CswGxgNfAUYCNwDHpZTWFledJHVR5dCfBQtgw4biapEk1a3Shn+AlNIfUkqzUkr7p5QGpJQOSildmlJywKykchk1Co46Klt/9124775i65Ek1aVSh39JqisO/ZEk9TLDvyTVisrwf/fd8N57xdUiSapLhn9JqhVHHQUjR2br77wDDzxQbD2SpLpj+JekWhHh0B9JUq8y/EtSLZk5s3l93rxs3n9JknqI4V+Sasmxx8KIEdn62rWwaFGx9UiS6orhX5JqSb9+O87579AfSVIPMvxLUq2pHPc/Zw40NRVXiySprhj+JanWnHgiDBuWra9ZA7/8ZbH1SJLqhuFfkmpN//5wxhnN2w79kST1EMO/JNWiyqE/d9wBKRVXiySpbhj+JakWTZ4MQ4Zk6889B08/XWw9kqS6YPiXpFo0aBCcdlrztkN/JEk9wPAvSbWq8oZfhn9JUg8w/EtSrTrllOwTAMiG/axaVWw9kqTSM/xLUq3aYw+YOrV5e86c4mqRJNUFw78k1bLKWX8c+iNJ6ibDvyTVsmnTsnn/AZ58El56qdh6JEmlZviXpFo2dChMmtS8PXducbVIkkrP8C9Jta7lDb8kSdpJhn9JqnUzZkBEtv7oo/DGG8XWI0kqLcO/JNW64cPhhBOy9aYmuPPOYuuRJJWW4V+SysBZfyRJPcDwL0llcOaZzesPPADr1xdXiySptAz/klQGDQ0wbly23tgI8+cXWo4kqZwM/5JUFg79kSR1k+FfksqiMvzPnw+bNxdXiySplAz/klQWhx8OY8Zk65s2wYIFxdYjSSodw78klYlDfyRJ3WD4l6QymTmzef2uu7KLfyVJ6iTDvySVyUc+AgcdlK2//TYsXFhoOZKkcjH8S1KZRDj0R5K00wz/klQ2leF/7lzYurW4WiRJpWL4l6SyOe44+MAHsvXXXoMnnii2HklSaRj+JalsdtkFZsxo3nbojySpkwz/klRGLcf9p1RcLZKk0jD8S1IZTZwIe++drb/4IixbVmg5kqRyMPxLUhkNGADTpzdvO/RHktQJhn9JKqvKG34Z/iVJnWD4l6SymjIFdtstW1+5ElasKLYeSVLNM/xLUlkNHgynntq87bv/kqQOGP4lqcy8268kqQsM/5JUZqedll38C9mMP6tXF1qOJKm2Gf4lqcz23BNOPrl5e86c4mqRJNU8w78klV3l0J877iiuDklSzTP8S1LZnX469MtP548/Dq+8Umw9kqSaZfiXpLLbd1+YMCFbTwnmzSu2HklSzTL8S1I9cNYfSVInGP4lqR7MmNG8/vDD8NZbxdUiSapZhn9JqgcHHADjx2frW7bA3XcXW48kqSYZ/iWpXjj0R5LUAcO/JNWLM89sXl+wADZsKK4WSVJNMvxLUr0YNQqOOipbf/dduO++YuuRJNUcw78k1RNv+CVJaofhX5LqycyZzet33519AiBJUs7wL0n15Mgj4dBDs/UNG+DBB4utR5JUUwz/klRPIpz1R5LUJsO/JNWbyvA/b142778kSRj+Jan+HHssjBiRra9dC4sWFVuPJKlmGP4lqd7067fjnP8O/ZEk5Qz/klSPKof+zJkDTU3F1SJJqhmGf0mqRyeeCMOGZetr1sCSJcXWI0mqCYZ/SapH/fvDGWc0bzv0R5KE4V+S6lflDb9+8QtIqbhaJEk1wfAvSfVq8mQYMiRbf+45ePrpYuuRJBXO8C9J9WrgQJg2rXnboT+S1OcZ/iWpnnm3X0lSBcO/JNWzU06BQYOy9aefhlWriq1HklQow78k1bM99oCpU5u358wprhZJUuEM/5JU7xz6I0nKGf4lqd5Nn57N+w/w5JPw0kvF1iNJKozhX5Lq3T77wEknNW879EeS+qzCw39EjIqIKyLioYj4Q0Q0RsRrETEvIiZ1cOz5EbEkIjZExPqIWBgR09o7RpL6JIf+SJKogfAP/B1wLfABYD5wHfAYcBrwUERc0tpBEfEdYDawP/AD4FbgKOCuiLi498uWpBI54wyIyNYffRTeeKPYeiRJhaiF8H8fMC6ldERK6Qsppb9OKZ0FTAbeB74dEftXHhARxwNfAZ4Djk4pXZZSugg4BngL+E5ENFTzh5CkmjZ8OJxwQrbe1AR33llsPZKkQhQe/lNKs1NKv25l/yPAQmAAcHyLpy/Ml9eklNZVHLMauBEYCMzqjXolqbQc+iNJfV7h4b8D7+fLLS32b7ty7b5Wjrm3xWskSQBnntm8/sADsH59cbVIkgpRs+E/Ig4iG/qzCXi0Yv/uwAhgQ0rplVYO3Xb7ysN6vUhJKpOGBhg3LltvbIT58wstR5JUfZFSKrqGPxERA4EHgROA/5tS+nbFcx8E1gBrUkoHtHLsrkAj0JhSGtiJ77W0jafGDh48eJfDDz98Z34ESapNr74KL7+cre+9NxxySLH1SFIft2LFCjZv3vxWSmlYNb5fj4T/iFgNHNSFQ/49pfTZNr7WLsB/AJ8CfgackyqK7EL4fy+lNKgTtbcV/j8CNAH/3dHXUIfG5MuVhVZRP2zPnmV79hzbsmfZnj3L9uxZtmfPGQts7cyb1j2hfw99neeAd7vw+pdb25kH/1vJgv9twGfTn/51sm2Q6l5tfO29WryuXSmlY9qoZWl7z6vzbMueZXv2LNuz59iWPcv27Fm2Z8+yPXtOO29E94oeCf8ppcnd/RoR0R/4CVnw/wlwXkppayvfa2NErAFGRMT+rYz7H5Uvn+luTZIkSVI9qYkLfiNiAHA7WfD/MXBua8G/wkP58pRWnvtki9dIkiRJogbCf35x7xzgDODfgFkppaYODrspX34jIvap+FoNwEXAe8DNPV6sJEmSVGI9Nea/O24CTgXeJLuQ98rYdgv6ZgtTSgu3baSUHo+IfwT+CngqIm4nuxnYp4GhwJfyG35JkiRJytVC+D84X/4ZcGU7r1tYuZFS+kpEPAVcDPxvspl5lgHfTind3Qt1SpIkSaVWk/P8S5IkSep5hY/5lyRJklQdhn9JkiSpjzD8S5IkSX2E4V+SJEnqIwz/kiRJUh9h+JckSZL6CMO/JEmS1EcY/itExKiIuCIiHoqIP0REY0S8FhHzImJSB8eeHxFLImJDRKyPiIURMa1atdeaiNg1Ii6NiJsj4jd5W6aI+Hw7x1yQv6atx4XV/Blqyc60Z8Wx9s1OioiGDvrgT4uusRZFxAER8aOIeDki3ouI1RHx3YjYp+jayiZvu7b636tF11eLIuIvIuKfI2JRRPwxb6tbOzjm+IiYHxFvRcSmiHgqIr4cEbtUq+5a1ZX29JzZvogYFhGfj4g5EfFsRGzOfw8vjoi/jIhWc3hv989auMNvLfk74NPAcmA+8BYwGjgdOD0iLk0p3dDyoIj4DvAV4CXgB8AA4DPAXRHxpZTS96pUfy3ZHfhuvv4a8CpwYCePnQf8ppX9v+qBuspqp9rTvrnT/huY28r+31a7kFoXESOBx4H9yP7vrgQ+BlwKnBIRJ6SU1hZYYhmtp/n/e6UN1S6kJP4GGEvWPi8BY9p7cUScAdwBvAv8jOx3/XTgn4ATgE/1ZrEl0KX2zHnObN2ngH8FXgEeBn4PfAA4C/gh8MmI+FSquONuVfpnSslH/gAuAD7Syv4JQCPwHrB/i+eOBxLwLLBPxf4GYG3+j9dQ9M9WQFsOAD65rb2Aq/N2+nwH7Z+AC4quv9YeO9me9s2ut3ND3mazi66lLA9gQd5mX2qx/x/z/TcVXWOZHsBqYHXRdZTpAUwCRgEBTMz73a1tvHZP4PX89/lHK/YPIvsjNgGfKfpnKlF7es5svy1PIgvu/VrsH072h0ACZlbsr0r/dNhPhZTS7JTSr1vZ/wiwkCyAHd/i6W1DUa5JKa2rOGY1cCMwEJjVG/XWspRSY0rp3pTSK0XXUg92sj3tm+pVEXEIMIUssN7Y4umrgI3AuRGxe5VLUx+SUno4pbQq5SmpA38B7Av8NKW0/dPklNK7ZO94A/yfXiizNLrYnmpHSumhlNJdKaWmFvtfBW7KNydWPFWV/mn477z38+WWFvtPypf3tXLMvS1eo87583xs29ci4tyIOKDogkrKvrnzPhgRX4iIr+fLo4suqEZt6z/3t/LL7R3gMWA34H9Uu7CSGxgRn83736URMcmx6D2mvfPio8Am4PiIGFi9kuqC58yuay1XVqV/Oua/EyLiIGAyWaM/WrF/d2AEsKGNd2RX5cvDer3I+nJpi+2tEfFD4Mv5X7/qgH2z2/5n/tguIhYC56eUfl9IRbVpdL58po3nV5F9MnAY8GBVKqoPw4FbWux7ISJm5Z9Ea+e12WdTSlsi4gXgCOAQYEU1Cys5z5ldEBH9gfPyzcqgX5X+6Tv/Hcj/uvp3siESV1cOnwD2ypfr2zh82/69e6m8evMC8CWyzr878EHgbLIhBV8AflRYZeVj39w5m8gu/D8G2Cd/TCC7UGsi8KBDWHZgP+t5N5O92TSc7Dx4FPB9srHV90bE2OJKqwv22Z7lOXPnXAscCcxPKS2o2F+V/ll34b+DadJae7Q5HVj+MestZFdX/wz4zk6WVcpxcz3Zlp2RUnokpfS9lNIzKaVNKaVXUko/J7v4aB1wTpl/8VW7PTuplH2zPd1p55TS6ymlK1NKy1JKb+ePR8nevX4SOBTocHpVbRf5su76WW9JKX0zHyf8Wn4e/G1K6UKyC6gHk13sr95jn+0Cz5ldFxGXkM3CtxI4t6uH58tu9c96HPbzHNksJp31cms78+B/K9mUSrcBn23l4pdtf4HtRes6+guu1vVIW3ZXSukPETEf+F/AJ8imFCujarZnvffN9vR4O+cft/4QGE/WB6/fydrqTUf9bM8Wr9POu4ksMHyi6EJKzj5bBZ4zWxcRF5G1xXJgckrprRYvqUr/rLvwn1Ka3N2vkY/F+glZ8P8JcF5KaWsr32tjRKwBRkTE/q2MrR6VL9saD1vTeqIte9Ab+bK0Hx9Wsz3rvW+2pxfbufR9sBf8Ll+2de1I3fazAryeL+1/3fM74KNkfXZp5RP57/6DyS7AfL76pdUdz5kVIuLLZHP1/5Ys+L/eysuq0j/rbthPd0XEAOB2suD/Y+Dc1oJ/hYfy5SmtPPfJFq/RzhufLz0hd559s2dtm7HGPtjs4Xw5peWdKiNiCNmQyc3Af1W7sDp0XL60/3VPe+fFT5DNTvV4Sum96pVUtzxn5iLiCrLg/xtgUhvBH6rUPw3/FfKLe+cAZwD/BsxqOX1dK7bN0/qNqLiVfUQ0ABeR3ajh5h4vtg5FxImt7IuI+GuyX3xv0vr0V2qdfbOLImJ8/gZAy/0nAZflm9W4FqMUUkrPAfeTXYx6UYunv0n2jt+PU0obq1xaKUXEERExtJX9BwHb7sZt/+ue28l+l3wmIj66bWdEDAL+Pt/81yIKKyPPmR2LiL8lu8B3Kdk7/m+28/Kq9M/wHg7NIuJmsrvMvgn8C61fULEwpbSwxXHXAX9Fdhvs28luBvZpYBjZXS+/1/KL9AUR8TWabwv+52S3C3+c5mkmF6eUfljx+kQ2POCXwBqyMW8nkF0Rvwk4M6V0f3Wqrz1dbc/8GPtmF+RT0x1BdlO/l/LdR9M89/LfppT+/k+P7LsiYiRZP9wPmEc2/dx4sgv1nwGOTymtLa7C8oiIq4GvkX2i8gLwDjASOI3sDp/zyc6DjUXVWIsiYgYwI98cDkwle7d5Ub7vzZTSV1u8/naya4N+CrwFnE4209ztwNl9+QZXXWlPz5nti4jzgdnAVuCfaX2s/uqU0uyKY3q/f3b3FsH19CDrvKmDx9VtHHs+WWjdSHbCfgSYVvTPVOPtObvF67+dt9vLeaffRHY1/PeAQ4r+eYp+dLU9K46zb3a+jf8SuJtsetkNZJ+O/J5stq8Ti66vVh/AgWSfIr0CNAIvkl3UNrTo2sr0IJsi8T/y897bZDcBegP4T7I5waPoGmvxQTYDUnvnxtWtHHMC2R9T68iGpj1N9k71LkX/PEU/utKenjO73ZaJ7E3llsf1av/0nX9JkiSpj3DMvyRJktRHGP4lSZKkPsLwL0mSJPURhn9JkiSpjzD8S5IkSX2E4V+SJEnqIwz/kiRJUh9h+JckSZL6CMO/JEmS1EcY/iVJkqQ+wvAvSZIk9RGGf0mSJKmPMPxLkiRJfYThX5IkSeojDP+SJElSH2H4lyRJkvoIw78kSZLUR/x/1ls5WfGUDBoAAAAASUVORK5CYII=\n"
},
"metadata": {
"image/png": {
"width": 383,
"height": 252
},
"needs_background": "light"
}
}
],
"source": [
"func = lambda x: x**2\n",
"func_dx = lambda x:2*x\n",
"\n",
"x = np.arange(-20,20,0.1)\n",
"y = func(x)\n",
"\n",
"point_x = -6\n",
"point_y = func(point_x)\n",
"\n",
"\n",
"\n",
"dx = styczna(x)\n",
"\n",
"learning_points_xs = np.arange(point_x, 0, 0.8)\n",
"learning_points_ys = func(learning_points_xs)\n",
"\n",
"fig, ax = plt.subplots()\n",
"ax.plot(x, y, c='k')\n",
"\n",
"for px in learning_points_xs[0:1]:\n",
" slope = func_dx(px)\n",
" intercept = -px**2\n",
" styczna = lambda x: slope*x + intercept\n",
" dx = styczna(x)\n",
" ax.plot(x, dx, c='r', zorder=1)\n",
"\n",
"ax.scatter(x=point_x, y=point_y, c='r', zorder=6) #start\n",
"# ax.scatter(x=0, y=0, c='g', zorder=6) #min\n",
"# ax.scatter(x=learning_points_xs, y=learning_points_ys, c='y', zorder=5)\n",
"plt.ylim((-20,80))\n",
"plt.xlim((-20,20))\n",
"# plt.xlabel('x')\n",
"# plt.ylabel('f(x) = x^2')\n",
"\n",
"plt.savefig('gradient_descent_1.png')\n",
"\n",
"# https://towardsdatascience.com/understanding-the-mathematics-behind-gradient-descent-dde5dc9be06e?\n",
"# https://medium.com/code-heroku/gradient-descent-for-machine-learning-3d871fa48b4c"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"language_info": {
"name": "python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"version": "3.8.3-final"
},
"orig_nbformat": 2,
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"npconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3,
"kernelspec": {
"name": "python38264bit90963b6dfcff4977b23d3abddad7c054",
"display_name": "Python 3.8.2 64-bit"
}
},
"nbformat": 4,
"nbformat_minor": 2
}