Agrupamento com similaridade de cosseno

8

Eu tenho um grande conjunto de dados e uma semelhança de cosseno entre eles. Eu gostaria de agrupá-los usando a semelhança de cosseno que reúne objetos semelhantes sem precisar especificar antecipadamente o número de clusters que eu espero.

Eu li a documentação do sklearn do DBSCAN e da Affinity Propagation, onde ambos exigem uma matriz de distância (não uma matriz de semelhança de cossenos).

Realmente, estou apenas procurando por um algoritmo que não exija a) uma métrica de distância eb) um número pré-especificado de clusters .

Alguém sabe de um algoritmo que faria isso?

Smith Volka
fonte

Respostas:

8

Primeiro, todo algoritmo de agrupamento está usando algum tipo de métrica de distância. O que é realmente importante, porque cada métrica tem suas próprias propriedades e é adequada para diferentes tipos de problemas.

Você disse que tem semelhança de cosseno entre seus registros, então essa é realmente uma matriz de distância. Você pode usar essa matriz como uma entrada em algum algoritmo de cluster.

Agora, sugiro começar com o cluster hierárquico - ele não requer um número definido de clusters e você pode inserir dados e selecionar uma distância ou inserir uma matriz de distância (onde você calculou a distância de alguma maneira).

Observe que o armazenamento em cluster hierárquico é caro para calcular; portanto, se você tiver muitos dados, poderá começar com apenas uma amostra.

HonzaB
fonte
Obrigado pela resposta útil. Estou com um problema semelhante ao datascience.stackexchange.com/questions/20198 e gostaria de usar a resposta fornecida. No entanto, para encontrar os pontos mais próximos do centróide, ele usa a distância mínima do cosseno. Se eu estiver usando similaridade de cosseno, seria a maior semelhança de cosseno?
Smith Volka
1
Você pode simplesmente converter a distância em semelhança. Se a distância de A a B for 0,3, a semelhança será 1-0,3 = 0,7.
HonzaB 5/09
3

O DBSCAN pode ser implementado trivialmente com uma medida de similaridade em vez de uma distância. Você só precisa alterar o <= epsilon para>> epsilon.

O HAC também funciona bem com semelhanças (pelo menos link único, link completo, UPGMA, WPGMA - não use Ward), se você trocar "min" e "max" (você deseja mesclar com o máximo de semelhança e não o mínimo) distância).

Se você é preguiçoso, também pode transformar sua semelhança à distância. Se você tem um máximo fixo, dist = max-sim geralmente funciona.

Possui QUIT - Anony-Mousse
fonte
Obrigado pela resposta. o que ypu quis dizer com epsilon em <= epsilon em a> = epsilon?
Smith Volka 6/17
Ok, o valor padrão de eps no sklearn é 0,5. É correto se eu aumentar esse valor (por exemplo, 0,8). É o que você quis dizer com sua resposta?
Smith Volka
O DBSCAN usa um limite máximo de distância epsilon. Por GDBSCAN, você também pode usar uma semelhança mínima. você precisa alterar o código, não o parâmetro . O Sklearn não suporta uma semelhança. O ELKI tem suporte direto para funções de similaridade no GDBSCAN via SimilarityNeighborPredicate.
Saiu - Anony-Mousse
Se você não pode codificar, pode fazer a abordagem "preguiçosa" que mencionei. Deve dar os mesmos resultados.
QuIT - Anony-Mousse
O que você quer dizer com Se você tem um máximo fixo, dist = max-sim costuma fazer? Estou interessado em tentar.
Smith Volka
3

Eu usaria o cluster hierárquico do sklearn

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from scipy.cluster import  hierarchy

#Vectorizing
X = CountVectorizer().fit_transform(docs)
X = TfidfTransformer().fit_transform(X)
#Clustering
X = X.todense()
threshold = 0.1
Z = hierarchy.linkage(X,"average", metric="cosine")
C = hierarchy.fcluster(Z, threshold, criterion="distance")

Cé o seu agrupamento de documentos docs.

Você pode usar outras métricas em vez de cosinee usar um limite diferente de0.1

Uri Goren
fonte
"docs" é a matriz de dados original? Onde colocar a matriz de dados ou onde colocar a matriz de similaridade de cosseno? obrigado
Bill Ancalagon the black
1
docssão os documentos, Zé a matriz de co-seno similaridade
Uri Goren
3

Acho que o pacote clustMixType pode fornecer melhores resultados / insights.

Ao usar este pacote, você pode usar a combinação de Dados Categóricos e Numéricos diretamente, não precisa de nenhum tipo de codificação quente.

Você só precisa alimentar os dados e eles segregam automaticamente em Dados Categóricos e Numéricos. Se você encontrar algum problema no momento da segregação, poderá usar funções como as.factor(to convert to a categorical)e as.numeric(to convert to a Numeric field).

Você pode calcular Lambda(mean Distance value)antes da mão e alimentá-lo como uma entrada para o algoritmo.

Se você não sabe o número ideal de clusters, você pode usar WSS(within Sum of Squares), plot(elbow chart)para decidir o número ideal de clusters.

Toros91
fonte
2

Todos os métodos de cluster usam uma métrica de distância de algum tipo. E lembre-se de que a distância é essencialmente uma medida de dissimilaridade. Portanto, se você normalizar sua semelhança entre 0 e 1, sua distância é simplesmente uma semelhança

Quanto aos algoritmos que não exigem que um número de clusters sejam especificados, é claro que existem técnicas hierárquicas de clustering, que essencialmente constroem uma árvore como uma estrutura que você pode "cortar" onde quiser (você pode usar algumas métricas de desempenho para fazer isso automaticamente) )

X-means é uma versão do K-means que tenta um certo número de K e escolhe aquele que maximiza alguma função de avaliação.

O deslocamento médio também "encontra" um número natural de clusters, mas é sensível a outros parâmetros, como a largura de banda, por exemplo.

Valentin Calomme
fonte