{"id":525,"date":"2025-05-18T21:24:22","date_gmt":"2025-05-19T00:24:22","guid":{"rendered":"https:\/\/www.wagnersalvi.com.br\/?p=525"},"modified":"2025-05-18T21:24:25","modified_gmt":"2025-05-19T00:24:25","slug":"introducao-ao-k-nearest-neighbors","status":"publish","type":"post","link":"http:\/\/www.wagnersalvi.com.br\/?p=525","title":{"rendered":"Introdu\u00e7\u00e3o ao k-Nearest Neighbors"},"content":{"rendered":"\n<p>O algoritmo k-Nearest Neighbors (k-NN) \u00e9 um dos m\u00e9todos mais simples e eficazes para tarefas de classifica\u00e7\u00e3o e regress\u00e3o em aprendizado de m\u00e1quina. Trata-se de um algoritmo baseado em inst\u00e2ncias (ou seja, um algoritmo sem modelo), que toma decis\u00f5es baseadas na proximidade dos dados em um espa\u00e7o de caracter\u00edsticas.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Conceito do k-NN<\/h4>\n\n\n\n<p>O conceito principal do k-NN \u00e9 bastante intuitivo. Quando recebemos um novo dado para classificar, o algoritmo busca os k pontos de dados mais pr\u00f3ximos no conjunto de treinamento. A proximidade \u00e9 determinada por uma m\u00e9trica de dist\u00e2ncia, sendo a dist\u00e2ncia Euclidiana a mais comum. O novo dado \u00e9 ent\u00e3o classificado com base na maioria das classes de seus vizinhos mais pr\u00f3ximos. No caso de regress\u00e3o, a m\u00e9dia dos valores dos vizinhos \u00e9 calculada para prever a sa\u00edda.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Pontos Positivos<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Simplicidade:<\/strong> Uma das principais vantagens do k-NN \u00e9 sua simplicidade. N\u00e3o \u00e9 necess\u00e1rio um processo rigoroso de treinamento, e o algoritmo \u00e9 f\u00e1cil de entender e implementar.<\/li>\n\n\n\n<li><strong>Flexibilidade:<\/strong> Pode ser usado para problemas de classifica\u00e7\u00e3o e regress\u00e3o.<\/li>\n\n\n\n<li><strong>Adaptabilidade:<\/strong> Adapta-se facilmente a conjuntos de dados novos, pois n\u00e3o depende de qualquer suposi\u00e7\u00e3o particular sobre a distribui\u00e7\u00e3o dos dados.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Pontos Negativos<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Custo Computacional:<\/strong> Com aumento dos dados, tanto o tempo de execu\u00e7\u00e3o quanto o armazenamento necess\u00e1rios crescem significativamente, pois todas as dist\u00e2ncias precisam ser computadas.<\/li>\n\n\n\n<li><strong>Sele\u00e7\u00e3o de k:<\/strong> Determinar o valor ideal de k \u00e9 crucial e pode requerer valida\u00e7\u00e3o cruzada para otimizar.<\/li>\n\n\n\n<li><strong>Sensibilidade a Ru\u00eddo:<\/strong> A presen\u00e7a de outliers pode afetar significativamente a precis\u00e3o do algoritmo.<\/li>\n<\/ul>\n\n\n\n<p>Implementa\u00e7\u00e3o do k-NN em C#<\/p>\n\n\n\n<p>Aqui est\u00e1 uma implementa\u00e7\u00e3o simples do algoritmo k-NN em C#. Este exemplo ilustra como classificar um novo ponto de acordo com seus vizinhos mais pr\u00f3ximos.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nclass KNN\n{\n    public static string Classificar(double[][] treino, string[] labels, double[] novoPonto, int k)\n    {\n        \/\/ Calcula as dist\u00e2ncias entre o novo ponto e os pontos de treinamento\n        List&lt;Tuple&lt;double, string>> distancias = new List&lt;Tuple&lt;double, string>>();\n\n        for (int i = 0; i &lt; treino.Length; i++)\n        {\n            double dist = 0.0;\n            for (int j = 0; j &lt; treino[i].Length; j++)\n            {\n                dist += Math.Pow(treino[i][j] - novoPonto[j], 2);\n            }\n            dist = Math.Sqrt(dist);\n            distancias.Add(new Tuple&lt;double, string>(dist, labels[i]));\n        }\n\n        \/\/ Ordena as dist\u00e2ncias\n        var vizinhosMaisProximos = distancias.OrderBy(d => d.Item1).Take(k);\n        \n        \/\/ Conta a frequ\u00eancia de cada label\n        var ocorrencias = new Dictionary&lt;string, int>();\n        foreach (var item in vizinhosMaisProximos)\n        {\n            if (ocorrencias.ContainsKey(item.Item2))\n                ocorrencias[item.Item2]++;\n            else\n                ocorrencias[item.Item2] = 1;\n        }\n\n        \/\/ Retorna a label com mais ocorr\u00eancias\n        return ocorrencias.OrderByDescending(o => o.Value).First().Key;\n    }\n    \n    static void Main(string[] args)\n    {\n        \/\/ Dados de treinamento\n        double[][] dadosTreinamento = {\n            new double[] { 1.0, 2.0 },\n            new double[] { 2.0, 3.0 },\n            new double[] { 3.0, 3.0 }\n        };\n        \n        string[] labels = { \"A\", \"B\", \"B\" };\n        \n        \/\/ Novo ponto a classificar\n        double[] novoPonto = { 2.5, 2.5 };\n        \n        \/\/ Valor de k\n        int k = 3;\n\n        \/\/ Classifica\u00e7\u00e3o do novo ponto\n        string resultado = Classificar(dadosTreinamento, labels, novoPonto, k);\n        Console.WriteLine($\"O novo ponto foi classificado como: {resultado}\");\n    }\n}<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Explica\u00e7\u00e3o do C\u00f3digo<\/strong><\/p>\n\n\n\n<p><strong>Dist\u00e2ncia:<\/strong> Calculamos a dist\u00e2ncia Euclidiana entre o novo ponto e os pontos de dados de treinamento.<br><strong>Classifica\u00e7\u00e3o:<\/strong> Determinamos os k vizinhos mais pr\u00f3ximos com base nas dist\u00e2ncias computadas e finalmente decidimos a classe do novo ponto com base na frequ\u00eancia (maioria) das classes dos vizinhos.<\/p>\n\n\n\n<p>O k-NN \u00e9 especialmente \u00fatil quando a simplicidade e a facilidade de implementa\u00e7\u00e3o s\u00e3o prioridades, mas deve-se considerar seus limites em cen\u00e1rios com grandes volumes de dados.<\/p>\n<p>Views: 1<\/p>","protected":false},"excerpt":{"rendered":"<p>O algoritmo k-Nearest Neighbors (k-NN) \u00e9 um dos m\u00e9todos mais simples e eficazes para tarefas de classifica\u00e7\u00e3o e regress\u00e3o em [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":526,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[73,49],"tags":[62,70,205],"class_list":["post-525","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-inteligencia-artificial","category-programacao","tag-c","tag-inteligencia-artificial","tag-machine-learning"],"_links":{"self":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/525","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=525"}],"version-history":[{"count":1,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/525\/revisions"}],"predecessor-version":[{"id":527,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/525\/revisions\/527"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/media\/526"}],"wp:attachment":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=525"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}