{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: pytholog in /home/br0kenpixel/Documents/ui-cviko1/lib64/python3.13/site-packages (2.4.1)\n", "Requirement already satisfied: more-itertools in /home/br0kenpixel/Documents/ui-cviko1/lib64/python3.13/site-packages (from pytholog) (10.6.0)\n", "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install pytholog" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pytholog as pl" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "graph = pl.KnowledgeBase(\"graph\")\n", "graph([\n", " \"way(a, b, 1)\",\n", " \"way(a, c, 4)\",\n", " \"way(b, d, 1)\",\n", " \"way(b, e, 3)\",\n", " \"way(c, f, 2)\",\n", " \"way(d, g, 4)\",\n", " \"way(e, g, 1)\",\n", " \"way(f, g, 2)\"\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```mermaid\n", "flowchart LR\n", " A<-->|1|B;\n", " A<-->|4|C;\n", " B<-->|1|D;\n", " B<-->|3|E;\n", " C<-->|2|F;\n", " D<-->|4|G;\n", " E<-->|1|G;\n", " F<-->|2|G;\n", "```" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "graph(\n", " [\n", " \"path(X, Y, W) :- way(X , Y, W)\",\n", " \"path(X, Y, W) :- way(X, Z, W1), path(Z, Y, W2), W is W1 + W2\"\n", " ]\n", ")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[{'W': 6}, {'W': 6}, {'W': 6}, {'W': 6}]\n" ] } ], "source": [ "answer, path = graph.query(pl.Expr(\"path(a, f, W)\"), show_path = True)\n", "print(answer)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'4', 'c', '2'}\n" ] } ], "source": [ "print(path)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['c']\n" ] } ], "source": [ "print([x for x in path if str(x) > \"Z\"])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[{'W': 6}, {'W': 6}, {'W': 5}, {'W': 5}, {'W': 6}, {'W': 6}, {'W': 5}, {'W': 5}, {'W': 8}, {'W': 8}, {'W': 8}, {'W': 8}, {'W': 6}, {'W': 6}, {'W': 5}, {'W': 5}, {'W': 6}, {'W': 6}, {'W': 5}, {'W': 5}, {'W': 8}, {'W': 8}, {'W': 8}, {'W': 8}]\n", "['f', 'd', 'e', 'b', 'c']\n" ] } ], "source": [ "answer, path = graph.query(pl.Expr(\"path(a, g, W)\"), show_path = True)\n", "print(answer)\n", "print([x for x in path if str(x) > \"Z\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Map Coloring Problem\n", "Riešenie hlavolamov." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "country_color = pl.KnowledgeBase(\"city_color\")\n", "country_color([\n", " \"different(red, green)\",\n", " \"different(red, blue)\",\n", " \"different(green, red)\",\n", " \"different(green, blue)\",\n", " \"different(blue, red)\",\n", " \"different(blue, green)\",\n", " \"coloring(Pl, Sk, Cz, Hu, At, De) :- different(Pl, Sk), different(Pl, Cz), different(Pl, De), different(Sk, Cz), different(Sk, Hu), different(Hu, At), different(Cz, De), different(Cz, At), different(At, De)\"\n", "])" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'Poland': 'blue',\n", " 'Slovakia': 'red',\n", " 'Czech_republic': 'green',\n", " 'Hungary': 'green',\n", " 'Austria': 'blue',\n", " 'Germany': 'red'}]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "country_color.query(pl.Expr(\"coloring(Poland, Slovakia, Czech_republic, Hungary, Austria, Germany)\"), cut = True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## MHD" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "lines = pl.KnowledgeBase(\"lines\")\n", "# vyznam faktov bus\n", "# bus(zastavka, linka)\n", "lines([\n", " \"bus(klokocina,4)\",\n", " \"bus(polygon,4)\",\n", " \"bus(divadlo,4)\",\n", " \"bus(stanicna,4)\",\n", " \"bus(chrenova,4)\",\n", " \"bus(zobor,4)\",\n", " \"bus(mlynarce,6)\",\n", " \"bus(centrum,6)\",\n", " \"bus(agrokomplex,6)\",\n", " \"bus(kynek,6)\",\n", " \"bus(diely,18)\",\n", " \"bus(nemocnica,18)\",\n", " \"bus(divadlo,18)\",\n", " \"bus(centrum,18)\",\n", " \"bus(janikovce,18)\",\n", " \"bus(dlaha,19)\",\n", " \"bus(pribinovo_namestie,19)\",\n", " \"bus(agrokomplex,19)\",\n", " \"bus(stara_nitra,19)\",\n", " \"bus(autobusova_stanica,19)\",\n", " \"bus(autobusova_stanica,5)\",\n", " \"bus(skultetyho,5)\",\n", " \"bus(dlaha,5)\",\n", " \"bus(lapas,10)\",\n", " \"bus(zobor,10)\",\n", " \"bus(stanicna,10)\",\n", " \"bus(centrum,10)\",\n", " \"bus(pribinovo_namestie,10)\"\n", "])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Yes']" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Stoji linka 10 na Zobore?\n", "lines.query(pl.Expr(\"bus(zobor,10)\"))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'X': 'centrum'},\n", " {'X': 'lapas'},\n", " {'X': 'pribinovo_namestie'},\n", " {'X': 'stanicna'},\n", " {'X': 'zobor'}]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Kde všade stojí linka 10?\n", "lines.query(pl.Expr(\"bus(X, 10)\"))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# Existuje medzi dvoma zastávkami priamy spoj?\n", "lines([\n", " \"direct_line(X, Y) :- bus(X, L), bus(Y, L)\"\n", "])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Yes']" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Existuje priamy spoj medzi Zoborom a centrom?\n", "lines.query(pl.Expr(\"direct_line(centrum, zobor)\"))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['No']" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Existuje priamy spoj medzi Zoborom a Mlynom?\n", "lines.query(pl.Expr(\"direct_line(zobor, mlyny)\"))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'X': 'chrenova'},\n", " {'X': 'divadlo'},\n", " {'X': 'klokocina'},\n", " {'X': 'polygon'},\n", " {'X': 'stanicna'},\n", " {'X': 'zobor'},\n", " {'X': 'centrum'},\n", " {'X': 'lapas'},\n", " {'X': 'pribinovo_namestie'},\n", " {'X': 'stanicna'},\n", " {'X': 'zobor'}]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Kde sa viem priamo dostať zo Zoboru?\n", "lines.query(pl.Expr(\"direct_line(zobor, X)\"))" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "# To isté ako `direct_line` ale vráti aj číslo linky\n", "lines([\n", " \"path_without_transfer(X, Y, L) :- bus(X, L), bus(Y, L)\"\n", "])" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'L': '10'}]" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Ktorou linkou sa vieme dostať priamo zo Zoboru do centra?\n", "lines.query(pl.Expr(\"path_without_transfer(zobor, centrum, L)\"))" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "# Funkcia na nájdenie cesty medzi dvoma stanicami, pričom vráti aj prestup\n", "lines([\n", " \"path_transfer(X, Y, L1, L2, T) :- bus(X, L1), bus(T, L1), bus(Y, L2), bus(T, L2)\"\n", "])" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'L1': '4', 'L2': '18', 'T': 'divadlo'}]" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Akým prestupom sa vieme dostať z Klokočiny do nemocnice?\n", "lines.query(pl.Expr(\"path_transfer(klokocina, nemocnica, L1, L2, T)\")) # cez divadlo" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rozpoznávanie vzorov" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting numpy\n", " Downloading numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (62 kB)\n", "Downloading numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.1 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m16.1/16.1 MB\u001b[0m \u001b[31m9.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n", "\u001b[?25hInstalling collected packages: numpy\n", "Successfully installed numpy-2.2.4\n", "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install numpy" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting matplotlib\n", " Downloading matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB)\n", "Collecting contourpy>=1.0.1 (from matplotlib)\n", " Using cached contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.4 kB)\n", "Collecting cycler>=0.10 (from matplotlib)\n", " Using cached cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB)\n", "Collecting fonttools>=4.22.0 (from matplotlib)\n", " Using cached fonttools-4.56.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (101 kB)\n", "Collecting kiwisolver>=1.3.1 (from matplotlib)\n", " Using cached kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.2 kB)\n", "Requirement already satisfied: numpy>=1.23 in /home/br0kenpixel/Documents/ui-cviko1/lib64/python3.13/site-packages (from matplotlib) (2.2.4)\n", "Requirement already satisfied: packaging>=20.0 in /home/br0kenpixel/Documents/ui-cviko1/lib64/python3.13/site-packages (from matplotlib) (24.2)\n", "Collecting pillow>=8 (from matplotlib)\n", " Using cached pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl.metadata (9.1 kB)\n", "Collecting pyparsing>=2.3.1 (from matplotlib)\n", " Using cached pyparsing-3.2.3-py3-none-any.whl.metadata (5.0 kB)\n", "Requirement already satisfied: python-dateutil>=2.7 in /home/br0kenpixel/Documents/ui-cviko1/lib64/python3.13/site-packages (from matplotlib) (2.9.0.post0)\n", "Requirement already satisfied: six>=1.5 in /home/br0kenpixel/Documents/ui-cviko1/lib64/python3.13/site-packages (from python-dateutil>=2.7->matplotlib) (1.17.0)\n", "Downloading matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.6 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.6/8.6 MB\u001b[0m \u001b[31m9.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n", "\u001b[?25hUsing cached contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (322 kB)\n", "Using cached cycler-0.12.1-py3-none-any.whl (8.3 kB)\n", "Using cached fonttools-4.56.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.8 MB)\n", "Using cached kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB)\n", "Using cached pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl (4.5 MB)\n", "Using cached pyparsing-3.2.3-py3-none-any.whl (111 kB)\n", "Installing collected packages: pyparsing, pillow, kiwisolver, fonttools, cycler, contourpy, matplotlib\n", "Successfully installed contourpy-1.3.1 cycler-0.12.1 fonttools-4.56.0 kiwisolver-1.4.8 matplotlib-3.10.1 pillow-11.1.0 pyparsing-3.2.3\n", "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install matplotlib" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "A = \"\"\"\n", ".XXX.\n", "X...X\n", "XXXXX\n", "X...X\n", "X...X\n", "\"\"\"\n", "T = \"\"\"\n", "XXXXX\n", "..X..\n", "..X..\n", "..X..\n", "..X..\n", "\"\"\"\n", "\n", "E = \"\"\"\n", "XXXXX\n", "X....\n", "XXX..\n", "X....\n", "XXXXX\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "from numpy import array" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "def to_vector(letter):\n", " return array([+1 if c == \"X\" else 0 for c in letter.replace('\\n', '')])" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "a_vec = to_vector(A)\n", "t_vec = to_vector(T)\n", "e_vec = to_vector(E)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0,\n", " 0, 0, 1])" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a_vec" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,\n", " 1, 0, 0])" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t_vec" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1,\n", " 1, 1, 1])" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "e_vec" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "def display(pattern):\n", " from pylab import imshow, cm, show\n", " imshow(pattern.reshape((5,5)),cmap=cm.binary, interpolation='nearest')\n", " show()" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(a_vec)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(t_vec)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "image/png": "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msri4mLs2bMnTpw40ehRmtbk5GSMjo7GpUuX4vz58/H555/HM888E4uLi40eran09vbG8ePHY2ZmJt5///14+umn44UXXogPPvig0aM1renp6Th58mQMDAw0epT6FVvY4OBgMTo6uvJ6aWmp6OnpKcbHxxs6VzOLiGJiYqLRYzS9+fn5IiKKycnJRo/S9B588MHitddea/QYTWlhYaH4xje+UZw/f7743ve+Vxw+fLjRI9Vly97B3Lx5M2ZmZmJ4eHhlX1tbWwwPD8e7777b0NlofZVKJSIiuru7Gz1K01paWorTp0/H4uJiDA0NNXqcpjQ6OhrPPffcqs+pVrLpv+yyWXz22WextLQUu3btWrV/165d8eGHHzZsLlrf8vJyHDlyJJ566qnYvXt3o8dpOleuXImhoaH4z3/+Ew888EBMTEzE448/3uixms7p06fj8uXLMT093ehR1m3LBgayjI6Oxj//+c945513Gj1KU/rmN78Zs7OzUalU4s0334yRkZGYnJwUmf9nbm4uDh8+HOfPn48dO3Y0epx127KBefjhh2Pbtm1x/fr1VfuvX78ejzzySMPmorUdOnQo3n777Ziammraf5ai0drb2+PrX/96RETs3bs3pqen43e/+12cPHmy0aM1jZmZmZifn4/vfOc7K/uWlpZiamoq/vCHP0StVott27Y1dMa12LJrMO3t7bF37964cOHCyr7l5eW4cOGC58HUrSiKOHToUExMTMTf//73eOyxxxo9UstYXl6OWq3W6DGayv79++PKlSsxOzu7su3bty9efvnlmJ2dbYm4xFa+g4mIOHr0aIyMjMS+ffticHAwXnnllVhcXIyDBw82erSmcuPGjfj4449XXn/yyScxOzsb3d3d0d/f39DZmsXo6GicOnUq3nrrrejs7Ixr165F/PcfZrrvvvsaPV7TGBsbiwMHDkR/f38sLCzEqVOn4uLFi3Hu3LlGj9ZUOjs7v7B+d//998dDDz3UWut6jf42tkb7/e9/X/T39xft7e3F4OBgcenSpUaP1HT+8Y9/FBHxhW1kZKTRozWNW12fiChef/31Ro/WVH76058WX/3qV4v29vbiK1/5SrF///7ib3/7W6PHagmt+G3Kfl0/ACm27BoMALkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASDF/wGibg15ZVuA0AAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(e_vec)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "# Trošku iné A-čko\n", "new_char = \"\"\"\n", "..X..\n", ".X.X.\n", "X...X\n", "XXXXX\n", "X...X\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "new_vec = to_vector(new_char)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,\n", " 0, 0, 1])" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_vec" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZgAAAGdCAYAAAAv9mXmAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAEWpJREFUeJzt3V9olff9wPHPiWLsXHJo2mkJxrVsY0NEx7SWUNifmrVIKe2udlGYc2MXIw4lNyM3k11FGIyOTTpZWXczsayghQ7nxM1IodIYCXOFFgqFBZymvTknBnYsyfO72S+/n0zdOdFPnnOS1wuei/P4nDwfnmjePM83iZWiKIoAgPusq+wBAFiZBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSrF3uEy4sLMTVq1ejp6cnKpXKcp8egHtQFEXMzs5Gf39/dHXd/R5l2QNz9erVGBgYWO7TAnAfTU9Px+bNm+96zLIHpqenJ+Lfw/X29i736VmBqtVq2SN0hFqtVvYIrAD1ej0GBgYWv5bfzbIH5n8fi/X29goMLCP/3rifmlnisMgPQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKRYUmCOHj0ajz76aKxfvz6eeOKJeOedd+7/ZAB0tJYD89prr8XIyEgcPnw4Ll++HDt27IhnnnkmZmZmciYEoCO1HJif//zn8YMf/CD2798fW7dujV//+tfxqU99Kn7729/mTAhAR2opMDdv3ozJyckYGhr6vw/Q1RVDQ0Px9ttvZ8wHQIda28rBH3/8cczPz8emTZtu2b9p06Z47733bvueRqMRjUZj8XW9Xl/qrAB0kPTvIhsbG4tqtbq4DQwMZJ8SgDbQUmAefvjhWLNmTVy/fv2W/devX49HHnnktu8ZHR2NWq22uE1PT9/bxAB0hJYCs27duti5c2ecO3ducd/CwkKcO3cuBgcHb/ue7u7u6O3tvWUDYOVraQ0mImJkZCT27dsXu3btit27d8dLL70Uc3NzsX///pwJAehILQfm29/+dnz00Ufxk5/8JK5duxZf/vKX409/+tN/LPwDsLpViqIolvOE9Xo9qtVq1Go1j8u4LyqVStkjdIRl/qfOCtXK13C/iwyAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKRYW/YA3FmlUil7hI5QFEXZI3QEf5+a4+/T/eMOBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApWg7MhQsX4rnnnov+/v6oVCpx6tSpnMkA6GgtB2Zubi527NgRR48ezZkIgBVhbatv2Lt3b+zduzdnGgBWDGswAKRo+Q6mVY1GIxqNxuLrer2efUoA2kD6HczY2FhUq9XFbWBgIPuUALSB9MCMjo5GrVZb3Kanp7NPCUAbSH9E1t3dHd3d3dmnAaDNtByYGzduxAcffLD4+sMPP4ypqano6+uLLVu23O/5AOhQLQfm0qVL8Y1vfGPx9cjISERE7Nu3L373u9/d3+kA6FgtB+brX/96FEWRMw0AK4afgwEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACnWlnXiarVa1qk7RlEUZY/ACuLvU3MqlUrZI6wY7mAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJBCYABIITAApBAYAFIIDAApBAaAFAIDQAqBASCFwACQQmAASCEwAKQQGABSCAwAKQQGgBQCA0AKgQEghcAAkKKlwIyNjcXjjz8ePT09sXHjxnjhhRfi/fffz5sOgI7VUmDGx8djeHg4Ll68GGfPno1PPvkknn766Zibm8ubEICOVCmKoljqmz/66KPYuHFjjI+Px1e/+tWm3lOv16NarS71lKvKPXxqgCWqVCplj9ARarVa9Pb23vWYtfd6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44UXXoj333+/7LHazssvvxzbt29f/MHBwcHBOH36dNljtb0jR45EpVKJQ4cOlT1KS1Z1YF577bUYGRmJw4cPx+XLl2PHjh3xzDPPxMzMTNmjtZW5ubnYsWNHHD16tOxR2tb4+HgMDw/HxYsX4+zZs/HJJ5/E008/HXNzc2WP1lY2b94cR44cicnJybh06VI89dRT8fzzz8e7775b9mhta2JiIo4dOxbbt28ve5TWFavY7t27i+Hh4cXX8/PzRX9/fzE2NlbqXO0sIoqTJ0+WPUbbm5mZKSKiGB8fL3uUtvfggw8Wr7zyStljtKXZ2dniC1/4QnH27Nnia1/7WnHw4MGyR2rJqr2DuXnzZkxOTsbQ0NDivq6urhgaGoq333671NnofLVaLSIi+vr6yh6lbc3Pz8eJEydibm4uBgcHyx6nLQ0PD8ezzz57y9epTrLsv+yyXXz88ccxPz8fmzZtumX/pk2b4r333ittLjrfwsJCHDp0KJ588snYtm1b2eO0nStXrsTg4GD861//ik9/+tNx8uTJ2Lp1a9ljtZ0TJ07E5cuXY2JiouxRlmzVBgayDA8Px9///vd46623yh6lLX3xi1+MqampqNVq8frrr8e+fftifHxcZP6f6enpOHjwYJw9ezbWr19f9jhLtmoD8/DDD8eaNWvi+vXrt+y/fv16PPLII6XNRWc7cOBAvPnmm3HhwoW2/W8pyrZu3br4/Oc/HxERO3fujImJifjFL34Rx44dK3u0tjE5ORkzMzPxla98ZXHf/Px8XLhwIX71q19Fo9GINWvWlDpjM1btGsy6deti586dce7cucV9CwsLce7cOc+DaVlRFHHgwIE4efJk/OUvf4nHHnus7JE6xsLCQjQajbLHaCt79uyJK1euxNTU1OK2a9euePHFF2Nqaqoj4hKr+Q4mImJkZCT27dsXu3btit27d8dLL70Uc3NzsX///rJHays3btyIDz74YPH1hx9+GFNTU9HX1xdbtmwpdbZ2MTw8HMePH4833ngjenp64tq1axH//o+ZHnjggbLHaxujo6Oxd+/e2LJlS8zOzsbx48fj/PnzcebMmbJHays9PT3/sX63YcOGeOihhzprXa/sb2Mr2y9/+ctiy5Ytxbp164rdu3cXFy9eLHuktvPXv/61iIj/2Pbt21f2aG3jdtcnIopXX3217NHayve+973is5/9bLFu3briM5/5TLFnz57iz3/+c9ljdYRO/DZlv64fgBSrdg0GgFwCA0AKgQEghcAAkEJgAEghMACkEBgAUggMACkEBoAUAgNACoEBIIXAAJDifwBRKu0F2/cWfwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(new_vec)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Porovnanie zvorov\n", "\n", "- Koľko bodov má spločných nový vzor so starými?\n", "- Ako veľmi sa zhodujú?" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "def templates(v1: np.array, v2: np.array) -> np.int64:\n", " \"\"\" Vráti počet spoločných bodov ktoré majú dané 2 vektory. \"\"\"\n", " return np.sum(v1 == v2)" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.int64(13)" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "templates(a_vec, new_vec)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.int64(8)" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "templates(t_vec, new_vec)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.int64(8)" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "templates(e_vec, new_vec)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Meranie vzdialenosti vektorov" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting scipy\n", " Downloading scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)\n", "Requirement already satisfied: numpy<2.5,>=1.23.5 in /home/br0kenpixel/Documents/ui-cviko1/lib64/python3.13/site-packages (from scipy) (2.2.4)\n", "Downloading scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (37.3 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m37.3/37.3 MB\u001b[0m \u001b[31m8.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hInstalling collected packages: scipy\n", "Successfully installed scipy-1.15.2\n", "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install scipy" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "from scipy.spatial import distance" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a: 3.4641016151377544 , t: 4.123105625617661 , e: 4.123105625617661\n" ] } ], "source": [ "# Euclidean distance\n", "dst_a = distance.euclidean(new_vec, a_vec)\n", "dst_t = distance.euclidean(new_vec, t_vec)\n", "dst_e = distance.euclidean(new_vec, e_vec)\n", "print('a:', dst_a, ', t:', dst_t, ', e:', dst_e)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a: 12 , t: 17 , e: 17\n" ] } ], "source": [ "# Manhattan distance\n", "dst_a = distance.cityblock(new_vec, a_vec)\n", "dst_t = distance.cityblock(new_vec, t_vec)\n", "dst_e = distance.cityblock(new_vec, e_vec)\n", "print('a:', dst_a, ', t:', dst_t, ', e:', dst_e)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a: 0.4599382751326784 , t: 0.8075499102701247 , e: 0.6273220037500351\n" ] } ], "source": [ "# Kosínustová korelácia\n", "# Vzdialenosť je uhol medzi vektormi.\n", "dst_a = distance.cosine(new_vec, a_vec)\n", "dst_t = distance.cosine(new_vec, t_vec)\n", "dst_e = distance.cosine(new_vec, e_vec)\n", "print('a:', dst_a, ', t:', dst_t, ', e:', dst_e)" ] } ], "metadata": { "kernelspec": { "display_name": "ui-cviko1", "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.13.2" } }, "nbformat": 4, "nbformat_minor": 2 }