Eu tenho tentado entender os diferentes algoritmos de clustering k-means, principalmente implementados no stats
pacote da R
linguagem.
Entendo o algoritmo de Lloyd e o algoritmo on-line de MacQueen. A maneira como eu os entendo é a seguinte:
Algoritmo de Lloyd:
Inicialmente, são escolhidas observações aleatórias 'k' que servirão como centróides dos clusters 'k'. Em seguida, as etapas a seguir ocorrem na iteração até os centróides convergirem.
- A distância euclidiana entre cada observação e os centróides escolhidos é calculada.
- As observações mais próximas de cada centróide são marcadas nos intervalos 'k'.
- A média de todas as observações em cada balde serve como novos centróides.
- Os novos centróides substituem os antigos centróides e a iteração volta à etapa 1 se os antigos e novos centróides não convergirem.
As condições para convergir são as seguintes: os centróides antigos e os novos são exatamente idênticos, a diferença entre os centróides é pequena (da ordem de 10 ^ -3) ou o número máximo de iterações (10 ou 100) é atingido.
Algoritmo de MacQueen:
Esta é uma versão online em que as primeiras instâncias 'k' são escolhidas como centróides.
Em seguida, cada instância é colocada em baldes, dependendo do centróide mais próximo dessa instância. O centróide respectivo é recalculado.
Repita esta etapa até que cada instância seja colocada no balde apropriado.
Esse algoritmo possui apenas uma iteração e o loop continua nas instâncias 'x'
Algoritmo de Hartigan-Wong:
- Atribua todos os pontos / instâncias a intervalos aleatórios e calcule o respectivo centróide.
- A partir da primeira instância, encontre o centróide mais próximo e avalie esse balde. Se o balde for alterado, recalcule os novos centróides, isto é, o centróide do balde recém-atribuído e o centróide da atribuição de balde antigo, pois são dois centróides afetados pela alteração
- Passe por todos os pontos e obtenha novos centróides.
- Faça uma segunda iteração dos pontos 2 e 3, que executa uma espécie de operação de limpeza e reatribui pontos perdidos para corrigir as caçambas.
Portanto, esse algoritmo executa duas iterações antes de vermos o resultado da convergência.
Agora, não tenho certeza se o que penso no ponto 4 do algoritmo Hartigan-Wong é o método correto do algoritmo. Minha pergunta é: se o método a seguir para Hartigan-Wong é o método correto para implementar o k-means? Existem apenas duas iterações para este método? caso contrário, qual é a condição para convergência (quando parar)?
Outra explicação possível da implementação é o que eu entendo.
- Atribua todos os pontos / instâncias a intervalos aleatórios e calcule o respectivo centróide.
- A partir da primeira instância, encontre o centróide mais próximo e atribua esse balde. Se o balde for alterado, recalcule os novos centróides, isto é, o centróide do balde recém-atribuído e o centróide da atribuição antiga do balde, pois são dois centróides afetados pela alteração.
- Quando houver uma alteração no intervalo para qualquer ponto, volte para a primeira instância e repita as etapas novamente.
- A iteração termina quando todas as instâncias são iteradas e nenhum dos pontos altera os buckets.
Dessa forma, existem muitas iterações que começam do início do conjunto de dados repetidamente sempre que uma instância altera os buckets.
Quaisquer explicações seriam úteis e, por favor, deixe-me saber se eu entendi errado algum desses métodos.
fonte
Respostas:
O algoritmo de HW, do artigo de 1979, toma como entrada os agrupamentos iniciais. No entanto, os autores sugerem um método para obtê-los em sua última seção. Eles escrevem que é garantido que nenhum cluster estará vazio após a atribuição inicial na sub-rotina . É o seguinte:
Quanto ao algoritmo principal, ele é descrito em um artigo chamado K-Means de Hartigan versus K-Means de Lloyd - É hora de mudar? por N Slonim, E Aharoni, K Crammer, publicado em 2013 pela AJCAI . Observe que esta versão simplesmente usa uma partição inicial aleatória. É o seguinte.
Para os vetoresx ∈ X e um número alvo de clusters K ,
ConjuntoC para ser uma partição aleatória de X para dentro K agrupar e calcular o vetor centróide associado a cada C∈ C denote-os vC .
VarreduraX em ordem aleatória e para todos x ∈ X
2.1 Defina o indicador de parada paras = 1
2.1 Remover provisoriamentex do seu cluster C , de locação C-= CX { x } .
2.2 Localizar
2.3 SeC+≠ C , redefinir C← C- e C∗← C+ e atualizar seus respectivos vetores vC e vC∗ . Também redefinirs ← 0 .
E ses = 0 , volte para 2.
Aqui eu faço um leve abuso de notação deixandoC∗ ser a solução do a r g m i n no 2.2. Esta etapa, 2.2, simplesmente calcula a mudança na perda obtida sex é adicionado a C∗ , em vez de ficar sozinho em seu próprio cluster (uma vez removido). d significa distância. Finalmente, as maneiras particulares de calcular os vetores atualizadosvC , vC∗∪ { x } e assim por diante é fornecido no artigo citado acima. Eles podem ser feitos em tempo linear.
Acho que as respostas para todas as suas perguntas estão implícitas no algoritmo acima ... No entanto, ainda tenho que garantir que essa implementação do algoritmo seja padrão . Em particular se for o implementado em R. Quaisquer comentários / edição são bem-vindos.
fonte