[{"data":1,"prerenderedAt":762},["ShallowReactive",2],{"lang-switch-post-\u002Fplaylists\u002Fpattern-recognition\u002Fknn-classifier":3,"post-pt-pattern-recognition-knn-classifier":4},"\u002Fen\u002Fplaylists\u002Fpattern-recognition\u002Fknn-classifier",{"id":5,"title":6,"body":7,"cover":747,"date":748,"description":749,"extension":750,"meta":751,"navigation":117,"order":66,"path":752,"playlist":753,"seo":754,"status":755,"stem":756,"tags":757,"__hash__":761},"posts\u002Fpt\u002Fplaylists\u002Fpattern-recognition\u002Fknn-classifier.md","KNN: Classificar Olhando pros Vizinhos",{"type":8,"value":9,"toc":738},"minimark",[10,14,19,35,70,74,81,178,190,203,478,482,491,504,507,511,514,567,574,583,587,602,606,648,652,655,670,720,734],[11,12,13],"p",{},"Aula 4a: KNN, o modelo mais \"sem modelo\" que existe. Não tem coeficiente pra ajustar, não tem gradiente, não tem equação normal. É só uma régua.",[15,16,18],"h2",{"id":17},"o-dataset-vinhos-3-castas","O dataset: vinhos, 3 castas",[11,20,21,22,26,27,30,31,34],{},"Dataset novo: ",[23,24,25],"code",{},"load_wine",", 178 garrafas, 13 medidas químicas (teor alcoólico, acidez, magnésio, e por aí vai) e 3 classes, a casta da uva. O professor escolhe duas colunas pra poder plotar num plano: ",[23,28,29],{},"flavanoids"," (índice 6) e ",[23,32,33],{},"color_intensity"," (índice 9).",[36,37,42],"pre",{"className":38,"code":39,"language":40,"meta":41,"style":41},"language-python shiki shiki-themes github-light github-dark","from sklearn.datasets import load_wine\nX, y = load_wine(return_X_y=True)\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\nfeats = [6, 9]\n","python","",[23,43,44,52,58,64],{"__ignoreMap":41},[45,46,49],"span",{"class":47,"line":48},"line",1,[45,50,51],{},"from sklearn.datasets import load_wine\n",[45,53,55],{"class":47,"line":54},2,[45,56,57],{},"X, y = load_wine(return_X_y=True)\n",[45,59,61],{"class":47,"line":60},3,[45,62,63],{},"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n",[45,65,67],{"class":47,"line":66},4,[45,68,69],{},"feats = [6, 9]\n",[15,71,73],{"id":72},"a-ideia-não-existe-treino-só-memória","A ideia: não existe treino, só memória",[11,75,76,77,80],{},"Todo modelo que eu já vi até aqui (regressão, o classificador limiarizado) ajusta parâmetros: acha um ",[23,78,79],{},"w"," que minimiza algum erro. KNN não faz nada disso. O \"treino\" dele é literalmente guardar os dados:",[36,82,84],{"className":38,"code":83,"language":40,"meta":41,"style":41},"class K1NN(BaseEstimator, ClassifierMixin):\n    def fit(self, X, y):\n        self.X = X\n        self.y = y\n        return self\n\n    def distance_(self, x):\n        return np.sum((self.X - x)**2, axis=1)**0.5\n\n    def predict(self, X):\n        y_pred = np.empty((X.shape[0],))\n        for i, x in enumerate(X):\n            distances = self.distance_(x)\n            min_idx = np.argmin(distances)\n            y_pred[i] = self.y[min_idx]\n        return y_pred\n",[23,85,86,91,96,101,106,112,119,125,131,136,142,148,154,160,166,172],{"__ignoreMap":41},[45,87,88],{"class":47,"line":48},[45,89,90],{},"class K1NN(BaseEstimator, ClassifierMixin):\n",[45,92,93],{"class":47,"line":54},[45,94,95],{},"    def fit(self, X, y):\n",[45,97,98],{"class":47,"line":60},[45,99,100],{},"        self.X = X\n",[45,102,103],{"class":47,"line":66},[45,104,105],{},"        self.y = y\n",[45,107,109],{"class":47,"line":108},5,[45,110,111],{},"        return self\n",[45,113,115],{"class":47,"line":114},6,[45,116,118],{"emptyLinePlaceholder":117},true,"\n",[45,120,122],{"class":47,"line":121},7,[45,123,124],{},"    def distance_(self, x):\n",[45,126,128],{"class":47,"line":127},8,[45,129,130],{},"        return np.sum((self.X - x)**2, axis=1)**0.5\n",[45,132,134],{"class":47,"line":133},9,[45,135,118],{"emptyLinePlaceholder":117},[45,137,139],{"class":47,"line":138},10,[45,140,141],{},"    def predict(self, X):\n",[45,143,145],{"class":47,"line":144},11,[45,146,147],{},"        y_pred = np.empty((X.shape[0],))\n",[45,149,151],{"class":47,"line":150},12,[45,152,153],{},"        for i, x in enumerate(X):\n",[45,155,157],{"class":47,"line":156},13,[45,158,159],{},"            distances = self.distance_(x)\n",[45,161,163],{"class":47,"line":162},14,[45,164,165],{},"            min_idx = np.argmin(distances)\n",[45,167,169],{"class":47,"line":168},15,[45,170,171],{},"            y_pred[i] = self.y[min_idx]\n",[45,173,175],{"class":47,"line":174},16,[45,176,177],{},"        return y_pred\n",[11,179,180,181,185,186,189],{},"Pra classificar um vinho novo, ele calcula a distância euclidiana até ",[182,183,184],"strong",{},"todo"," vinho do treino, acha o mais parecido, e copia a classe dele. Chama isso de ",[182,187,188],{},"K1NN"," porque olha só pro vizinho mais próximo, K=1.",[191,192,193],"blockquote",{},[11,194,195,198,199,202],{},[182,196,197],{},"Saída:"," acurácia de 0.97 no teste. Idêntica ao ",[23,200,201],{},"KNeighborsClassifier(n_neighbors=1)"," do scikit-learn, rodado nos mesmos dados.",[11,204,205,206,252,253,355,356,384,385,413,414,417,418,477],{},"O Bishop trata isso como um caso particular de um resultado mais geral (capítulo 2.5.2): se você desenha uma esfera em volta de um ponto novo até ela conter exatamente ",[45,207,210,232],{"className":208},[209],"katex",[45,211,214],{"className":212},[213],"katex-mathml",[215,216,218],"math",{"xmlns":217},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[219,220,221,228],"semantics",{},[222,223,224],"mrow",{},[225,226,227],"mi",{},"K",[229,230,227],"annotation",{"encoding":231},"application\u002Fx-tex",[45,233,237],{"className":234,"ariaHidden":236},[235],"katex-html","true",[45,238,241,246],{"className":239},[240],"base",[45,242],{"className":243,"style":245},[244],"strut","height:0.6833em;",[45,247,227],{"className":248,"style":251},[249,250],"mord","mathnormal","margin-right:0.0715em;"," vizinhos, e olha qual classe é maioria entre eles, a probabilidade posterior de cada classe é simplesmente ",[45,254,256,282],{"className":255},[209],[45,257,259],{"className":258},[213],[215,260,261],{"xmlns":217},[219,262,263,279],{},[222,264,265,273,277],{},[266,267,268,270],"msub",{},[225,269,227],{},[225,271,272],{},"k",[225,274,276],{"mathvariant":275},"normal","\u002F",[225,278,227],{},[229,280,281],{"encoding":231},"K_k\u002FK",[45,283,285],{"className":284,"ariaHidden":236},[235],[45,286,288,292,349,352],{"className":287},[240],[45,289],{"className":290,"style":291},[244],"height:1em;vertical-align:-0.25em;",[45,293,295,298],{"className":294},[249],[45,296,227],{"className":297,"style":251},[249,250],[45,299,302],{"className":300},[301],"msupsub",[45,303,307,340],{"className":304},[305,306],"vlist-t","vlist-t2",[45,308,311,335],{"className":309},[310],"vlist-r",[45,312,316],{"className":313,"style":315},[314],"vlist","height:0.3361em;",[45,317,319,324],{"style":318},"top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;",[45,320],{"className":321,"style":323},[322],"pstrut","height:2.7em;",[45,325,331],{"className":326},[327,328,329,330],"sizing","reset-size6","size3","mtight",[45,332,272],{"className":333,"style":334},[249,250,330],"margin-right:0.0315em;",[45,336,339],{"className":337},[338],"vlist-s","​",[45,341,343],{"className":342},[310],[45,344,347],{"className":345,"style":346},[314],"height:0.15em;",[45,348],{},[45,350,276],{"className":351},[249],[45,353,227],{"className":354,"style":251},[249,250]," (a fração dos ",[45,357,359,372],{"className":358},[209],[45,360,362],{"className":361},[213],[215,363,364],{"xmlns":217},[219,365,366,370],{},[222,367,368],{},[225,369,227],{},[229,371,227],{"encoding":231},[45,373,375],{"className":374,"ariaHidden":236},[235],[45,376,378,381],{"className":377},[240],[45,379],{"className":380,"style":245},[244],[45,382,227],{"className":383,"style":251},[249,250]," vizinhos que pertence àquela classe). Classificar pela classe mais comum entre os ",[45,386,388,401],{"className":387},[209],[45,389,391],{"className":390},[213],[215,392,393],{"xmlns":217},[219,394,395,399],{},[222,396,397],{},[225,398,227],{},[229,400,227],{"encoding":231},[45,402,404],{"className":403,"ariaHidden":236},[235],[45,405,407,410],{"className":406},[240],[45,408],{"className":409,"style":245},[244],[45,411,227],{"className":412,"style":251},[249,250]," vizinhos mais próximos ",[182,415,416],{},"é"," aplicar Bayes nesse resultado. ",[45,419,421,443],{"className":420},[209],[45,422,424],{"className":423},[213],[215,425,426],{"xmlns":217},[219,427,428,440],{},[222,429,430,432,436],{},[225,431,227],{},[433,434,435],"mo",{},"=",[437,438,439],"mn",{},"1",[229,441,442],{"encoding":231},"K=1",[45,444,446,467],{"className":445,"ariaHidden":236},[235],[45,447,449,452,455,460,464],{"className":448},[240],[45,450],{"className":451,"style":245},[244],[45,453,227],{"className":454,"style":251},[249,250],[45,456],{"className":457,"style":459},[458],"mspace","margin-right:0.2778em;",[45,461,435],{"className":462},[463],"mrel",[45,465],{"className":466,"style":459},[458],[45,468,470,474],{"className":469},[240],[45,471],{"className":472,"style":473},[244],"height:0.6444em;",[45,475,439],{"className":476},[249]," é só o caso mais extremo: a \"esfera\" cresce até tocar um único ponto, e você copia a classe dele sem votação nenhuma.",[15,479,481],{"id":480},"interativo-mexendo-no-k-de-verdade","Interativo: mexendo no K de verdade",[11,483,484,485,487,488,490],{},"Em vez de rodar célula por célula pra cada K como o notebook faz, dá pra ver a fronteira de decisão mudando ao vivo. Isso é reconstrução minha em cima dos 142 vinhos reais do treino (as mesmas duas colunas, ",[23,486,29],{}," e ",[23,489,33],{},"), rodando o mesmo algoritmo de voto por maioria:",[492,493],"knn-decision-explorer",{":classes":494,":initial-k":439,":x-max":495,":x-min":496,":x-train":497,":y-max":498,":y-min":499,":y-train":500,"class0-label":501,"class1-label":502,"class2-label":503,"x-label":29,"y-label":33},"[2, 2, 1, 2, 0, 1, 1, 1, 2, 0, 1, 1, 2, 0, 1, 0, 0, 2, 2, 1, 1, 0, 1, 0, 2, 1, 1, 2, 0, 0, 0, 2, 0, 0, 1, 2, 1, 0, 2, 1, 0, 2, 1, 1, 0, 1, 0, 0, 1, 0, 0, 2, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 2, 1, 1, 0, 1, 2, 2, 1, 2, 1, 1, 1, 0, 0, 2, 0, 2, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 2, 1, 1, 1, 2, 2, 1, 0, 0, 1, 2, 2, 0, 1, 2, 2, 2, 2, 1, 0, 1, 0, 2, 0, 0, 1, 0, 0, 2, 1, 0, 2, 2, 0, 0, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 0, 1, 1]","5.3","0","[1.31, 0.6, 3.75, 1.1, 2.64, 2.04, 1.94, 1.3, 0.8, 3.24, 2.17, 2.13, 0.58, 2.99, 2.03, 3.0, 2.94, 0.83, 0.48, 1.92, 1.85, 2.68, 2.25, 2.88, 0.34, 2.5, 1.28, 0.66, 2.43, 2.52, 2.19, 0.78, 2.69, 2.69, 2.27, 0.49, 1.57, 3.32, 0.65, 2.65, 3.06, 0.52, 3.15, 1.75, 3.0, 0.99, 2.97, 3.29, 2.24, 2.68, 2.37, 1.09, 2.53, 2.55, 2.21, 3.04, 1.36, 1.69, 2.79, 0.61, 0.6, 3.39, 2.26, 0.66, 0.92, 1.41, 2.89, 2.74, 2.65, 1.2, 0.6, 1.79, 0.68, 2.03, 2.17, 1.84, 2.79, 3.39, 0.92, 3.49, 0.47, 3.54, 2.98, 2.26, 1.32, 2.53, 3.17, 2.51, 3.03, 2.63, 1.02, 0.47, 2.58, 1.25, 1.59, 0.83, 0.56, 1.59, 2.98, 3.69, 0.57, 1.28, 1.22, 3.4, 1.84, 0.63, 0.58, 0.76, 0.7, 3.1, 2.9, 1.76, 3.27, 0.69, 3.67, 2.92, 1.69, 2.41, 3.23, 0.7, 1.75, 2.43, 0.58, 0.84, 2.76, 3.74, 1.39, 1.25, 1.36, 1.64, 2.99, 1.6, 1.61, 2.14, 5.08, 0.76, 3.17, 2.86, 2.03, 3.64, 1.46, 2.11]","13.2","1.5","[13.0, 5.0, 4.5, 11.75, 3.7, 2.7, 2.62, 3.17, 4.4, 5.68, 3.3, 2.08, 7.6, 5.6, 4.6, 6.38, 4.8, 10.52, 5.7, 2.94, 3.4, 4.6, 2.15, 3.8, 4.9, 2.9, 2.85, 10.26, 5.0, 5.25, 3.95, 8.21, 4.32, 3.84, 2.6, 5.5, 3.8, 5.75, 7.65, 2.6, 5.64, 4.35, 3.94, 2.95, 5.04, 2.5, 4.5, 6.13, 3.0, 3.58, 3.93, 5.7, 3.9, 2.57, 3.05, 5.1, 2.45, 2.45, 3.25, 7.7, 5.58, 6.1, 3.25, 7.1, 10.68, 5.75, 3.35, 5.4, 2.76, 5.0, 4.92, 3.8, 9.3, 3.8, 1.9, 2.7, 6.3, 6.75, 7.65, 7.8, 6.62, 8.9, 5.1, 2.5, 2.65, 4.2, 4.9, 5.05, 2.8, 4.36, 3.05, 3.85, 2.9, 3.6, 4.8, 9.01, 5.88, 1.74, 5.2, 5.4, 1.95, 7.1, 5.4, 6.6, 3.74, 7.9, 5.45, 8.42, 5.28, 4.45, 5.85, 3.3, 7.2, 10.2, 6.8, 6.2, 2.8, 4.5, 6.0, 9.7, 2.6, 4.25, 7.5, 8.66, 4.38, 7.05, 9.4, 4.1, 10.8, 2.06, 2.3, 1.95, 2.6, 3.21, 6.0, 9.2, 5.65, 3.38, 3.4, 7.5, 3.05, 2.8]","Casta 0","Casta 1","Casta 2",[11,505,506],{},"Clica em cada valor de K e repara: com K=1, as regiões coloridas têm um monte de ilhazinhas isoladas, cada uma abraçando um único ponto de treino, a fronteira fica toda picotada. Com K maior, as ilhas somem e as regiões viram blocos mais lisos e contínuos.",[15,508,510],{"id":509},"k-é-um-parâmetro-de-suavização-não-quanto-maior-melhor","K é um parâmetro de suavização, não \"quanto maior melhor\"",[11,512,513],{},"O professor testa K=1, 3, 5, 13 nos dados de teste de verdade:",[515,516,517,531],"table",{},[518,519,520],"thead",{},[521,522,523,527],"tr",{},[524,525,227],"th",{"align":526},"center",[524,528,530],{"align":529},"right","Acurácia",[532,533,534,544,552,559],"tbody",{},[521,535,536,539],{},[537,538,439],"td",{"align":526},[537,540,541],{"align":529},[182,542,543],{},"0.97",[521,545,546,549],{},[537,547,548],{"align":526},"3",[537,550,551],{"align":529},"0.92",[521,553,554,557],{},[537,555,556],{"align":526},"5",[537,558,551],{"align":529},[521,560,561,564],{},[537,562,563],{"align":526},"13",[537,565,566],{"align":529},"0.89",[11,568,569,570,573],{},"Contra-intuitivo à primeira vista: eu esperaria que olhar mais vizinhos desse um resultado mais \"confiável\", mas aqui a acurácia só piora conforme K cresce. O Bishop chama K exatamente disso, um ",[182,571,572],{},"parâmetro de suavização",": K pequeno deixa a fronteira de decisão bem apertada em volta dos dados de treino (baixo viés, mas sensível a cada ponto individual, inclusive ruído), enquanto K grande borra a fronteira, misturando vizinhos de regiões diferentes na votação (mais viés, menos sensível a ruído). Nesse dataset específico, com só 142 pontos de treino espalhados em 3 classes, aumentar K começa a puxar vizinhos de outra casta pra dentro do voto rápido demais, então o ponto ótimo aqui está bem perto de K=1.",[11,575,576,577,582],{},"Isso não quer dizer \"sempre use K=1\". O Bishop cita um resultado interessante: no limite de infinitos dados de treino, o classificador de vizinho mais próximo (K=1) nunca comete mais que o dobro do erro do classificador ótimo teoricamente possível, uma garantia surpreendentemente boa pra um método tão simples. Mas com pouco dado (como aqui, 142 pontos), K=1 pode estar só \"decorando\" o treino, e a escolha certa de K é uma pergunta empírica, não uma regra fixa. Vou voltar nisso com mais rigor (validação, não só \"testei e vi que K=1 ganhou\") ",[578,579,581],"a",{"href":580},"\u002Fplaylists\u002Fpattern-recognition\u002Fpipeline-cross-validation","no próximo post",".",[15,584,586],{"id":585},"um-lembrete-rápido-distância-também-pede-normalização","Um lembrete rápido: distância também pede normalização",[11,588,589,590,594,595,598,599,582],{},"Eu já vi isso ",[578,591,593],{"href":592},"\u002Fplaylists\u002Fpattern-recognition\u002Fclassification-threshold","no post anterior",": como o KNN decide por distância, uma variável de escala grande domina a conta sozinha. Aqui não é diferente, e ",[578,596,597],{"href":580},"o próximo post (bônus)"," mostra o tamanho real do estrago e o jeito certo de evitar, com ",[23,600,601],{},"Pipeline",[15,603,605],{"id":604},"fechando","Fechando",[515,607,608,619],{},[518,609,610],{},[521,611,612,616],{},[524,613,615],{"align":614},"left","O que eu já sabia",[524,617,618],{"align":614},"O que essa aula assentou",[532,620,621,629,640],{},[521,622,623,626],{},[537,624,625],{"align":614},"Regressão e classificação limiarizada ajustam parâmetros",[537,627,628],{"align":614},"KNN não ajusta nada, \"treinar\" é só guardar os dados e comparar distância na hora de prever",[521,630,631,634],{},[537,632,633],{"align":614},"Bayes conecta probabilidade condicional e prior",[537,635,636,637,639],{"align":614},"A regra de votar pela classe mais comum entre os K vizinhos ",[182,638,416],{}," uma aplicação direta de Bayes numa estimativa de densidade local",[521,641,642,645],{},[537,643,644],{"align":614},"Hiperparâmetro é algo que eu escolho, não que o modelo aprende",[537,646,647],{"align":614},"K é o exemplo mais direto disso: nem grande nem pequeno demais, o valor certo depende dos dados que eu tenho",[15,649,651],{"id":650},"aplicação-prática","Aplicação Prática",[11,653,654],{},"Uso o mesmo dataset de vinhos, agora com as 13 variáveis (não só as 2 que dava pra plotar), pra ver o efeito da normalização na prática, uma coisa que eu só descrevi em palavras até aqui.",[36,656,658],{"className":38,"code":657,"language":40,"meta":41,"style":41},"model_raw = KNeighborsClassifier(n_neighbors=k).fit(X_train, y_train)\nmodel_norm = KNeighborsClassifier(n_neighbors=k).fit(X_train_normalizado, y_train)\n",[23,659,660,665],{"__ignoreMap":41},[45,661,662],{"class":47,"line":48},[45,663,664],{},"model_raw = KNeighborsClassifier(n_neighbors=k).fit(X_train, y_train)\n",[45,666,667],{"class":47,"line":54},[45,668,669],{},"model_norm = KNeighborsClassifier(n_neighbors=k).fit(X_train_normalizado, y_train)\n",[515,671,672,684],{},[518,673,674],{},[521,675,676,678,681],{},[524,677,227],{"align":526},[524,679,680],{"align":529},"Sem normalizar",[524,682,683],{"align":529},"Normalizado",[532,685,686,698,709],{},[521,687,688,690,693],{},[537,689,439],{"align":526},[537,691,692],{"align":529},"0.7778",[537,694,695],{"align":529},[182,696,697],{},"0.9444",[521,699,700,702,705],{},[537,701,548],{"align":526},[537,703,704],{"align":529},"0.8056",[537,706,707],{"align":529},[182,708,697],{},[521,710,711,713,716],{},[537,712,556],{"align":526},[537,714,715],{"align":529},"0.7222",[537,717,718],{"align":529},[182,719,697],{},[11,721,722,723,726,727,730,731,733],{},"Sem normalizar, a acurácia varia bastante e nunca passa de 0.81 (13 variáveis em escalas bem diferentes, tipo ",[23,724,725],{},"proline"," que vai até quase 1700 contra ",[23,728,729],{},"hue"," que fica abaixo de 2, então a distância é decidida quase só por ",[23,732,725],{},"). Normalizado, a acurácia bate 0.9444 em qualquer um dos três K, um salto enorme, e olha que interessante: depois de normalizar, a escolha de K deixa de importar tanto, os três dão exatamente o mesmo resultado nesse teste. Faz sentido: quando cada variável realmente contribui pra distância (em vez de uma única variável dominar tudo), a vizinhança fica mais \"certa\" logo de cara, e sobra menos trabalho pro ajuste fino de K resolver.",[735,736,737],"style",{},"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);}",{"title":41,"searchDepth":54,"depth":54,"links":739},[740,741,742,743,744,745,746],{"id":17,"depth":54,"text":18},{"id":72,"depth":54,"text":73},{"id":480,"depth":54,"text":481},{"id":509,"depth":54,"text":510},{"id":585,"depth":54,"text":586},{"id":604,"depth":54,"text":605},{"id":650,"depth":54,"text":651},null,"2026-08-19","Aula 4a: o professor implementa K-vizinhos-mais-próximos na unha, bate exatamente com o KNeighborsClassifier do scikit-learn, e mostra que K não é 'quanto maior melhor'. Eu explico por que K é um parâmetro de suavização.","md",{},"\u002Fpt\u002Fplaylists\u002Fpattern-recognition\u002Fknn-classifier","pattern-recognition",{"title":6,"description":749},"published","pt\u002Fplaylists\u002Fpattern-recognition\u002Fknn-classifier",[758,759,760],"knn","classificacao","hiperparametros","DcYL_FXzg7eAtK1Hsdawp0_f5xLgxzoxPFfFSQyy9HU",1787338983201]