Eu tenho uma tabela de banco de dados de transferências de dados entre nós diferentes. Este é um enorme banco de dados (com quase 40 milhões de transferências). Um dos atributos é o número de transferências de bytes (nbytes) que variam de 0 bytes a 2 tera bytes. Gostaria de agrupar os nbytes de modo que, dado k clusters, algumas transferências x1 pertençam ao cluster k1, x2 transfters ao k2 etc.
Pela terminologia que usei, você deve ter adivinhado o que eu estava fazendo: K-significa. Esses são dados 1d, já que nbytes é o único recurso que me interessa. Quando eu estava procurando por métodos diferentes para isso, vi o EM ser mencionado algumas vezes, juntamente com uma abordagem sem agrupamento. Gostaria de saber suas opiniões sobre como abordar esse problema (especificamente se agrupar ou não agrupar).
Obrigado!
fonte
Respostas:
Em dados unidimensionais, não use análise de cluster.
A análise de cluster é geralmente uma técnica multivariada. Ou deixe-me dizer o contrário: para dados unidimensionais - que são completamente ordenados - existem técnicas muito melhores. Usar k-means e técnicas semelhantes aqui é um desperdício total, a menos que você faça um esforço suficiente para realmente otimizá-las para o caso 1-d.
Apenas para dar um exemplo: para k-significa, é comum usar k objetos aleatórios como sementes iniciais. Para dados unidimensionais, é bastante fácil fazer melhor usando apenas os quantis apropriados (1 / 2k, 3 / 2k, 5 / 2k etc.), depois de classificar os dados uma vez e otimizar a partir deste ponto de partida. No entanto, os dados 2D não podem ser classificados completamente. E em uma grade, provavelmente haverá células vazias.
Eu também não chamaria isso de cluster. Eu chamaria isso de intervalo . O que você realmente deseja fazer é otimizar as bordas do intervalo. Se você fizer k-means, ele testará para cada objeto se deve ser movido para outro cluster. Isso não faz sentido em 1D: apenas os objetos nas bordas do intervalo precisam ser verificados. Obviamente, isso é muito mais rápido, pois existem apenas ~ 2k objetos lá. Se eles ainda não preferem outros intervalos, objetos mais centrais também não.
Você pode pesquisar técnicas como a otimização do Jenks Natural Breaks , por exemplo.
Ou você pode fazer uma estimativa da densidade do kernel e procurar mínimos locais da densidade para dividir lá. O bom é que você não precisa especificar k para isso!
PS, por favor, use a função de pesquisa. Aqui estão algumas perguntas sobre o cluster de dados 1-d que você perdeu:
fonte
Sua pergunta é se você deve agrupar ou qual método você deve usar para agrupar?
Se você deve agrupar em cluster, isso depende se você deseja particionar automaticamente seus dados (por exemplo, se você deseja repetir esse particionamento várias vezes). Se você estiver fazendo isso apenas uma vez, basta olhar para o histograma da distribuição de seus valores e particioná-lo a olho, conforme proposto nos comentários. Eu recomendaria analisar os dados a olho nu, pois isso poderia ajudá-lo a determinar quantos clusters você deseja e também se o cluster "funcionou".
Em relação ao tipo de cluster, o k-means deve ser bom se houver clusters "reais" nos dados. Se você não encontrar clusters no histograma, não faz muito sentido agrupá-lo de qualquer maneira, já que qualquer particionamento do seu intervalo de dados fornecerá clusters válidos (ou, no caso de iniciação aleatória de kmeans, você terá clusters diferentes cada corrida).
fonte
Podes tentar:
KMeans, GMM ou outros métodos, especificando n_clusters = no. de picos no gráfico de densidade do núcleo.
KMeans, GMM ou outros métodos, determinando o número ideal. de clusters com base em algumas métricas. Mais informações: [aqui] https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set
fonte