Pergunta

Suponha que um grupo de pontos de dados, como um plotado aqui (este gráfico não é específico para o meu problema, mas apenas usado como um exemplo adequado):

Inspecionando o gráfico de dispersão visualmente, é bastante óbvio que os pontos de dados formam dois 'grupos', com alguns pontos aleatórios que obviamente também não pertencem.

Estou procurando um algoritmo, que me permitiria:

  • Comece com um conjunto de dados de duas ou mais dimensões.
  • detectar esses grupos do conjunto de dados sem conhecimento prévio sobre quantos (ou se houver) podem estar lá
  • Depois que os grupos forem detectados, 'pergunte' ao modelo de grupos, se um novo ponto de amostra parece se encaixar em qualquer um dos grupos
Foi útil?

Solução

Existem muitas opções, mas se você estiver interessado na probabilidade de um novo ponto de dados pertencer a uma mistura específica, eu usaria uma abordagem probabilística, como a modelagem da mistura gaussiana estimada pela máxima probabilidade ou Bayes.

Estimativa de máxima verossimilhança de Modelos de mistura são implementados no MATLAB.

Sua exigência de que o número de componentes seja desconhecida torna seu modelo mais complexo. A abordagem probabilística dominante é colocar um processo de Dirichlet antes da distribuição e estimativa da mistura por algum método bayesiano. Por exemplo, veja Este artigo sobre modelos infinitos de mistura gaussiana. O modelo de mistura DP fornecerá inferência sobre o número de componentes e os componentes a que cada elementos pertencem, o que é exatamente o que você deseja. Como alternativa, você pode executar a seleção de modelos no número de componentes, mas isso geralmente é menos elegante.

Existem muitas implementação de modelos de mistura DP, mas eles podem não ser tão convenientes. Por exemplo, aqui está um Implementação do MATLAB.

Seu gráfico sugere que você é um usuário de R. Nesse caso, se você está procurando soluções pré -embaladas, a resposta para sua pergunta está sobre isso Visualização de tarefas para análise de cluster.

Outras dicas

Eu acho que você está procurando algo como Algoritmo de agrupamento K-Means.

Você deve encontrar implementações adequadas na maioria dos idiomas de uso geral.

Você precisa de um dos algoritmos de cluster. Todos eles podem ser divididos em 2 grupos:

  1. Você especifica o número de grupos (clusters) - 2 clusters em seu exemplo
  2. Algoritmo Tente adivinhar o número correto de clusters por si só

Se você deseja algoritmo do 1º tipo, o K-Means é o que você realmente precisa.

Se você deseja algoritmo do segundo tipo, provavelmente precisará de um dos algoritmos de cluster hierárquico. Eu nunca implemento nenhum deles. Mas vejo uma maneira fácil de melhorar o K-Means de tal maneira que será desnecessário especificar o número de clusters.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top