É fácil calcular o mapeamento entre dois conjuntos de resultados, porque as informações obtidas em um teste podem ser representadas como um conjunto de três tuplas: o primeiro componente é um ponto (multidimensional), o segundo é um rótulo de cluster (arbitrário) fornecido pelo seu algoritmo e o terceiro é um rótulo de cluster (arbitrário) fornecido por um algoritmo de referência. Construa o porkktabela de classificação para os pares de rótulos: se os resultados concordarem, será um múltiplo de uma matriz de permutação. Ou seja, cada linha e cada coluna deve ter exatamente uma célula diferente de zero. Essa é uma verificação simples para programar. Também é fácil rastrear pequenos desvios desse ideal de volta aos pontos de dados individuais, para que você possa ver com precisão como as duas respostas diferem, se são diferentes. Eu não me incomodaria em calcular medidas estatísticas de concordância: ou há concordância perfeita (até a permutação) ou não, e no último caso, você precisa rastrear todos os pontos de discordância para entender como eles ocorrem. Os resultados concordam ou não; qualquer desacordo, mesmo em um ponto, precisa ser verificado.
Você pode usar vários tipos de conjuntos de dados para testar: (1) conjuntos de dados publicados com resultados de médias k publicados; (2) conjuntos de dados sintéticos com agrupamentos fortes óbvios; (3) conjuntos de dados sintéticos sem agrupamento óbvio. (1) é uma boa disciplina a ser usada sempre que você escrever qualquer programa de matemática ou estatística. (2) é fácil de fazer de várias maneiras, como gerar alguns pontos aleatórios para servir como centros de agrupamentos e depois gerar nuvens de pontos deslocando aleatoriamente os centros de agrupamentos em quantidades relativamente pequenas. (3) fornece algumas verificações aleatórias que potencialmente descobrem comportamentos inesperados; Novamente, essa é uma boa disciplina geral de teste.
Além disso, considere a criação de conjuntos de dados que enfatizam o algoritmo, apenas nos limites entre soluções extremas. Isso exigirá criatividade e um profundo entendimento do seu algoritmo (o que você provavelmente tem!). Um exemplo que gostaria de verificar em qualquer caso, seria conjuntos de vetores da forma onde é um vetor sem componentes de zero e assume valores sequenciais integrais . Eu também gostaria de verificar o algoritmo em conjuntos de vetores que formam polígonos equilaterais. Em qualquer uma das situações, os casos em que não é um múltiplo de são particularmente interessantes, incluindo ondeivvi0,1,2,…,n−1nkné menor que . O que é comum a essas situações é que (a) eles usam todas as dimensões do problema, mas (b) as soluções corretas são geometricamente óbvias e (c) existem várias soluções corretas.k
(Forme polígonos equilaterais aleatórios nas dimensões , começando com dois vetores diferentes de zero e escolhidos aleatoriamente. (Uma boa maneira é permitir que seus componentes sejam variáveis normais padrão independentes). eles têm tamanho unitário; vamos chamá-los de e . Remova o componente de por meio da fórmulad≥2uv2dxzxz
w=z−(z⋅x)x.
Obtenha redimensionando para ter o tamanho da unidade. Se quiser, redimensione uniformemente e aleatoriamente. Os vetores e formam uma base ortogonal para um subespaço 2D aleatório em dimensões. Um polígono equilátero de vértices é obtido como o conjunto de pois o número inteiro varia de até .)w x y x y d n cos ( 2 π k / n ) x + sen ( 2 π k / n ) y k 0 n - 1ywxyxydncos(2πk/n)x+sin(2πk/n)yk0n−1