Como agrupar uma instância com o DBSCAN de Weka?

9

Estou tentando usar o cluster do DBSCAN da Weka para agrupar instâncias. Pelo que entendi, eu deveria estar usando o método clusterInstance() para isso, mas para minha surpresa, ao dar uma olhada no código desse método, parece que a implementação ignora o parâmetro:

/**
 * Classifies a given instance.
 *
 * @param instance The instance to be assigned to a cluster
 * @return int The number of the assigned cluster as an integer
 * @throws java.lang.Exception If instance could not be clustered
 * successfully
 */
public int clusterInstance(Instance instance) throws Exception {
    if (processed_InstanceID >= database.size()) processed_InstanceID = 0;
    int cnum = (database.getDataObject(Integer.toString(processed_InstanceID++))).getClusterLabel();
    if (cnum == DataObject.NOISE)
        throw new Exception();
    else
        return cnum;
}

Isso não parece certo. Como isso deveria funcionar? Existe um método diferente que eu deveria estar usando para clustering? Eu tenho que executar este método sequencialmente em todas as instâncias, em alguma ordem específica, se eu quiser obter alguma informação útil?

    
por Oak 17.09.2011 в 09:10
fonte

3 respostas

0

Como Mark respondeu, isso é obviamente um bug. Contanto que você consulte as instâncias na mesma ordem em que elas foram inseridas no clusterer, tudo bem; mas não funciona em nenhum outro caso.

Uma colega de trabalho resolveu isso escrevendo sua própria versão da classe DBScan: essencialmente idêntica (cópia-colada), exceto que ela mantém um mapeamento entre instâncias e rótulos de cluster. Esse mapeamento pode ser produzido pela iteração do conteúdo da instância database . O cluster apropriado para uma instância pode ser imediatamente recuperado desse mapeamento.

A edição deste método também é uma boa oportunidade para alterar o throw new Exception em algo mais sensato nesse contexto, como return -1 .

    
por Oak 16.11.2011 / 19:39
fonte
5

Isso foi relatado como um bug - [Wekalist] DBScan - Problema / Bug com "clusterInstance ()" - Função .

  

Eu estou fazendo alguns clusters com a biblioteca DBScan. Infelizmente isso   Parece que há um bug na função "clusterInstance ()". o   função não retorna o número do cluster atribuído, mas apenas   retorna o número do cluster do primeiro elemento do banco de dados (ou o   segunda na segunda chamada, a terceira na terceira, e assim por diante.)   e NÃO a instância atribuída.

     

Ele simplesmente não pode funcionar porque a variável atribuída nunca é usada em   a função.

A resposta diz:

  

DBScan e Optics são contribuições para a Weka. Provavelmente é melhor se você   Entre em contato com os autores para ver se eles podem sugerir uma correção de bug. O código e   informações do pacote (Weka 3.7) tem informações de contato:

     

link

Eu tenho medo de não estar familiarizado com o algoritmo DBScan e o código é bastante antigo agora (2004), você pode ter sorte e achar que ainda é capaz de contatar os autores no LMU Munich.

Eu encontrei várias cópias dele por meio de Pesquisa do Google Code e GitHub , mas não consegui encontrar um exemplo onde foi corrigido. Durante a pesquisa, notei várias outras implementações do DBScan que você poderia examinar para descobrir como este poderia ser corrigido (por exemplo, DBSCAN da ELKI )

Como eu disse, não estou familiarizado com o DBScan, mas olhar para os JavaDocs me deu a impressão de que o clustering real é chamado chamando buildClusterer (instâncias de instâncias) . Examinando o código-fonte, parece haver muito mais acontecendo dentro do método buildClusterer do que o método clusterInstance . OPTICS.java também contém um método clusterInstance e esse apenas lança uma exceção. Se você tiver sorte, talvez consiga passar sem o método clusterInstance em funcionamento.

Encontrei um exemplo do DBScan de Weka sendo usado aqui: DBSCANClustering.java

    
por Mark McLaren 22.09.2011 / 00:22
fonte
0

O exemplo postado por Mark mostra bem como usar a classe DBScan.

O método que faz o cluster real é DBScan.buildClusterer(Instances instances) .

O DBScan.clusterInstance(Instance instance) deve retornar o número do cluster atribuído para uma determinada instância (depois que você executou o método buildClusterer ). Mas é verdade que o parâmetro é realmente ignorado, então eu acho que não vai fazer o que é suposto fazer.

    
por Dario Seidl 22.09.2011 / 02:00
fonte