{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f6c1fcf7-c08e-4d2f-a74c-68aa928c48ef",
   "metadata": {},
   "source": [
    "On dispose d'objets classés en $n$ catégories. A chaque objet est associé un vecteur de $\\mathbb{R}^d$.\n",
    "\n",
    "Le problème est de classifier un nouvel objet connaissant uniquement le vecteur qui lui est associé.\n",
    "\n",
    "Ces données peuvent être stockées sous forme de dictionnaire. Les clés peuvent être des numéros et les valeurs une liste dont le premier élément est la catégorie de l'objet (sous forme de chaîne de caractères le plus souvent) et le deuxième le vecteur qui lui est associé.\n",
    "\n",
    "On peut également stocker ces données uniquement à l'aide de listes.\n",
    "\n",
    "L'idée est de considérer les $k$ plus proches voisins du nouvel objet (dont on ne connaît pas la catégorie) où $k$ est un entier qu'il faudra choisir judicieusement (s'il n'y a que deux catégories, on choisit $k$ impair!). \n",
    "\n",
    "On peut alors penser que cet objet est de la catégorie majoritaire parmi ces plus proches voisins. \n",
    "\n",
    "Il faut donc calculer la distance entre l'objet étudié et n'importe qu'elle autre objet. En général, on utilise pour cela la distance euclidienne de $\\mathbb{R}^d$~:\n",
    "$$\n",
    " d((x_1, \\ldots,x_d),(y_1, \\ldots,y_d))\n",
    " =\\sqrt{\\sum_{i=1}^d (x_i-y_i)^2}.\n",
    "$$\n",
    "On classe les distances obtenue par ordre décroissant et on s'intéresse aux $k$ premières. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "398842d8-8cd4-4b24-88dd-430e6ce7431c",
   "metadata": {},
   "source": [
    "Les listes sont stockés dans une liste. Chaque élément de la liste sont eux-même des listes contenant les coordonnées de l'objet et sa catégorie.\n",
    "\n",
    "Pour les tests, on utilisera la liste suivante $(d=n=2)$ :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d1f37243-cd91-44ac-ab8b-63e4a84938bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "Points=[[0,0,'red'],[3,7,'blue'],[4,1,'blue'],[2,7,'red'],[4,4,'red'],\n",
    "        [5,0,'red'],[7,5,'blue'],[5,6,'blue'],[6,2,'blue'],[7,6,'blue'],\n",
    "        [2,3,'red'],[1,2,'red'],[1,5,'blue'],[2,5,'blue'],[1,4,'blue'],\n",
    "        [0,7,'red'],[1,6,'red'],[5,3,'red'],[6,4,'red']]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "44fa1430-d65f-4357-a718-66e0247ae528",
   "metadata": {},
   "source": [
    "**Exercice 1**\n",
    "\n",
    "Ecrire une fonction `affichage` qui représente sur un graphique une liste de points."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "08705703-6527-4327-b5b1-3535cf07444b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def affichage(Points):\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8d1a7bba-4508-400a-9098-554155183218",
   "metadata": {},
   "outputs": [],
   "source": [
    "affichage(points)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca4c49b2-4a44-443e-8664-c25c2495f8a6",
   "metadata": {},
   "source": [
    "**Exercice 2**\n",
    "\n",
    "Ecrire une fonction `distance` prenant en paramètre deux vecteurs de $\\mathrm{R}^d$ et qui renvoie la distance euclidienne entre ces deux vecteurs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f4ad1c8f-edff-4941-91c8-e1cd4c7b6829",
   "metadata": {},
   "outputs": [],
   "source": [
    "def distance(A,B): # A et B sont deux listes de réels de même taille\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4cebc67b-982d-4318-90d7-31c3ce017253",
   "metadata": {},
   "source": [
    "**Exercice 3**\n",
    "\n",
    "Ecrire une fonction `liste_dist` prenant en paramètre un point $M$ de ${\\mathbb R}^d$ et une liste `Points`,  et qui renvoie  une liste `D` contenant la distance de $M$ à chaque objet de la liste `Points` et la couleur de l'objet.\n",
    " \n",
    "Plus précisément `D[i][0]` est la distance entre l'objet numéro $i$ et le point $M$, `D[i][1]` est la couleur de l'objet numéro $i$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "73bd5045-1de9-4544-9224-028a46b25f46",
   "metadata": {},
   "outputs": [],
   "source": [
    "def liste_dist(M,Points):\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "33e27425-edef-4967-97c3-239dd9f07cd4",
   "metadata": {},
   "outputs": [],
   "source": [
    "liste_dist((2,3),Points)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5b42c26-43d5-4e3b-8639-ab089ee1981d",
   "metadata": {},
   "source": [
    "**Exercice 4**\n",
    "\n",
    "1. Ecrire une fonction `max_valeur` qui prend en argument un dictionnaire dont les valeurs sont des entiers positifs et qui renvoie une clé dont la valeur est maximale. Tester cette fonction.\n",
    "2. Ecrire une fonction `ppv` qui prend en argument un point $M$ de ${\\mathbb R}^d$ et un entier $k$, et qui affiche ce point \n",
    "de la couleur majoritaire de ses $k$ plus proches voisins. Cette fonction doit utiliser la fonction `max_valeur`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "4ffa63e1-dc1b-4a16-91ef-8d7bd9e8fb82",
   "metadata": {},
   "outputs": [],
   "source": [
    "def max_valeur(dico):\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "50fff1f9-8409-4cd6-bbd8-652b333966f6",
   "metadata": {},
   "outputs": [],
   "source": [
    "dico={'A':3,'B':5,'E':1,'Z':7,'T':2}\n",
    "max_valeur(dico)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "c7fd4598-a823-4f06-9694-cfb8dda9402c",
   "metadata": {},
   "outputs": [],
   "source": [
    "def ppv(Points,M,k):\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cc9e4af7-0ec8-4332-b611-2f2886b370c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "ppv(Points,[3,4],3)\n",
    "affichage(Points)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6f2a3648-02c4-4231-8ab8-169425463f26",
   "metadata": {},
   "source": [
    "**Exercice 5**\n",
    "\n",
    "Tester la fonction sur tous les points dont les coordonnées sont comprises entre $0$ et $10$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df758bd4-87e4-4318-b2df-5c194bf07489",
   "metadata": {},
   "outputs": [],
   "source": [
    "def ex5(Points,k,N)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "55bfccbe-cd77-460e-8ebb-6503f3cd4668",
   "metadata": {},
   "outputs": [],
   "source": [
    "ex5(points,3,5)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
