[{"data":1,"prerenderedAt":1565},["ShallowReactive",2],{"blog-comprendre-le-knn":3},{"id":4,"title":5,"body":6,"coverImage":1551,"description":1552,"extension":1553,"meta":1554,"navigation":233,"path":1555,"published":233,"publishedAt":1556,"readTime":755,"seo":1557,"stem":1558,"tags":1559,"__hash__":1564},"blog\u002Fblog\u002Fcomprendre-le-knn.md","Comprendre le KNN : l'algorithme des k plus proches voisins",{"type":7,"value":8,"toc":1492},"minimark",[9,14,19,32,35,38,42,45,75,79,82,85,88,93,96,99,110,113,127,130,134,137,143,146,150,153,156,164,167,170,174,177,180,184,195,205,208,307,311,314,317,324,330,334,341,347,350,354,367,370,374,377,381,384,387,398,402,405,407,418,421,425,428,561,564,579,582,586,589,849,853,860,863,869,872,878,881,887,890,896,902,908,911,915,1081,1084,1090,1094,1097,1100,1111,1115,1118,1122,1125,1129,1132,1136,1139,1142,1146,1149,1152,1161,1164,1167,1173,1176,1182,1186,1206,1209,1213,1216,1219,1230,1233,1237,1241,1244,1251,1254,1260,1263,1267,1270,1274,1277,1280,1300,1304,1308,1314,1318,1321,1325,1328,1332,1341,1345,1349,1406,1410,1481,1485,1488],[10,11,13],"h1",{"id":12},"comprendre-le-knn","Comprendre le KNN",[15,16,18],"h2",{"id":17},"introduction","Introduction",[20,21,22,23,27,28,31],"p",{},"Le KNN, pour ",[24,25,26],"strong",{},"k-nearest neighbors"," ou ",[24,29,30],{},"k plus proches voisins",", est l'un des algorithmes les plus simples à comprendre en machine learning.",[20,33,34],{},"Son idée est très intuitive : pour prédire la classe d'un nouvel élément, on regarde les éléments les plus proches autour de lui, puis on laisse la majorité décider.",[20,36,37],{},"Cet algorithme est particulièrement utile pour apprendre les bases du machine learning, car il ne demande pas un modèle compliqué pour commencer.",[15,39,41],{"id":40},"ce-que-vous-allez-apprendre","Ce que vous allez apprendre",[20,43,44],{},"À la fin de ce tutoriel, vous saurez :",[46,47,48,52,55,58,66,69,72],"ul",{},[49,50,51],"li",{},"comprendre le principe du KNN ;",[49,53,54],{},"savoir quand utiliser cet algorithme ;",[49,56,57],{},"comprendre ce qu'est la distance entre deux points ;",[49,59,60,61,65],{},"choisir une valeur de ",[62,63,64],"code",{},"k"," ;",[49,67,68],{},"écrire un KNN simple en Python ;",[49,70,71],{},"distinguer classification et régression avec KNN ;",[49,73,74],{},"éviter les erreurs les plus fréquentes.",[15,76,78],{"id":77},"_1-quest-ce-que-le-knn","1. Qu'est-ce que le KNN ?",[20,80,81],{},"Le KNN est un algorithme supervisé.",[20,83,84],{},"Cela veut dire qu'on dispose déjà d'exemples connus, avec leurs bonnes réponses.",[20,86,87],{},"Ensuite, quand on reçoit un nouvel exemple, on le compare aux exemples déjà connus pour deviner sa classe.",[89,90,92],"h3",{"id":91},"exemple-simple","Exemple simple",[20,94,95],{},"Imaginons que vous voulez classer des fruits.",[20,97,98],{},"Vous avez déjà des exemples :",[46,100,101,104,107],{},[49,102,103],{},"des pommes ;",[49,105,106],{},"des poires ;",[49,108,109],{},"des bananes.",[20,111,112],{},"Si un nouveau fruit arrive, le KNN regarde les fruits les plus proches de lui selon certains critères :",[46,114,115,118,121,124],{},[49,116,117],{},"taille ;",[49,119,120],{},"poids ;",[49,122,123],{},"couleur ;",[49,125,126],{},"texture.",[20,128,129],{},"Si les voisins les plus proches sont majoritairement des pommes, alors le nouvel objet sera classé comme une pomme.",[15,131,133],{"id":132},"_2-lidée-intuitive","2. L'idée intuitive",[20,135,136],{},"Le KNN repose sur une idée très humaine :",[138,139,140],"blockquote",{},[20,141,142],{},"on compare un nouvel élément aux éléments déjà connus, puis on choisit la catégorie la plus représentée parmi ses voisins les plus proches.",[20,144,145],{},"C'est simple, facile à comprendre et très utile pour commencer à apprendre le machine learning.",[15,147,149],{"id":148},"_3-pourquoi-on-parle-de-voisins","3. Pourquoi on parle de \"voisins\" ?",[20,151,152],{},"En machine learning, les données peuvent être représentées sous forme de points.",[20,154,155],{},"Par exemple, chaque point peut avoir deux caractéristiques :",[46,157,158,161],{},[49,159,160],{},"le poids ;",[49,162,163],{},"la taille.",[20,165,166],{},"Dans ce cas, chaque point devient un élément dans un espace à deux dimensions.",[20,168,169],{},"Le KNN cherche les points les plus proches du nouveau point à classer.",[15,171,173],{"id":172},"_4-la-distance-entre-deux-points","4. La distance entre deux points",[20,175,176],{},"Pour savoir quels sont les voisins les plus proches, il faut mesurer la distance.",[20,178,179],{},"La distance la plus connue est la distance euclidienne.",[89,181,183],{"id":182},"distance-euclidienne","Distance euclidienne",[20,185,186,187,190,191,194],{},"Si on a deux points ",[62,188,189],{},"(x1, y1)"," et ",[62,192,193],{},"(x2, y2)",", la distance euclidienne se calcule ainsi :",[196,197,203],"pre",{"className":198,"code":200,"language":201,"meta":202},[199],"language-text","racine((x2 - x1)^2 + (y2 - y1)^2)\n","text","",[62,204,200],{"__ignoreMap":202},[20,206,207],{},"En Python :",[196,209,213],{"className":210,"code":211,"language":212,"meta":202,"style":202},"language-python shiki shiki-themes github-light github-dark","import math\n\ndef euclidean_distance(a, b):\n    return math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2)\n","python",[62,214,215,228,235,248],{"__ignoreMap":202},[216,217,220,224],"span",{"class":218,"line":219},"line",1,[216,221,223],{"class":222},"szBVR","import",[216,225,227],{"class":226},"sVt8B"," math\n",[216,229,231],{"class":218,"line":230},2,[216,232,234],{"emptyLinePlaceholder":233},true,"\n",[216,236,238,241,245],{"class":218,"line":237},3,[216,239,240],{"class":222},"def",[216,242,244],{"class":243},"sScJk"," euclidean_distance",[216,246,247],{"class":226},"(a, b):\n",[216,249,251,254,257,261,264,267,270,272,275,278,281,284,287,290,292,294,296,298,300,302,304],{"class":218,"line":250},4,[216,252,253],{"class":222},"    return",[216,255,256],{"class":226}," math.sqrt((a[",[216,258,260],{"class":259},"sj4cs","0",[216,262,263],{"class":226},"] ",[216,265,266],{"class":222},"-",[216,268,269],{"class":226}," b[",[216,271,260],{"class":259},[216,273,274],{"class":226},"]) ",[216,276,277],{"class":222},"**",[216,279,280],{"class":259}," 2",[216,282,283],{"class":222}," +",[216,285,286],{"class":226}," (a[",[216,288,289],{"class":259},"1",[216,291,263],{"class":226},[216,293,266],{"class":222},[216,295,269],{"class":226},[216,297,289],{"class":259},[216,299,274],{"class":226},[216,301,277],{"class":222},[216,303,280],{"class":259},[216,305,306],{"class":226},")\n",[89,308,310],{"id":309},"pourquoi-la-distance-est-importante","Pourquoi la distance est importante",[20,312,313],{},"Sans distance, on ne peut pas dire quels sont les voisins les plus proches.",[20,315,316],{},"Le KNN a donc besoin d'une mesure pour comparer les exemples entre eux.",[15,318,320,321,323],{"id":319},"_5-que-signifie-k","5. Que signifie ",[62,322,64],{}," ?",[20,325,326,327,329],{},"Le ",[62,328,64],{}," représente le nombre de voisins qu'on prend en compte.",[89,331,333],{"id":332},"exemple","Exemple",[20,335,336,337,340],{},"Si ",[62,338,339],{},"k = 3",", on regarde les 3 points les plus proches.",[20,342,336,343,346],{},[62,344,345],{},"k = 5",", on regarde les 5 points les plus proches.",[20,348,349],{},"Ensuite, on choisit la classe qui revient le plus souvent.",[89,351,353],{"id":352},"petit-conseil","Petit conseil",[46,355,356,362],{},[49,357,358,359,361],{},"un ",[62,360,64],{}," trop petit peut rendre l'algorithme sensible au bruit ;",[49,363,358,364,366],{},[62,365,64],{}," trop grand peut diluer l'information locale.",[20,368,369],{},"Il faut donc trouver un équilibre.",[15,371,373],{"id":372},"_6-classification-et-régression","6. Classification et régression",[20,375,376],{},"Le KNN peut servir à deux choses différentes.",[89,378,380],{"id":379},"knn-pour-la-classification","KNN pour la classification",[20,382,383],{},"On prédit une catégorie.",[20,385,386],{},"Exemples :",[46,388,389,392,395],{},[49,390,391],{},"spam ou non spam ;",[49,393,394],{},"chien ou chat ;",[49,396,397],{},"malade ou sain.",[89,399,401],{"id":400},"knn-pour-la-régression","KNN pour la régression",[20,403,404],{},"On prédit une valeur numérique.",[20,406,386],{},[46,408,409,412,415],{},[49,410,411],{},"le prix d'une maison ;",[49,413,414],{},"une note ;",[49,416,417],{},"une estimation de température.",[20,419,420],{},"Dans ce tutoriel, nous allons surtout nous concentrer sur la classification, car c'est le cas le plus simple pour comprendre le principe.",[15,422,424],{"id":423},"_7-exemple-de-données","7. Exemple de données",[20,426,427],{},"Imaginons un petit jeu de données :",[196,429,431],{"className":210,"code":430,"language":212,"meta":202,"style":202},"training_data = [\n    ((1, 1), \"Rouge\"),\n    ((2, 1), \"Rouge\"),\n    ((2, 2), \"Rouge\"),\n    ((6, 5), \"Bleu\"),\n    ((7, 5), \"Bleu\"),\n    ((8, 6), \"Bleu\"),\n]\n",[62,432,433,444,466,483,499,519,537,555],{"__ignoreMap":202},[216,434,435,438,441],{"class":218,"line":219},[216,436,437],{"class":226},"training_data ",[216,439,440],{"class":222},"=",[216,442,443],{"class":226}," [\n",[216,445,446,449,451,454,456,459,463],{"class":218,"line":230},[216,447,448],{"class":226},"    ((",[216,450,289],{"class":259},[216,452,453],{"class":226},", ",[216,455,289],{"class":259},[216,457,458],{"class":226},"), ",[216,460,462],{"class":461},"sZZnC","\"Rouge\"",[216,464,465],{"class":226},"),\n",[216,467,468,470,473,475,477,479,481],{"class":218,"line":237},[216,469,448],{"class":226},[216,471,472],{"class":259},"2",[216,474,453],{"class":226},[216,476,289],{"class":259},[216,478,458],{"class":226},[216,480,462],{"class":461},[216,482,465],{"class":226},[216,484,485,487,489,491,493,495,497],{"class":218,"line":250},[216,486,448],{"class":226},[216,488,472],{"class":259},[216,490,453],{"class":226},[216,492,472],{"class":259},[216,494,458],{"class":226},[216,496,462],{"class":461},[216,498,465],{"class":226},[216,500,502,504,507,509,512,514,517],{"class":218,"line":501},5,[216,503,448],{"class":226},[216,505,506],{"class":259},"6",[216,508,453],{"class":226},[216,510,511],{"class":259},"5",[216,513,458],{"class":226},[216,515,516],{"class":461},"\"Bleu\"",[216,518,465],{"class":226},[216,520,522,524,527,529,531,533,535],{"class":218,"line":521},6,[216,523,448],{"class":226},[216,525,526],{"class":259},"7",[216,528,453],{"class":226},[216,530,511],{"class":259},[216,532,458],{"class":226},[216,534,516],{"class":461},[216,536,465],{"class":226},[216,538,540,542,545,547,549,551,553],{"class":218,"line":539},7,[216,541,448],{"class":226},[216,543,544],{"class":259},"8",[216,546,453],{"class":226},[216,548,506],{"class":259},[216,550,458],{"class":226},[216,552,516],{"class":461},[216,554,465],{"class":226},[216,556,558],{"class":218,"line":557},8,[216,559,560],{"class":226},"]\n",[20,562,563],{},"Chaque point possède :",[46,565,566,569],{},[49,567,568],{},"des coordonnées ;",[49,570,571,572,27,575,578],{},"une étiquette, ici ",[62,573,574],{},"Rouge",[62,576,577],{},"Bleu",".",[20,580,581],{},"Si on veut classer un nouveau point, on va comparer sa position aux points déjà connus.",[15,583,585],{"id":584},"_8-implémenter-un-knn-simple-en-python","8. Implémenter un KNN simple en Python",[20,587,588],{},"Voici une version complète et facile à lire.",[196,590,592],{"className":210,"code":591,"language":212,"meta":202,"style":202},"import math\nfrom collections import Counter\n\n\ndef euclidean_distance(a, b):\n    return math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2)\n\n\ndef knn_classify(training_data, point, k=3):\n    distances = []\n\n    for features, label in training_data:\n        distance = euclidean_distance(features, point)\n        distances.append((distance, label))\n\n    distances.sort(key=lambda item: item[0])\n    nearest_neighbors = distances[:k]\n\n    labels = [label for _, label in nearest_neighbors]\n    most_common = Counter(labels).most_common(1)\n\n    return most_common[0][0]\n",[62,593,594,600,613,617,621,629,673,677,681,700,711,716,731,742,748,753,774,785,790,812,827,832],{"__ignoreMap":202},[216,595,596,598],{"class":218,"line":219},[216,597,223],{"class":222},[216,599,227],{"class":226},[216,601,602,605,608,610],{"class":218,"line":230},[216,603,604],{"class":222},"from",[216,606,607],{"class":226}," collections ",[216,609,223],{"class":222},[216,611,612],{"class":226}," Counter\n",[216,614,615],{"class":218,"line":237},[216,616,234],{"emptyLinePlaceholder":233},[216,618,619],{"class":218,"line":250},[216,620,234],{"emptyLinePlaceholder":233},[216,622,623,625,627],{"class":218,"line":501},[216,624,240],{"class":222},[216,626,244],{"class":243},[216,628,247],{"class":226},[216,630,631,633,635,637,639,641,643,645,647,649,651,653,655,657,659,661,663,665,667,669,671],{"class":218,"line":521},[216,632,253],{"class":222},[216,634,256],{"class":226},[216,636,260],{"class":259},[216,638,263],{"class":226},[216,640,266],{"class":222},[216,642,269],{"class":226},[216,644,260],{"class":259},[216,646,274],{"class":226},[216,648,277],{"class":222},[216,650,280],{"class":259},[216,652,283],{"class":222},[216,654,286],{"class":226},[216,656,289],{"class":259},[216,658,263],{"class":226},[216,660,266],{"class":222},[216,662,269],{"class":226},[216,664,289],{"class":259},[216,666,274],{"class":226},[216,668,277],{"class":222},[216,670,280],{"class":259},[216,672,306],{"class":226},[216,674,675],{"class":218,"line":539},[216,676,234],{"emptyLinePlaceholder":233},[216,678,679],{"class":218,"line":557},[216,680,234],{"emptyLinePlaceholder":233},[216,682,684,686,689,692,694,697],{"class":218,"line":683},9,[216,685,240],{"class":222},[216,687,688],{"class":243}," knn_classify",[216,690,691],{"class":226},"(training_data, point, k",[216,693,440],{"class":222},[216,695,696],{"class":259},"3",[216,698,699],{"class":226},"):\n",[216,701,703,706,708],{"class":218,"line":702},10,[216,704,705],{"class":226},"    distances ",[216,707,440],{"class":222},[216,709,710],{"class":226}," []\n",[216,712,714],{"class":218,"line":713},11,[216,715,234],{"emptyLinePlaceholder":233},[216,717,719,722,725,728],{"class":218,"line":718},12,[216,720,721],{"class":222},"    for",[216,723,724],{"class":226}," features, label ",[216,726,727],{"class":222},"in",[216,729,730],{"class":226}," training_data:\n",[216,732,734,737,739],{"class":218,"line":733},13,[216,735,736],{"class":226},"        distance ",[216,738,440],{"class":222},[216,740,741],{"class":226}," euclidean_distance(features, point)\n",[216,743,745],{"class":218,"line":744},14,[216,746,747],{"class":226},"        distances.append((distance, label))\n",[216,749,751],{"class":218,"line":750},15,[216,752,234],{"emptyLinePlaceholder":233},[216,754,756,759,763,766,769,771],{"class":218,"line":755},16,[216,757,758],{"class":226},"    distances.sort(",[216,760,762],{"class":761},"s4XuR","key",[216,764,765],{"class":222},"=lambda",[216,767,768],{"class":226}," item: item[",[216,770,260],{"class":259},[216,772,773],{"class":226},"])\n",[216,775,777,780,782],{"class":218,"line":776},17,[216,778,779],{"class":226},"    nearest_neighbors ",[216,781,440],{"class":222},[216,783,784],{"class":226}," distances[:k]\n",[216,786,788],{"class":218,"line":787},18,[216,789,234],{"emptyLinePlaceholder":233},[216,791,793,796,798,801,804,807,809],{"class":218,"line":792},19,[216,794,795],{"class":226},"    labels ",[216,797,440],{"class":222},[216,799,800],{"class":226}," [label ",[216,802,803],{"class":222},"for",[216,805,806],{"class":226}," _, label ",[216,808,727],{"class":222},[216,810,811],{"class":226}," nearest_neighbors]\n",[216,813,815,818,820,823,825],{"class":218,"line":814},20,[216,816,817],{"class":226},"    most_common ",[216,819,440],{"class":222},[216,821,822],{"class":226}," Counter(labels).most_common(",[216,824,289],{"class":259},[216,826,306],{"class":226},[216,828,830],{"class":218,"line":829},21,[216,831,234],{"emptyLinePlaceholder":233},[216,833,835,837,840,842,845,847],{"class":218,"line":834},22,[216,836,253],{"class":222},[216,838,839],{"class":226}," most_common[",[216,841,260],{"class":259},[216,843,844],{"class":226},"][",[216,846,260],{"class":259},[216,848,560],{"class":226},[89,850,852],{"id":851},"explication-ligne-par-ligne","Explication ligne par ligne",[854,855,857],"h4",{"id":856},"distances",[62,858,859],{},"distances = []",[20,861,862],{},"On va stocker toutes les distances calculées.",[854,864,866],{"id":865},"for-features-label-in-training_data",[62,867,868],{},"for features, label in training_data",[20,870,871],{},"On parcourt chaque exemple connu.",[854,873,875],{"id":874},"distance-euclidean_distancefeatures-point",[62,876,877],{},"distance = euclidean_distance(features, point)",[20,879,880],{},"On mesure à quel point l'exemple est proche du nouveau point.",[854,882,884],{"id":883},"distancessortkeylambda-item-item0",[62,885,886],{},"distances.sort(key=lambda item: item[0])",[20,888,889],{},"On trie les distances du plus petit au plus grand.",[854,891,893],{"id":892},"nearest_neighbors-distancesk",[62,894,895],{},"nearest_neighbors = distances[:k]",[20,897,898,899,901],{},"On garde seulement les ",[62,900,64],{}," plus proches.",[854,903,905],{"id":904},"counterlabelsmost_common1",[62,906,907],{},"Counter(labels).most_common(1)",[20,909,910],{},"On compte quelle classe apparaît le plus souvent.",[15,912,914],{"id":913},"_9-tester-lalgorithme","9. Tester l'algorithme",[196,916,918],{"className":210,"code":917,"language":212,"meta":202,"style":202},"training_data = [\n    ((1, 1), \"Rouge\"),\n    ((2, 1), \"Rouge\"),\n    ((2, 2), \"Rouge\"),\n    ((6, 5), \"Bleu\"),\n    ((7, 5), \"Bleu\"),\n    ((8, 6), \"Bleu\"),\n]\n\nprint(knn_classify(training_data, (2, 1.5), k=3))\nprint(knn_classify(training_data, (7, 5.5), k=3))\n",[62,919,920,928,944,960,976,992,1008,1024,1028,1032,1058],{"__ignoreMap":202},[216,921,922,924,926],{"class":218,"line":219},[216,923,437],{"class":226},[216,925,440],{"class":222},[216,927,443],{"class":226},[216,929,930,932,934,936,938,940,942],{"class":218,"line":230},[216,931,448],{"class":226},[216,933,289],{"class":259},[216,935,453],{"class":226},[216,937,289],{"class":259},[216,939,458],{"class":226},[216,941,462],{"class":461},[216,943,465],{"class":226},[216,945,946,948,950,952,954,956,958],{"class":218,"line":237},[216,947,448],{"class":226},[216,949,472],{"class":259},[216,951,453],{"class":226},[216,953,289],{"class":259},[216,955,458],{"class":226},[216,957,462],{"class":461},[216,959,465],{"class":226},[216,961,962,964,966,968,970,972,974],{"class":218,"line":250},[216,963,448],{"class":226},[216,965,472],{"class":259},[216,967,453],{"class":226},[216,969,472],{"class":259},[216,971,458],{"class":226},[216,973,462],{"class":461},[216,975,465],{"class":226},[216,977,978,980,982,984,986,988,990],{"class":218,"line":501},[216,979,448],{"class":226},[216,981,506],{"class":259},[216,983,453],{"class":226},[216,985,511],{"class":259},[216,987,458],{"class":226},[216,989,516],{"class":461},[216,991,465],{"class":226},[216,993,994,996,998,1000,1002,1004,1006],{"class":218,"line":521},[216,995,448],{"class":226},[216,997,526],{"class":259},[216,999,453],{"class":226},[216,1001,511],{"class":259},[216,1003,458],{"class":226},[216,1005,516],{"class":461},[216,1007,465],{"class":226},[216,1009,1010,1012,1014,1016,1018,1020,1022],{"class":218,"line":539},[216,1011,448],{"class":226},[216,1013,544],{"class":259},[216,1015,453],{"class":226},[216,1017,506],{"class":259},[216,1019,458],{"class":226},[216,1021,516],{"class":461},[216,1023,465],{"class":226},[216,1025,1026],{"class":218,"line":557},[216,1027,560],{"class":226},[216,1029,1030],{"class":218,"line":683},[216,1031,234],{"emptyLinePlaceholder":233},[216,1033,1034,1037,1040,1042,1044,1047,1049,1051,1053,1055],{"class":218,"line":702},[216,1035,1036],{"class":259},"print",[216,1038,1039],{"class":226},"(knn_classify(training_data, (",[216,1041,472],{"class":259},[216,1043,453],{"class":226},[216,1045,1046],{"class":259},"1.5",[216,1048,458],{"class":226},[216,1050,64],{"class":761},[216,1052,440],{"class":222},[216,1054,696],{"class":259},[216,1056,1057],{"class":226},"))\n",[216,1059,1060,1062,1064,1066,1068,1071,1073,1075,1077,1079],{"class":218,"line":713},[216,1061,1036],{"class":259},[216,1063,1039],{"class":226},[216,1065,526],{"class":259},[216,1067,453],{"class":226},[216,1069,1070],{"class":259},"5.5",[216,1072,458],{"class":226},[216,1074,64],{"class":761},[216,1076,440],{"class":222},[216,1078,696],{"class":259},[216,1080,1057],{"class":226},[20,1082,1083],{},"Résultat attendu :",[196,1085,1088],{"className":1086,"code":1087,"language":201,"meta":202},[199],"Rouge\nBleu\n",[62,1089,1087],{"__ignoreMap":202},[15,1091,1093],{"id":1092},"_10-pourquoi-ce-code-est-intéressant","10. Pourquoi ce code est intéressant",[20,1095,1096],{},"Ce code n'est pas optimisé pour de très grandes bases de données, mais il est excellent pour comprendre la logique du KNN.",[20,1098,1099],{},"Il montre clairement :",[46,1101,1102,1105,1108],{},[49,1103,1104],{},"le calcul des distances ;",[49,1106,1107],{},"le tri des voisins ;",[49,1109,1110],{},"le vote majoritaire.",[15,1112,1114],{"id":1113},"_11-les-limites-du-knn","11. Les limites du KNN",[20,1116,1117],{},"Le KNN est simple, mais il a aussi des limites.",[89,1119,1121],{"id":1120},"_1-il-peut-devenir-lent","1. Il peut devenir lent",[20,1123,1124],{},"Pour chaque nouvelle prédiction, il doit comparer le point avec beaucoup d'exemples.",[89,1126,1128],{"id":1127},"_2-il-dépend-des-données","2. Il dépend des données",[20,1130,1131],{},"Si les données d'entraînement sont mal choisies ou bruitées, les prédictions seront moins bonnes.",[89,1133,1135],{"id":1134},"_3-il-dépend-de-léchelle-des-variables","3. Il dépend de l'échelle des variables",[20,1137,1138],{},"Si une variable varie entre 0 et 1 et qu'une autre varie entre 0 et 10 000, la plus grande peut dominer la distance.",[20,1140,1141],{},"C'est pour cela qu'on normalise souvent les données avant d'utiliser KNN.",[15,1143,1145],{"id":1144},"_12-la-normalisation","12. La normalisation",[20,1147,1148],{},"La normalisation consiste à mettre les variables sur une échelle plus comparable.",[20,1150,1151],{},"Par exemple :",[46,1153,1154,1156,1158],{},[49,1155,120],{},[49,1157,117],{},[49,1159,1160],{},"âge.",[20,1162,1163],{},"Si l'une des variables a des valeurs très grandes, elle risque d'écraser les autres dans le calcul de distance.",[20,1165,1166],{},"En pratique, c'est une étape très importante.",[15,1168,1170,1171,323],{"id":1169},"_13-comment-choisir-k","13. Comment choisir ",[62,1172,64],{},[20,1174,1175],{},"Il n'existe pas une valeur magique.",[20,1177,1178,1179,1181],{},"On choisit souvent ",[62,1180,64],{}," en testant plusieurs valeurs et en observant les résultats.",[89,1183,1185],{"id":1184},"règles-simples","Règles simples",[46,1187,1188,1194,1200],{},[49,1189,1190,1193],{},[62,1191,1192],{},"k = 1"," est très sensible aux cas isolés ;",[49,1195,1196,1197,1199],{},"un petit ",[62,1198,64],{}," capture les détails locaux ;",[49,1201,1202,1203,1205],{},"un grand ",[62,1204,64],{}," lisse davantage les résultats.",[20,1207,1208],{},"En général, on cherche une valeur équilibrée qui fonctionne bien sur les données réelles.",[15,1210,1212],{"id":1211},"_14-variante-avec-dautres-distances","14. Variante avec d'autres distances",[20,1214,1215],{},"La distance euclidienne n'est pas la seule possibilité.",[20,1217,1218],{},"On peut aussi utiliser :",[46,1220,1221,1224,1227],{},[49,1222,1223],{},"la distance de Manhattan ;",[49,1225,1226],{},"la distance de Minkowski ;",[49,1228,1229],{},"d'autres mesures selon le contexte.",[20,1231,1232],{},"Le choix dépend du type de données et du problème à résoudre.",[15,1234,1236],{"id":1235},"_15-erreurs-fréquentes","15. Erreurs fréquentes",[89,1238,1240],{"id":1239},"oublier-de-normaliser-les-données","Oublier de normaliser les données",[20,1242,1243],{},"C'est une erreur très courante avec KNN.",[89,1245,1247,1248,1250],{"id":1246},"choisir-un-k-trop-petit","Choisir un ",[62,1249,64],{}," trop petit",[20,1252,1253],{},"Le modèle devient trop sensible aux exceptions.",[89,1255,1247,1257,1259],{"id":1256},"choisir-un-k-trop-grand",[62,1258,64],{}," trop grand",[20,1261,1262],{},"Le modèle perd en précision locale.",[89,1264,1266],{"id":1265},"mélanger-classification-et-régression","Mélanger classification et régression",[20,1268,1269],{},"Le vote majoritaire sert à la classification. Pour la régression, on prend plutôt une moyenne des valeurs voisines.",[15,1271,1273],{"id":1272},"_16-knn-en-résumé","16. KNN en résumé",[20,1275,1276],{},"Le KNN est un algorithme simple, intuitif et très pratique pour apprendre les bases du machine learning.",[20,1278,1279],{},"À retenir :",[46,1281,1282,1285,1288,1294,1297],{},[49,1283,1284],{},"on compare un nouvel élément à ses voisins ;",[49,1286,1287],{},"on utilise une mesure de distance ;",[49,1289,1290,1291,1293],{},"on choisit les ",[62,1292,64],{}," plus proches ;",[49,1295,1296],{},"on prend la majorité pour classer ;",[49,1298,1299],{},"il faut souvent normaliser les données.",[15,1301,1303],{"id":1302},"exercices","Exercices",[89,1305,1307],{"id":1306},"exercice-1","Exercice 1",[20,1309,1310,1311,578],{},"Implémentez la fonction ",[62,1312,1313],{},"euclidean_distance",[89,1315,1317],{"id":1316},"exercice-2","Exercice 2",[20,1319,1320],{},"Ajoutez un troisième point à la base d'entraînement et testez une nouvelle prédiction.",[89,1322,1324],{"id":1323},"exercice-3","Exercice 3",[20,1326,1327],{},"Modifiez le code pour afficher les voisins les plus proches avant de retourner la classe.",[89,1329,1331],{"id":1330},"exercice-4","Exercice 4",[20,1333,1334,1335,453,1337,190,1339,578],{},"Essayez avec ",[62,1336,1192],{},[62,1338,339],{},[62,1340,345],{},[15,1342,1344],{"id":1343},"corrigés","Corrigés",[89,1346,1348],{"id":1347},"correction-exercice-1","Correction exercice 1",[196,1350,1352],{"className":210,"code":1351,"language":212,"meta":202,"style":202},"def euclidean_distance(a, b):\n    return math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2)\n",[62,1353,1354,1362],{"__ignoreMap":202},[216,1355,1356,1358,1360],{"class":218,"line":219},[216,1357,240],{"class":222},[216,1359,244],{"class":243},[216,1361,247],{"class":226},[216,1363,1364,1366,1368,1370,1372,1374,1376,1378,1380,1382,1384,1386,1388,1390,1392,1394,1396,1398,1400,1402,1404],{"class":218,"line":230},[216,1365,253],{"class":222},[216,1367,256],{"class":226},[216,1369,260],{"class":259},[216,1371,263],{"class":226},[216,1373,266],{"class":222},[216,1375,269],{"class":226},[216,1377,260],{"class":259},[216,1379,274],{"class":226},[216,1381,277],{"class":222},[216,1383,280],{"class":259},[216,1385,283],{"class":222},[216,1387,286],{"class":226},[216,1389,289],{"class":259},[216,1391,263],{"class":226},[216,1393,266],{"class":222},[216,1395,269],{"class":226},[216,1397,289],{"class":259},[216,1399,274],{"class":226},[216,1401,277],{"class":222},[216,1403,280],{"class":259},[216,1405,306],{"class":226},[89,1407,1409],{"id":1408},"correction-exercice-4","Correction exercice 4",[196,1411,1413],{"className":210,"code":1412,"language":212,"meta":202,"style":202},"print(knn_classify(training_data, (2, 1.5), k=1))\nprint(knn_classify(training_data, (2, 1.5), k=3))\nprint(knn_classify(training_data, (2, 1.5), k=5))\n",[62,1414,1415,1437,1459],{"__ignoreMap":202},[216,1416,1417,1419,1421,1423,1425,1427,1429,1431,1433,1435],{"class":218,"line":219},[216,1418,1036],{"class":259},[216,1420,1039],{"class":226},[216,1422,472],{"class":259},[216,1424,453],{"class":226},[216,1426,1046],{"class":259},[216,1428,458],{"class":226},[216,1430,64],{"class":761},[216,1432,440],{"class":222},[216,1434,289],{"class":259},[216,1436,1057],{"class":226},[216,1438,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457],{"class":218,"line":230},[216,1440,1036],{"class":259},[216,1442,1039],{"class":226},[216,1444,472],{"class":259},[216,1446,453],{"class":226},[216,1448,1046],{"class":259},[216,1450,458],{"class":226},[216,1452,64],{"class":761},[216,1454,440],{"class":222},[216,1456,696],{"class":259},[216,1458,1057],{"class":226},[216,1460,1461,1463,1465,1467,1469,1471,1473,1475,1477,1479],{"class":218,"line":237},[216,1462,1036],{"class":259},[216,1464,1039],{"class":226},[216,1466,472],{"class":259},[216,1468,453],{"class":226},[216,1470,1046],{"class":259},[216,1472,458],{"class":226},[216,1474,64],{"class":761},[216,1476,440],{"class":222},[216,1478,511],{"class":259},[216,1480,1057],{"class":226},[15,1482,1484],{"id":1483},"prochaine-étape","Prochaine étape",[20,1486,1487],{},"Une fois le KNN compris, vous pouvez explorer d'autres algorithmes de machine learning plus avancés, comme les arbres de décision ou la régression logistique.",[1489,1490,1491],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":202,"searchDepth":230,"depth":230,"links":1493},[1494,1495,1496,1499,1500,1501,1505,1510,1514,1515,1518,1519,1520,1525,1526,1530,1531,1539,1540,1546,1550],{"id":17,"depth":230,"text":18},{"id":40,"depth":230,"text":41},{"id":77,"depth":230,"text":78,"children":1497},[1498],{"id":91,"depth":237,"text":92},{"id":132,"depth":230,"text":133},{"id":148,"depth":230,"text":149},{"id":172,"depth":230,"text":173,"children":1502},[1503,1504],{"id":182,"depth":237,"text":183},{"id":309,"depth":237,"text":310},{"id":319,"depth":230,"text":1506,"children":1507},"5. Que signifie k ?",[1508,1509],{"id":332,"depth":237,"text":333},{"id":352,"depth":237,"text":353},{"id":372,"depth":230,"text":373,"children":1511},[1512,1513],{"id":379,"depth":237,"text":380},{"id":400,"depth":237,"text":401},{"id":423,"depth":230,"text":424},{"id":584,"depth":230,"text":585,"children":1516},[1517],{"id":851,"depth":237,"text":852},{"id":913,"depth":230,"text":914},{"id":1092,"depth":230,"text":1093},{"id":1113,"depth":230,"text":1114,"children":1521},[1522,1523,1524],{"id":1120,"depth":237,"text":1121},{"id":1127,"depth":237,"text":1128},{"id":1134,"depth":237,"text":1135},{"id":1144,"depth":230,"text":1145},{"id":1169,"depth":230,"text":1527,"children":1528},"13. Comment choisir k ?",[1529],{"id":1184,"depth":237,"text":1185},{"id":1211,"depth":230,"text":1212},{"id":1235,"depth":230,"text":1236,"children":1532},[1533,1534,1536,1538],{"id":1239,"depth":237,"text":1240},{"id":1246,"depth":237,"text":1535},"Choisir un k trop petit",{"id":1256,"depth":237,"text":1537},"Choisir un k trop grand",{"id":1265,"depth":237,"text":1266},{"id":1272,"depth":230,"text":1273},{"id":1302,"depth":230,"text":1303,"children":1541},[1542,1543,1544,1545],{"id":1306,"depth":237,"text":1307},{"id":1316,"depth":237,"text":1317},{"id":1323,"depth":237,"text":1324},{"id":1330,"depth":237,"text":1331},{"id":1343,"depth":230,"text":1344,"children":1547},[1548,1549],{"id":1347,"depth":237,"text":1348},{"id":1408,"depth":237,"text":1409},{"id":1483,"depth":230,"text":1484},null,"Un tutoriel simple et complet pour comprendre le KNN, savoir comment il fonctionne, comment choisir k et comment l'implémenter en Python.","md",{},"\u002Fblog\u002Fcomprendre-le-knn","2026-06-09",{"title":5,"description":1552},"blog\u002Fcomprendre-le-knn",[1560,1561,1562,1563],"Machine Learning","KNN","Python","Algorithmes","vAHUyz3_uYq2wlAqspxv7WlNfZU37pRjOfrD1bOGNbY",1788219651038]