Eu tenho alguns pontos em e quero agrupar os pontos para que:
Cada grupo contém um número igual de elementos de . (Suponha que o número de clusters divida .)
Cada agrupamento é "espacialmente coeso" em algum sentido, como os agrupamentos de -eans.
É fácil pensar em muitos procedimentos de cluster que satisfazem um ou outro, mas alguém sabe como obter os dois ao mesmo tempo?
machine-learning
clustering
k-means
unsupervised-learning
Não Durrett
fonte
fonte
Respostas:
Sugiro uma abordagem em duas etapas:
obtenha boas estimativas iniciais dos centros de cluster, por exemplo, usando meios K difusos ou difusos.
Use a atribuição de vizinho global mais próximo para associar pontos aos centros de cluster: Calcule uma matriz de distância entre cada ponto e cada centro de cluster (você pode tornar o problema um pouco menor calculando apenas distâncias razoáveis), replicar cada centro de cluster X vezes e resolver a linearidade problema de atribuição . Você obterá, para cada centro de cluster, exatamente X corresponde aos pontos de dados, para que, globalmente, a distância entre os pontos de dados e os centros de cluster seja minimizada.
Observe que você pode atualizar os centros de cluster após a etapa 2 e repetir a etapa 2 para executar basicamente médias médias com número fixo de pontos por cluster. Ainda assim, será uma boa ideia obter um bom palpite inicial primeiro.
fonte
Experimente esta variação k-means:
Inicialização :
k
centros do conjunto de dados aleatoriamente, ou melhor ainda, usando a estratégia kmeans ++No final, você deve ter um pareamento que atenda aos seus requisitos do mesmo número de objetos + -1 por cluster (verifique se os últimos poucos clusters também têm o número certo. Os primeiros
m
clusters devem terceil
objetos e o restante exatamente comofloor
objetos).Etapa de iteração :
Requisitos: uma lista para cada cluster com "propostas de troca" (objetos que preferem estar em um cluster diferente).
Etapa E : calcular os centros de cluster atualizados como no k-means regular
Etapa M : Iterando todos os pontos (apenas um ou todos em um lote)
Calcule o centro de cluster mais próximo do objeto / todos os centros de cluster mais próximos que os atuais. Se for um cluster diferente:
Os tamanhos dos aglomerados permanecem invariantes (+ - a diferença teto / piso); os objetos são movidos apenas de um aglomerado para outro, desde que resulte em uma melhoria na estimativa. Portanto, deve convergir em algum momento como k-means. Pode ser um pouco mais lento (ou seja, mais iterações).
Não sei se isso foi publicado ou implementado antes. É exatamente o que eu tentaria (se eu tentasse k-means. Existem algoritmos de clustering muito melhores).
Um bom ponto de partida pode ser a implementação do k-means no ELKI , que já parece oferecer suporte a três inicializações diferentes (incluindo o k-means ++), e os autores disseram que também querem ter estratégias de iteração diferentes, para cobrir todas as várias variantes de forma modular (por exemplo, Lloyd, MacQueen, ...).
fonte
Este é um problema de otimização. Temos uma biblioteca java de código aberto que resolve esse problema (cluster onde a quantidade por cluster deve estar entre os intervalos definidos). Você precisaria que seu número total de pontos tivesse no máximo alguns milhares - não mais que 5000 ou talvez 10000.
A biblioteca está aqui:
https://github.com/PGWelch/territorium/tree/master/territorium.core
A própria biblioteca está configurada para problemas de tipo geográfico / GIS - para que você veja referências a X e Y, latitudes e longitudes, clientes, distância e tempo, etc. Você pode simplesmente ignorar os elementos 'geográficos' e usá-lo como um puro clusterer.
Você fornece um conjunto de clusters de entrada inicialmente vazios, cada um com uma quantidade alvo mínima e máxima. O clusterer atribuirá pontos aos seus clusters de entrada, usando um algoritmo de otimização baseado em heurística (swaps, movimentos etc.). Na otimização, prioriza primeiro manter cada cluster dentro de sua faixa de quantidade mínima e máxima e, em seguida, minimiza as distâncias entre todos os pontos no cluster e o ponto central do cluster, para que um cluster seja espacialmente coeso.
Você atribui ao solucionador uma função métrica (isto é, função de distância) entre pontos usando esta interface:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/TravelMatrix.java
A métrica é realmente estruturada para retornar uma distância e um 'tempo', porque foi projetada para problemas geográficos baseados em viagens, mas para problemas arbitrários de cluster, apenas defina 'tempo' como zero e a distância como a métrica real que você está usando entre pontos.
Você configurou seu problema nesta classe:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Problem.java
Seus pontos seriam os 'Clientes' e a quantidade deles seria 1. Na classe do cliente, defina costPerUnitTime = 0 e costPerUnitDistance = 1, supondo que você esteja retornando sua distância métrica no campo 'distância' retornado pelo TravelMatrix.
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Customer.java
Veja aqui um exemplo de execução do solucionador:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/test/java/com/opendoorlogistics/territorium/TestSolver.java
fonte
Sugiro o artigo recente Clustering Discriminativo por Maximização Regularizada da Informação (e suas referências). Especificamente, a Seção 2 fala sobre equilíbrio de classe e suposição de cluster.
fonte
Recentemente, eu mesmo precisei disso para um conjunto de dados não muito grande. Minha resposta, embora tenha um tempo de execução relativamente longo, é garantida para convergir para um ótimo local.
fonte