<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivos K-Means - Diego Nogare</title>
	<atom:link href="https://diegonogare.net/tags/k-means/feed/" rel="self" type="application/rss+xml" />
	<link>https://diegonogare.net/tags/k-means/</link>
	<description>Consultor Executivo de IA &#38; ML</description>
	<lastBuildDate>Tue, 15 Apr 2025 13:49:47 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://i0.wp.com/diegonogare.net/wp-content/uploads/2025/06/cropped-cropped-DN-Black-300x300-1.png?fit=32%2C32&#038;ssl=1</url>
	<title>Arquivos K-Means - Diego Nogare</title>
	<link>https://diegonogare.net/tags/k-means/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">247556142</site>	<item>
		<title>Processo cíclico de Machine Learning</title>
		<link>https://diegonogare.net/2020/04/processo-ciclico-de-machine-learning/</link>
		
		<dc:creator><![CDATA[Diego Nogare]]></dc:creator>
		<pubDate>Mon, 20 Apr 2020 12:00:37 +0000</pubDate>
				<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[inteligencia artificial]]></category>
		<category><![CDATA[K-Means]]></category>
		<category><![CDATA[Processo de Desenvolvimento]]></category>
		<guid isPermaLink="false">http://diegonogare.net/?p=3339</guid>

					<description><![CDATA[<p>Como fazer um projeto de ML utilizando o processo cíclico de interação Existe uma diferença enorme entre o desenvolvimento de software tradicional, e o processo cíclico de Machine Learning. Vejo nas conversas com os clientes que atendo, que uma das maiores dificuldades que enfrentam é de desassociar a forma de desenvolvimento. O software tradicional é...</p>
<p>O post <a href="https://diegonogare.net/2020/04/processo-ciclico-de-machine-learning/">Processo cíclico de Machine Learning</a> apareceu primeiro em <a href="https://diegonogare.net">Diego Nogare</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Como fazer um projeto de ML</h1>
<h2>utilizando o processo cíclico de interação</h2>
<p>Existe uma diferença enorme entre o desenvolvimento de software tradicional, e o processo cíclico de Machine Learning. Vejo nas conversas com os clientes que atendo, que uma das maiores dificuldades que enfrentam é de desassociar a forma de desenvolvimento. O software tradicional é focado na estrutura e relacionamento entre os elementos necessários, mas no processo de Machine Learning o desenvolvimento é trabalhado com foco nos dados. Contudo, esta questão dos dados não é um fator impactante no software tradicional, desde que siga as amarrações e consistências definidas.</p>
<h4>Software tradicional</h4>
<p>Para exemplificar, imagine uma tela de cadastro simples. Nesta tela existem cinco campos: Nome, Data de Nascimento, E-Mail, Cidade e UF. Estes campos da tela podem possuir algumas amarrações condicionais, como por exemplo só permitir um cadastro de pessoas acima de 18 anos. Ou que a cidade seja um campo de seleção que será preenchido somente após a seleção da UF em outro campo de seleção. Os dados, em si, não importam para o sistema. Se seguir as regras impostas pela área de negócios que está criando as funcionalidades, ele será aceito. Este software continuará funcionando como deveria até alguém alterar propositalmente o relacionamento entre o campo da tela e seu correspondente no seu banco de dados.</p>
<h4>Machine Learning</h4>
<p>Por outro lado, o projeto de Machine Learning faz uma tarefa diferente. Como o foco é direcionado para os dados, o valor existente nos campos armazenados são utilizados para montar o modelo de Machine Learning. Imagine que, em um processo de agrupamento de valores (pode ser o uso de um <a href="https://diegonogare.net/2015/08/entendendo-como-funciona-o-algoritmo-de-cluster-k-means/" target="_blank" rel="noopener noreferrer">algoritmo K-Means</a>, por exemplo) você utilizou as variáveis Data de Nascimento e Cidade. (desde que a cidade e a data de nascimento fossem armazenados com valores numéricos). Estes campos poderão encontrar uma determinada similaridade entre os dados e com isso há a segmentação em clusters. Com essa segmentação, um modelo poderia agrupar estes dados e o seu time de marketing poderia trabalhar de forma específica em cada grupo destes, de acordo com as combinações encontradas pelo algoritmo.</p>
<h4>Impacto</h4>
<p>Porém,  por uma decisão da área de negócios, agora o sistema começará a ser oferecido também para um público completamente diferente. Imagine que o publico mais jovem majoritariamente utilizasse o sistema até hoje, a partir de amanhã o publico mais velho vai passar a integrar também o publico alvo. O software está preparado para isso, vai receber esse novo público sem a necessidade de nenhuma alteração na tela de cadastro porque não há mudança entre o relacionamento da tela com o repositório. Contudo, as similaridades entre os dados de data de nascimento e cidade sofrerão alterações. Reparem que o dado influencia o resultado do algoritmo. E isso pode impactar em uma mudança no algoritmo de Machine Learning, mesmo o sistema não tendo nenhuma linha de código alterada.</p>
<p>Explicar esta condição para pessoas que estão acostumadas unicamente à desenvolvimento de software tradicional é um desafio. Muitas vezes passa a impressão que o desenvolvimento do modelo de Machine Learning precisará de suporte do desenvolvedor para sempre. Fazendo com que o cliente pague para um suporte e sustentação <em>ad aeternum</em>.</p>
<h2>Processo cíclico de Machine Learning</h2>
<p>Utilizando o diagrama da figura apresentada na capa deste post, é visto que o processo cíclico de Machine Learning envolve algumas fases. E isso remete ao processo trabalhado amplamente na atividade de <a href="https://diegonogare.net/2020/04/mineracao-de-dados-e-suas-ramificacoes/" target="_blank" rel="noopener noreferrer">mineração de dados</a>, onde se entende o dado antes de fazer um modelo. Em seu clássico livro <a href="https://www.amazon.com.br/gp/product/B006JAWFE4/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B006JAWFE4&amp;linkCode=as2&amp;tag=diegonogare-20&amp;linkId=a286922066137d06ae6aa992521540e5" target="_blank" rel="noopener noreferrer">The Data WarehouseETL Toolkit: Practical Techniques for Extracting, Cleaning, Conforming, and Delivering Data (English Edition)</a><img decoding="async" style="border: none !important; margin: 0px !important;" src="//ir-br.amazon-adsystem.com/e/ir?t=diegonogare-20&amp;l=am2&amp;o=33&amp;a=B006JAWFE4" alt="" width="1" height="1" border="0" /> Ralph Kimball diz que em processos de ETL se gastam mais de 70% do tempo realizando leitura e transformação dos dados. Em Machine Learning essa afirmação também é uma verdade, porém com poucas variações.</p>
<h3>Identificar, Extrair, Limpar e Refinar</h3>
<p>Esta fase do processo se assemelha ao descrito por Ralph Kimball para projetos de ETL. Porém, como é para Machine Learning, há algumas alterações. Identificar a origem dos dados é diferente, porque não são todos os dados que realmente impactam para a criação do modelo. Alguns dados não são relevantes, e podem ser removidos como é estudado na disciplina de <a href="https://www.amazon.com.br/gp/product/B07BNX4MWC/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B07BNX4MWC&amp;linkCode=as2&amp;tag=diegonogare-20&amp;linkId=d0407cbf774dc44bdad31c81b9c76185" target="_blank" rel="noopener noreferrer">Feature Engineering for Machine Learning: Principles and Techniques for Data Scientists (English Edition)</a>. Escolher as variáveis é uma tarefa complexa e devemos investir bastante tempo trabalhando neste momento.</p>
<p>Refinar os dados é uma outra tarefa que precisa ser trabalhada de forma pensada. Algumas variáveis possuem correlação alta entre si, e podem ser trabalhadas de forma a cria uma variável artificial para representar uma nova variável ao invés daquelas duas. Esta tarefa de refinamento pode ser estudada em disciplinas de estatística, e recomendo a leitura de <a href="https://www.amazon.com.br/gp/product/B07HKM4DPB/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B07HKM4DPB&amp;linkCode=as2&amp;tag=diegonogare-20&amp;linkId=342686c1b67a313a98ce8ee338fa8b77" target="_blank" rel="noopener noreferrer">Estatística Para Leigos</a><img decoding="async" style="border: none !important; margin: 0px !important;" src="//ir-br.amazon-adsystem.com/e/ir?t=diegonogare-20&amp;l=am2&amp;o=33&amp;a=B07HKM4DPB" alt="" width="1" height="1" border="0" /> e <a href="https://www.amazon.com.br/gp/product/8576086360/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=8576086360&amp;linkCode=as2&amp;tag=diegonogare-20&amp;linkId=a5b408563e4ba4f2f69dde5bab7455f1" target="_blank" rel="noopener noreferrer">Estatística II. Para Leigos</a><img decoding="async" style="border: none !important; margin: 0px !important;" src="//ir-br.amazon-adsystem.com/e/ir?t=diegonogare-20&amp;l=am2&amp;o=33&amp;a=8576086360" alt="" width="1" height="1" border="0" />.</p>
<h3>Criar o algoritmo e analisar uma amostragem</h3>
<p>Depois de se entender os dados é a hora de montar os algoritmos de Machine Learning, e cada problema condiz com a criação de um algoritmo de uma família específica. A escolha do algoritmo daquela família é baseada em sua performance, porque existem várias formas de se criar a mesma solução. A diferença entre os resultados dos algoritmos é baseado em sua performance. Para entender os algoritmos e suas métricas de avaliação, sugiro a leitura de <a href="https://www.amazon.com.br/gp/product/853528446X/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=853528446X&amp;linkCode=as2&amp;tag=diegonogare-20&amp;linkId=35a553a2b6c26aa69c24d053e5a63b94" target="_blank" rel="noopener noreferrer">Introdução à mineração de dados: com Aplicações em R</a><img loading="lazy" decoding="async" style="border: none !important; margin: 0px !important;" src="//ir-br.amazon-adsystem.com/e/ir?t=diegonogare-20&amp;l=am2&amp;o=33&amp;a=853528446X" alt="" width="1" height="1" border="0" /> e <a href="https://www.amazon.com.br/gp/product/8547200983/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=8547200983&amp;linkCode=as2&amp;tag=diegonogare-20&amp;linkId=8bed92117c0b1c0b7989c3d65897e23d" target="_blank" rel="noopener noreferrer">Introdução à mineração de dados: Conceitos básicos, algoritmos e aplicações</a><img loading="lazy" decoding="async" style="border: none !important; margin: 0px !important;" src="//ir-br.amazon-adsystem.com/e/ir?t=diegonogare-20&amp;l=am2&amp;o=33&amp;a=8547200983" alt="" width="1" height="1" border="0" />. Fazer uma amostragem mais genérica e plural nos dados é importante para garantir o mínimo de viés.</p>
<p>Só para exemplificar um cenário de impacto negativo de viés em algoritmo. No final de 2019 houve um problema gerado pela liberação de crédito para duas pessoas, que são casadas, mas o marido teve um crédito aprovado 20 vezes maior do que o da esposa. Nós discutimos um pouco sobre esse problema no <a href="https://www.lambda3.com.br/2019/11/lambda3-podcast-171-quem-e-responsavel-pelas-decisoes-tomadas-por-uma-inteligencia-artificial/" target="_blank" rel="noopener noreferrer">Lambda3 Podcast 171 – Quem é responsável pelas decisões tomadas por uma inteligência artificial?</a>. A falta de amostras, ou talvez o problema da amostra ter um viés causou um problema grande para os envolvidos.</p>
<h3>Tomar uma decisão</h3>
<p>Eu pensei em começar esse parágrafo escrevendo: &#8220;Por fim, a tomada de decisão&#8221;. Mas não é o fim! A tomada de decisão com os dados gerados é a validação do esforço construído durante todo o processo, e permitirá novos caminhos a partir destas decisões tomadas. Cada modelo de Machine Learning ajudará a responder uma pergunta, que auxilia na tomada de decisão. É esperado que essa tomada de decisão abra novas ideias e re-inicie o ciclo, começando novas perguntas que devem ser respondidadas.</p>
<p>O post <a href="https://diegonogare.net/2020/04/processo-ciclico-de-machine-learning/">Processo cíclico de Machine Learning</a> apareceu primeiro em <a href="https://diegonogare.net">Diego Nogare</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3339</post-id>	</item>
		<item>
		<title>Implementar o algoritmo K-Means com linguagem R</title>
		<link>https://diegonogare.net/2015/08/implementar-o-algoritmo-k-means-com-linguagem-r/</link>
		
		<dc:creator><![CDATA[Diego Nogare]]></dc:creator>
		<pubDate>Mon, 17 Aug 2015 18:30:56 +0000</pubDate>
				<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Aprendizado de Máquina]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Data Science]]></category>
		<category><![CDATA[K-Means]]></category>
		<guid isPermaLink="false">http://diegonogare.net/?p=1291</guid>

					<description><![CDATA[<p>Implementando o algoritmo K-Means com linguagem R O conceito do algoritmo K-Means já foi explicado aqui. Nesta publicação vamos implementar o algoritmo K-Means com linguagem R, mas com objetivo de tentar entender um pouco mais esse método de aprendizado de máquinas não supervisionado. Para este experimento vou usar um dataset público existente no diretório da...</p>
<p>O post <a href="https://diegonogare.net/2015/08/implementar-o-algoritmo-k-means-com-linguagem-r/">Implementar o algoritmo K-Means com linguagem R</a> apareceu primeiro em <a href="https://diegonogare.net">Diego Nogare</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Implementando o algoritmo K-Means</h1>
<h2>com linguagem R</h2>
<p>O conceito do <a href="https://diegonogare.net/2015/08/entendendo-como-funciona-o-algoritmo-de-cluster-k-means/" target="_blank" rel="noopener noreferrer">algoritmo K-Means já foi explicado aqui</a>. Nesta publicação vamos implementar o algoritmo K-Means com linguagem R, mas com objetivo de tentar entender um pouco mais esse método de aprendizado de máquinas não supervisionado.</p>
<p>Para este experimento vou usar um dataset público existente no diretório da UC Irvine. Tive o prazer de conhecer esse repositório quando fiz uma <a href="https://diegonogare.net/2015/02/especializacao-em-ensino-virtual-pela-uci-university-of-california-irvine/">Especialização de Ensino Virtual</a>. Para acessar o repositório e encontrar as dezenas de dataset disponíveis, acesse este link: <a href="http://archive.ics.uci.edu/ml/datasets.html">http://archive.ics.uci.edu/ml/datasets.html</a>. O dataset que vamos usar será <a href="http://archive.ics.uci.edu/ml/datasets/Daily+and+Sports+Activities">Daily and Sports Activities Data Set</a>. Acima de tudo é importante entender que ele apresenta informações de 8 pessoas, entre 20 e 30 anos que realizaram 19 atividades físicas. Sensores de Acelerómetro, Magnetómetro e Giroscópio coletaram dados dos eixos X, Y e Z, ou seja, totalizando 9 registros de dados de cada uma das 5 partes do corpo. Os sensores estavam no Dorso, Braço Direito, Braço Esquerdo, Perna Direita e Perna Esquerda. O arquivo com os dados coletados está no link: <a href="http://archive.ics.uci.edu/ml/machine-learning-databases/00256/">http://archive.ics.uci.edu/ml/machine-learning-databases/00256/</a>. Para exemplificar, vamos analisar somente os dados coletados dos sensores das pernas e de um único exercício, mas fique a vontade para fazer com qualquer sensor ou exercício.</p>
<p>Vou entender que você já tem o RStudio em sua máquina, mas caso não tenha, <a href="https://diegonogare.net/2015/08/instalando-o-r-e-o-rstudio-para-comecar-a-trabalhar-com-data-science/">recomendo fortemente que leia isso</a>.</p>
<h2>Acessando e recebendo os dados externos</h2>
<p>Usando R é possível trabalhar com a leitura e tratamento de dados externos em diversas origens. Pode ser um JSON, um XML, ZIP, e mais uma porção de outros formatos de dados. Neste caso vamos baixar um arquivo Zip e extrair seu conteúdo, em seguida vamos ler os dados e trabalhar com um pouco de descoberta em cima disso com os clusters.</p>
<p>Para baixar o arquivo via código e poder replicar o experimento sempre que precisar, para isso, vamos informar qual será o diretório de trabalho e quais os dados do arquivo que deve ser baixado. Depois de baixar o aquivo de 160MB, é necessário extrair os dados e ver o que aparece.</p>
<p>Em primeiro lugar, veja o código abaixo para saber como fazer isso:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">setwd("C:/Temp/KMeans")
url &lt;- "http://archive.ics.uci.edu/ml/machine-learning-databases/00256/data.zip"
destfile &lt;- "data.zip"
download.file(url, destfile, mode="wb")
unzip("data.zip")</pre>
<p>O resultado é um conjunto de pastas com diversos arquivos dentro. Entretanto, se navegar pra dentro das pastas, vai encontrar 60 arquivos txt em cada uma das pastas p* (que é uma pra cada das 8 pessoas) e por sua vez estão dentro das pastas a* (que representam as atividades).</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081715_1801_Implementan1-2.png?resize=567%2C148&#038;ssl=1" alt="arquivos1" width="567" height="148" /></p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081715_1801_Implementan2-2.png?resize=567%2C135&#038;ssl=1" alt="arquivos2" width="567" height="135" /></p>
<p>&nbsp;</p>
<p>Se abrir um dos arquivos txt, irá encontrar as 45 colunas com as coletas de cada um dos sensores. Não se assuste com esse monte de números, tudo ficará mais claro no decorrer do texto.</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081715_1801_Implementan3-1.png?resize=567%2C393&#038;ssl=1" alt="arquivoTexto" width="567" height="393" /></p>
<h2>Transformando os dados do arquivo em um DataFrame do R</h2>
<p>Quando se abre o arquivo txt bruto não é tão simples de identificar o que são esses números. Contudo, lendo a documentação do Dataset fornecido no link lá em cima, entendemos a estrutura de como os dados são armazenados e quais são as colunas. Para este experimento, vamos usar a atividade número 15 – Pedalar na bicicleta ergométrica na horizontal – e analisar somente os sensores de pernas. Veja o código abaixo:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="no-highlight">atividade &lt;- 15

DadosDeOrigem &lt;- gsub(" ","",paste(getwd(), "/data/a", atividade))

setwd(DadosDeOrigem)

Diretorios &lt;- list.files()

TotalPessoas &lt;- length(Diretorios)

DadoBruto &lt;- NULL

i &lt;- 1

while (i &lt;= TotalPessoas) {
  setwd( gsub(" ","",paste(DadosDeOrigem, "/", Diretorios[i])) ) 
  LerArquivos &lt;- list.files()
  j &lt;- 1
  while (j &lt;= length(LerArquivos)) {
    DadoBruto &lt;- rbind(DadoBruto, read.table(LerArquivos[j], sep=","))
    j &lt;- j+1
  }
  i &lt;- i+1
}

#Colocar as colunas que são interessantes analisar
SoPernas &lt;- DadoBruto[,28:45]
colnames(SoPernas) &lt;- c("DAX", "DAY", "DAZ", "DGX", "DGY", "DGZ", "DMX", "DMY", "DMZ", "EAX", "EAY", "EAZ", "EGX", "EGY", "EGZ", "EMX", "EMY", "EMZ")</pre>
<p>Para terminar esta parte de acesso, todos os dados de pernas (coluna 28 até 45) da atividade 15 foram armazenados em um novo Dataframe chamado SoPernas. Foi dado um nome para coluna, seguindo a lógica:</p>
<ul>
<li>D = Direita</li>
<li>E = Esquerda</li>
<li>A = Acelerómetro</li>
<li>G = Giroscópio</li>
<li>M = Magnetómetro</li>
</ul>
<p>A coluna DAX significa D (direita) A (acelerómetro) X (eixo X). A coluna EGZ significa E (esquerda) G (Giroscópio) Z (eixo Z). E assim por diante.</p>
<h2>Implementar o algoritmo K-Means com linguagem R</h2>
<p>Depois dos dados tratados, usar o algoritmo de K-Means é certamente simples. Ele recebe o dataset que deve ser consultado e o conjunto de segmentos que deve criar. Como já sabemos que são 8 pessoas que fazem parte da amostragem, não precisamos rodar aquele algoritmo de <em>Elbow Method</em> para descobrir quando grupos é possível criar. Veja, por exemplo, o código simples abaixo que recebe o processamento do K-Means e depois mostra a quantidade de elementos do dataframe que foi classificado em cada um dos clusters.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="no-highlight">Resultado &lt;- kmeans(SoPernas[1:2], 8)
Resultado$size</pre>
<p>Após a execução do K-Means, por exemplo, pode-se plotar os dados em um gráfico e ver como o algoritmo separou os dados nos 8 grupos que foram solicitados. Para facilitar o entendimento, vou plotar somente os dados de DAX e DAY, para um gráfico simples de duas dimensões, usando o recurso de poder plotar cada grupo em uma cor diferente para facilitar a análise de quem está observando.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="no-highlight">plot(SoPernas[1:2], col = Resultado$cluster, pch= 19)</pre>
<p>Se quiser colocar cada ponto central de um centroide, pode usar este exemplo de código abaixo na sequência da plotagem do gráfico:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="no-highlight">points(Resultado$centers[,1:2], col="orange", pch=8, cex=2)</pre>
<p>Após plotar o gráfico com os 8 segmentos, é possível identificar facilmente os grupos que o K-Means separou.</p>
<p><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081715_1801_Implementan4-1.png?w=640&#038;ssl=1" alt="" /></p>
<p>Quando um novo item for inserido no dataset, ele ficará associado a algum dos clusters. Por exemplo, você não precisa necessariamente saber se o dado é de uma mulher de 20 anos ou de um homem de 30, simplesmente ao analisar o dado novo contra os dados já processados, o computador vai entender onde estes dados se enquadram e vai te retornar qual é o gênero e a idade que ele estima que seja. Simples, não?!</p>
<p>O post <a href="https://diegonogare.net/2015/08/implementar-o-algoritmo-k-means-com-linguagem-r/">Implementar o algoritmo K-Means com linguagem R</a> apareceu primeiro em <a href="https://diegonogare.net">Diego Nogare</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1291</post-id>	</item>
		<item>
		<title>Entenda o algoritmo de agrupamento K-Means</title>
		<link>https://diegonogare.net/2015/08/entendendo-como-funciona-o-algoritmo-de-cluster-k-means/</link>
		
		<dc:creator><![CDATA[Diego Nogare]]></dc:creator>
		<pubDate>Wed, 12 Aug 2015 20:24:53 +0000</pubDate>
				<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Aprendizado de Máquina]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Data Science]]></category>
		<category><![CDATA[K-Means]]></category>
		<guid isPermaLink="false">http://diegonogare.net/?p=1246</guid>

					<description><![CDATA[<p>Entenda como funciona o algoritmo de Cluster K-Means Em uma forma lúdica para explicar o conceito Fala galera, entenda o funcionamento do algoritmo de agrupamento K-Means, que é uma das formas que existe para se trabalhar com aprendizagem de máquinas (machine learning) no paradigma de aprendizado não supervisionado. Isso é diferente do aprendizado supervisionado, onde...</p>
<p>O post <a href="https://diegonogare.net/2015/08/entendendo-como-funciona-o-algoritmo-de-cluster-k-means/">Entenda o algoritmo de agrupamento K-Means</a> apareceu primeiro em <a href="https://diegonogare.net">Diego Nogare</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Entenda como funciona o algoritmo de Cluster K-Means</h1>
<h2>Em uma forma lúdica para explicar o conceito</h2>
<p>Fala galera, entenda o funcionamento do algoritmo de agrupamento K-Means, que é uma das formas que existe para se trabalhar com aprendizagem de máquinas (<em>machine learning</em>) no paradigma de aprendizado não supervisionado. Isso é diferente do aprendizado supervisionado, onde você informa ao computador o que ele deve procurar e aprender, com exemplos contendo os rótulos previamente. No aprendizado não supervisionado a gente não sabe exatamente o que estamos tentando ensinar ao computador. Por causa disso precisamos recorrer à agrupadores lógicos de segmentação, com foco em encontrar similaridade entre os dados da amostra.</p>
<p>O resultado esperado é que seja encontrado um padrão e assumir que este padrão é o que estamos tentando ensinar ao computador, que por sua vez, vai reproduzir e encontrar esse padrão sempre quando for solicitado. Depois de descoberto o padrão, qualquer item novo que tenha uma similaridade com aquele segmento (agrupamento [<em>cluster</em>, em inglês]) pode ser inferido como &#8220;fazendo parte daquilo&#8221;.</p>
<p>A proposta deste post é mostrar, com um certo nível de detalhes, como segmentar a amostragem em grupos e descobrir padrões nos dados. No final do texto você conseguirá ver uma referência para a implementação em Linguagem R, mas nesta publicação teremos o foco no entendendo o algoritmo.</p>
<h2>Agrupando os dados</h2>
<p>Para exemplificar, pense em um <em>dataset</em> com algumas amostras dispostas nos eixo X e Y, como o gráfico abaixo. Seu objetivo é agrupar estes dados baseado em sua similaridades (ou aproximação). Consegue fazer isso?</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean1-1.png?resize=369%2C200&#038;ssl=1" alt="conjunto de dados" width="369" height="200" /></p>
<p>É possível bater o olho neste gráfico e ver a separação em alguns grupos. Mas cada um de nós que olhar o gráfico pode tentar criar um número diferente de grupos (<em>clusters</em>). Até mesmo quando a quantidade de <em>cluster</em> que pensarmos for igual, pode-se pensar em agrupamentos de formas diferentes. Por exemplo, alguns de nós podem ver a separação com apenas 2 <em>clusters</em>, e o gráfico poderia ser assim:</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean2-1.png?resize=374%2C202&#038;ssl=1" alt="conjunto de dados com 2 grupos" width="374" height="202" /></p>
<p>Ou assim&#8230;<br />
<img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean3-1.png?resize=371%2C204&#038;ssl=1" alt="conjunto de dados com 2 grupos" width="371" height="204" /></p>
<p>Alguém também poderia pensar em separar os dados assim&#8230;<br />
<img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean4-1.png?resize=367%2C199&#038;ssl=1" alt="conjunto de dados com 2 grupos" width="367" height="199" /></p>
<p>Qual é o certo? Todos estão certos! Isso pode acontecer de acordo com a interpretação de cada um dos observadores que encontraram apenas 2 grupos nestes dados.</p>
<p>&nbsp;</p>
<p>Outras pessoas podem encontrar 3 grupos, e não apenas dois, podendo chegar a definições como esta:</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean5-1.png?resize=368%2C202&#038;ssl=1" alt="conjunto de dados com 3 grupos" width="368" height="202" /></p>
<p>Ou esta<br />
<img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean6-1.png?resize=372%2C202&#038;ssl=1" alt="conjunto de dados com 3 grupos" width="372" height="202" /></p>
<p>Ou então essa<br />
<img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean7-1.png?resize=371%2C199&#038;ssl=1" alt="conjunto de dados com 3 grupos" width="371" height="199" /></p>
<p>E aqui, qual dos gráficos é o certo? O certo é com 2 grupos ou com 3 grupos? Mais uma vez isso é difícil de responder, todos os 6 gráficos estão corretos de acordo com a visão de cada observador.</p>
<h2>Entendendo como funciona o algoritmo de agrupamento K-Means</h2>
<p>Para entender o funcionamento vamos separar os dados em 2 <em>clusters</em> e entender os passos que o algoritmo de agrupamento K-Means faz para convergir em um resultado. Neste caso o K será igual a 2, criando os 2 <em>clusters</em> que estamos buscando. O K, de K-Means, é a quantidade de centroides (pontos centrais dos grupos) que serão criados e ajudará a encontrará a similaridade dos dados.</p>
<p>Uma das formas de iniciar o processo é o algoritmo inserir o K pontos (centroides) aleatórios iniciais. Pode ser qualquer lugar do plano, para em seguida começar as iterações e encontrar os resultados.</p>
<p>Veja dois pontos aleatórios criados no gráfico, e uma linha tracejada que é calculada aproximadamente na metade da distância dos pontos Vermelho e Azul. Com este segmento, os itens que estão plotados acima da linha tracejada fazem parte do grupo vermelho e os de baixo da linha fazem parte do grupo azul.</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean8-2.png?resize=367%2C198&#038;ssl=1" alt="conjunto de dados com 2 centroides" width="367" height="198" /></p>
<p>A primeira iteração do algoritmo é medir a distância de todos os pontos que estão atrelados ao centroide e então calcular sua média. O resultado gera uma nova coordenada de X e Y, e vai mudar a posição do centroide para o novo ponto que foi calculado, que é a distância média de todos os pontos que se ligaram à aquele centroide. Essa mudança de posição do centroide pode alterar os itens que fazem parte daquele grupo. Veja isso nas imagens abaixo:</p>
<p>&nbsp;</p>
<p>O ponto vermelho e azul se moveram baseados na distância média dos elementos que estavam atrelados à aqueles centroides.</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean9-2.png?resize=369%2C197&#038;ssl=1" alt="conjunto de dados com 2 centroides" width="369" height="197" /></p>
<p>Após essa movimentação, a linha tracejada muda sua posição e inclinação.<br />
<img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean10-1.png?resize=372%2C201&#038;ssl=1" alt="conjunto de dados com 2 centroides" width="372" height="201" /></p>
<p>Reparem que alguns pontos pretos que faziam parte de um grupo na iteração anterior, como resultado, mudaram-se para o outro grupo.<br />
<img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean11-1.png?resize=367%2C207&#038;ssl=1" alt="conjunto de dados com 2 centroides" width="367" height="207" /></p>
<h2>E quando ele vai convergir?</h2>
<p>Com essa mudança de grupos, os pontos que estão marcados em verde passaram do centroide azul para o vermelho, e o que está marcado em azul passou do centroide vermelho para o azul. É possível reparar que a iteração de cálculo da média da distância dos pontos até o centroide ocorre em <em>loop,</em> até que nenhum ponto mude mais de centroide. Em outras palavras, isso acontece quando os centroides param de atualizar suas posições, porque já estão na posição central da distância entre os pontos. Chamamos isso de convergir!</p>
<p>Repare mais algumas possíveis iterações dos centroides e sua linha tracejada imaginária.</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean12-1.png?resize=365%2C202&#038;ssl=1" alt="conjunto de dados com 2 centroides" width="365" height="202" /><br />
<img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean13-1.png?resize=368%2C197&#038;ssl=1" alt="conjunto de dados com 2 centroides" width="368" height="197" /><br />
<img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean14-1.png?resize=369%2C198&#038;ssl=1" alt="conjunto de dados com 2 centroides" width="369" height="198" /></p>
<p>Veja que entre a penúltima iteração e esta não ouve mais mudança de pontos entre o gráfico e o centroide, portanto o algoritmo de agrupamento K-Means encerra sua execução chegando ao resultado esperado e criando dois grupos. Por exemplo, quando um novo item for incluído no gráfico, ele já terá um grupo que atende aquela região e o computador já saberá do que se trata o dado novo.</p>
<h2>Escolhendo a quantidade de K (<em>clusters</em>) no algoritmo de agrupamento K-Means</h2>
<p>O <em>Elbow Method</em> é uma das formas usadas para descobrir a quantidade ideal de <em>clusters</em> naquele conjunto de dados. Ele tem esse nome por se parecer com o formato de um &#8220;braço&#8221; e nós sempre procurarmos o &#8220;cotovelo&#8221; pra definir que este é o número aceitável de K (grupos) a serem criados com base nos dados da amostra. Este método vai aumentando a quantidade de <em>clusters</em> a partir de 1 e analisando o resultado melhorado a cada incremento. Quando o benefício parar de ser relevante (um salto entre uma quantidade de <em>cluster</em> e a próxima quantidade) ele entra em um modelo platô, no qual a diferença da distância é quase insignificante. Ou seja, é neste momento que entende-se que o algoritmo é relevante com aquela quantidade de K e então ele deve ser usado pra segmentar os dados do gráfico.</p>
<p>Depois de executar o código do algoritmo do <em>Elbow Method</em> e olhando para os dados que estamos apresentando como exemplo, um bom número de K para ele é o número 4.</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean15-1.png?resize=359%2C209&#038;ssl=1" alt="escolha do numero de centroides" width="359" height="209" /></p>
<p>Rodando o algoritmo com 4 centroides, foi possível ver a transformação acontecendo e gerando esta segmentação:</p>
<p>Conjunto inicial de dados</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean16-1.png?resize=363%2C196&#038;ssl=1" alt="conjunto de dados" width="363" height="196" /></p>
<p>Após a execução do algoritmo e cada grupo representando uma cor<br />
<img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean17-2.png?resize=370%2C197&#038;ssl=1" alt="conjunto de dados com 4 grupos" width="370" height="197" /></p>
<p>A posição dos centroides finais, para cada grupo<br />
<img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" src="https://i0.wp.com/diegonogare.net/wp-content/uploads/2015/08/081215_2050_UsandoKMean18-2.png?resize=372%2C196&#038;ssl=1" alt="conjunto de dados com 4 grupos" width="372" height="196" /></p>
<p>&nbsp;</p>
<h2>Para continuar os estudos&#8230;</h2>
<p>A proposta desta publicação foi explicar de forma lúdica como o algoritmo de agrupamento <em>K-Means</em> funciona, mas você pode acompanhar uma <a href="https://diegonogare.net/2015/08/implementando-o-algoritmo-k-means-com-linguagem-r/" target="_blank" rel="noopener noreferrer">implementação em R</a> e depois ler sobre as possibilidades de implementar também com <a href="https://diegonogare.net/2014/11/azure-machine-learning-introducao-parte-2/" target="_blank" rel="noopener noreferrer">Azure Machine Learning</a>.</p>
<p>Para ajudar a responder a questão de quantos grupos devem existir neste conjunto de dados, alguns métodos são bem aceitos no meio científico, leia mais sobre eles aqui: <a href="https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set">https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set</a>.</p>
<p>O post <a href="https://diegonogare.net/2015/08/entendendo-como-funciona-o-algoritmo-de-cluster-k-means/">Entenda o algoritmo de agrupamento K-Means</a> apareceu primeiro em <a href="https://diegonogare.net">Diego Nogare</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1246</post-id>	</item>
	</channel>
</rss>
