A
idéia do algoritmo K-Means (também chamado de K-Médias) é fornecer uma
classificação de informações de acordo com os próprios dados. Esta
classificação, como será vista a seguir, é baseada em análise e
comparações entre os valores numéricos dos dados. Desta maneira, o
algoritmo automaticamente vai fornecer uma classificação automática sem
a necessidade de nenhuma supervisão humana, ou seja, sem nenhuma
pré-classificação existente. Por causa desta característica, o K-Means é
considerado como um algoritmo de mineração de dados não
supervisionado.
Para entender como o algoritmo funciona,
vamos imaginar que temos uma tabela com linhas e colunas que contêm os
dados a serem classificados. Nesta tabela, cada coluna é chamada de
dimensão e cada linha contém informações para cada dimensão, que também
são chamadas de ocorrências ou pontos. Geralmente, trabalha-se com
dados contínuos neste algoritmo, mas nada impede que dados discretos
sejam utilizados, deste que eles sejam mapeados para valores numéricos
correspondentes.
Como foi dito, o algoritmo vai analisar
todos os dados desta tabela e criar classificações. Isto é, o algoritmo
vai indicar uma classe (cluster) e vai dizer quais linhas pertencem a
esta classe. O usuário deve fornecer ao algoritmo a quantidade de
classes que ele deseja. Este número de classes que deve ser passada
para o algoritmo é chamado de k e é daí que vem a primeira letra do
algoritmo: K-Means.
Para gerar as classes e classificar as
ocorrências, o algoritmo faz uma comparação entre cada valor de cada
linha por meio da distância. Geralmente utiliza-se a distância
euclidiana para calcular o quão ‘longe’ uma ocorrência está da outra. A
maneira de calcular esta distância vai depender da quantidade de
atributos da tabela fornecida. Após o cálculo das distâncias o
algoritmo calcula centróides para cada uma das classes. Conforme o
algoritmo vai iterando, o valor de cada centróide é refinado pela média
dos valores de cada atributo de cada ocorrência que pertence a este
centróide. Com isso, o algoritmo gera k centróides e coloca as
ocorrências da tabela de acordo com sua distância dos centróides.
Para simplificar a explicação de como o algoritmo funciona vou apresentar o algoritmo K-Means em cinco passos:
PASSO 01: Fornecer
valores para os centróides.
Neste passo os k centróides devem
receber valores iniciais. No início do algoritmo geralmente escolhe-se
os k primeiros pontos da tabela. Também é importante colocar todos os
pontos em um centróide qualquer para que o algoritmo possa iniciar seu
processamento.
PASSO 02: Gerar
uma matriz de distância entre cada ponto e os centróides.
Neste passo, a distância entre cada
ponto e os centróides é calculada. A parte mais ‘pesada’ de cálculos
ocorre neste passo pois se temos N pontos e k centróides teremos que
calcular N x k distâncias neste passo.
PASSO 03: Colocar
cada ponto nas classes de acordo com a sua distância do centróide
da classe.
Aqui, os pontos são classificados de
acordo com sua distância dos centróides de cada classe. A classificação
funciona assim: o centróide que está mais perto deste ponto vai
‘incorporá-lo’, ou seja, o ponto vai pertencer à classe representada
pelo centróide que está mais perto do ponto. É importante dizer que o
algoritmo termina se nenhum ponto ‘mudar’ de classe, ou seja, se nenhum
ponto for ‘incorporado’ a uma classe diferente da que ele estava antes
deste passo.
PASSO 04: Calcular
os novos centróides para cada classe.
Neste momento, os valores das
coordenadas dos centróides são refinados. Para cada classe que possui
mais de um ponto o novo valor dos centróides é calculado fazendo-se a
média de cada atributo de todos os pontos que pertencem a esta classe.
PASSO 05: Repetir
até a convergência.
O algoritmo volta para o PASSO 02 repetindo iterativamente o refinamento do cálculo das coordenadas dos centróides.
Notem que desta maneira teremos uma
classificação que coloca cada ponto em apenas uma classe. Desta maneira
dizemos que este algoritmo faz uma classificação hard (hard
clustering) uma vez que cada ponto só pode ser classificado em uma
classe. Outros algoritmos trabalham com o conceito de classificação soft onde existe uma métrica que diz o quão ‘dentro’ de cada classe o ponto está.
O leitor que deseja obter mais
informações sobre o algoritmo K-Means pode dar uma olhada no link abaixo
e até fazer o download de outras implementações do algoritmo:
Vamos ver agora um exemplo prático da utilização do algoritmo K-Means.
Exemplo de uso de algoritmo
Neste exemplo vamos considerar que uma
determinada empresa vende produtos para clientes por meio de pedidos
compostos por itens de pedidos. Para facilitar o entendimento do
cenário e do modelo de dados vamos utilizar a base de dados de exemplo
Northwind do SQL Server 2000. O diagrama de entidades com as tabelas
que nos interessa é apresentado na Figura 01.
Figura 01. Diagrama com as principais tabelas da base de dados NorthWind.
A tabela que contém os itens de pedidos
se chama Order Details e possui uma chave primária composta nas colunas
OrderID e ProductID. Existem duas chaves estrangeiras na tabelas Order
Details, sendo que a primeira chave estrangeira relaciona a coluna
ProductID da tabela de produtos chamada Products com a coluna ProductID
da tabela Order Details. A segunda chave estrangeira relaciona a
coluna OrderId da tabela de pedidos chamada Orders com a coluna OrderId
da tabela Order Details. O modelo ainda apresenta a tabela de clientes
Customers relacionado à tabela de pedidos Orders por meio das colunas
CustomerID presente em ambas as tabelas.
Com base neste modelo, o departamento de
marketing da empresa deseja segmentar os clientes para poder oferecer
descontos diferenciados e outros benefícios. A segmentação dos clientes
deve dividir todos os clientes da base de dados em três categorias:
Clientes Ouro, Clientes Prata e Clientes Bronze. O critério de
classificação dos clientes deve levar em consideração apenas duas
variáveis: o total de pedidos de cada cliente e a quantidade total
gasta pelo cliente em todos os pedidos, sem considerar descontos.
Obviamente os clientes que possuírem mais pedidos e o maior valor gasto
serão classificados como Clientes Ouro.
Com base nestas informações,
inicialmente vamos calcular o total de pedidos para cada cliente e a
quantidade gasta pelo cliente em todos os pedidos por meio da consulta
apresentada na listagem 01. O resultado desta consulta foi armazenado
em uma tabela chamada PERFIL.
Listagem 01. Obtendo o perfil de cada cliente.
Com os dados armazenados na tabela PERFIL
um gráfico de pontos foi gerado no Excel com a Quantidade de Pedidos
x o Total Gasto. A figura 02 apresenta este gráfico gerado a partir
dos dados da tabela PERFIL.
Figura 02. Gráfico de pontos mostrando a Quantidade de Pedidos x Total Gasto por cliente.
Para classificar os dados da tabela
PERFIL de acordo com o que o departamento de marketing deseja podemos
utilizar o algoritmo K-Means. Como especificado somente dois atributos,
Quantidade de Pedidos e Total Gasto, serão utilizados para classificar
os clientes. Na vida real o algoritmo K-Means pode trabalhar com
qualquer quantidade de atributos para classificar os valores.
Analisando os dados da Figura 02 podemos
ver claramente que três clientes serão classificados como Clientes
Ouro, pois fica fácil de ver a distância entre estes clientes e os
demais. Porém não fica fácil a classificação dos demais clientes em
Clientes Prata e Clientes Bronze.
Para ajudar a classificar estes clientes vamos
utilizar uma implementação do algoritmo K-Means
que vai trabalhar com apenas dois atributos. Esta implementação
foi colocada na stored procedure ST_KMEANS baseada em instruções
SQL do dialeto T-SQL, linguagem padrão do SQL Server.
Com algumas poucas mudanças a stored procedure pode ser
implementada em outros bancos de dados e também poderá receber
mais de dois atributos para a classificação.
Para
tornar mais modular o algoritmo, a implementação
do cálculo da distância entre os pontos foi feita
na função DIST(), que deve ser criada antes da
stored procedure. A listagem 02 apresenta a chamada da stored
procedure ST_KMEANS para o exemplo da tabela PERFIL. O primeiro
parâmetro que deve ser passado para a procedure é o
nome da tabela, seguido pelos parâmetros dos atributos.
O quarto parâmetro indica qual é a quantidade de
classificações que o algoritmo deve utilizar (clusters).
A listagem 02 apresenta os 23 primeiros pontos classificados
de acordo com o algoritmo K-Means, colocando-os os em ordem de
acordo com a classe a que pertencem.
Listagem 02. Chamada à stored procedure ST_KMEANS
No resultado apresentado pela stored
procedure a coluna X equivale ao valor da primeira coluna passada como
parâmetro, que no nosso exemplo é QTD_PEDIDOS, e a coluna Y equivale ao
valor da segunda coluna passada como parâmetro, que no nosso exemplo é
QTD_GASTA.
A Stored Procedure ainda possui um
quinto parâmetro. Se este parâmetro não for passado a stored procedure
retorna os dados classificados como na listagem 02. Se o quinto
parâmetro for passado como 1, a stored procedure retorna as coordenadas
dos centróides de cada classe. A Listagem 03 apresenta a chamada à
stored procedure com o uso do quinto parâmetro e o seu resultado.
Listagem 03. Execução da stored procedure ST_KMEANS com cinco parâmetros.
Notem que os pontos que definem os centróides de cada classe não existem no conjunto de pontos iniciais.
No nosso exemplo, o algoritmo
classificou os dados em três classes: classe 1, 2 e 3. De acordo com a
definição do tipo de cliente a classe 1 equivale ao Cliente Bronze, a
classe 2 equivale a Cliente Prata e a classe 3 equivale ao Cliente
Ouro. Colocando esta dados em um gráfico de pontos podemos visualizar
mais facilmente a classificação dos clientes. Este gráfico é
apresentado na Figura 03.
Figura 03. Classificação dos clientes de acordo com o algoritmo KMeans.
No gráfico da Figura 03 os clientes
representados pela cor amarelo escuro (triângulo) são aos Clientes
Ouro, os clientes de cor cinza (quadrado) são os Clientes Prata e os
clientes de cor amarelo claro (losango) são os Clientes Bronze. Os
três pontos em preto indicam os centróides calculados pelo algoritmo
Com a utilização do algoritmo pode-se
classificar os clientes existentes de acordo com sua Quantidade de
Pedidos e Total Gasto em todos os pedidos, da maneira que o departamento
de marketing desejou. Para classificar de um novo cliente basta
executar novamente a stored procedure e verificar qual é a sua
classificação. Desta maneira, todos os clientes serão novamente
analisados e re-classificados.
Como alternativa pode-se comparar os
dados de um novo cliente aos dados dos centróides antes de incluir o
cliente na tabela. Esta comparação é feita por meio da distância entre
os valores do novo cliente e os valores dos centróides fornecidos pelo
algoritmo quando este recebe o valor 1 para o quinto parâmetro.
No comments:
Post a Comment