É possível especificar sua própria função de distância usando o K-Means Clustering do scikit-learn?
172
É possível especificar sua própria função de distância usando o K-Means Clustering do scikit-learn?
Respostas:
Aqui estão alguns pequenos quilômetros que usam qualquer uma das 20 distâncias ímpares em scipy.spatial.distance ou uma função de usuário.
Os comentários seriam bem-vindos (até agora, apenas um usuário não foi suficiente); em particular, quais são suas métricas N, dim, k, métrica?
Algumas notas adicionadas em 26 de março de 2012:
1) para a distância do cosseno, primeiro normalize todos os vetores de dados para | X | = 1; então
é rápido. Para vetores de bits, mantenha as normas separadamente dos vetores em vez de expandir para flutuadores (embora alguns programas possam expandir para você). Para vetores esparsos, diga 1% de N, X. Y deve levar tempo O (2% N), espaço O (N); mas não sei quais programas fazem isso.
2) O cluster do Scikit-learn fornece uma excelente visão geral de k-means, mini-batch-k-means ... com código que funciona em matrizes scipy.sparse.
3) Sempre verifique os tamanhos dos clusters após k-médias. Se você está esperando clusters do mesmo tamanho, mas eles saem
[44 37 9 5 5] %
... (som de coçar a cabeça).fonte
Infelizmente não: a implementação atual do scikit-learn do k-means usa apenas distâncias euclidianas.
Não é trivial estender os meios-k a outras distâncias e a resposta de denis acima não é a maneira correta de implementar os meios-k para outras métricas.
fonte
Basta usar o nltk onde você pode fazer isso, por exemplo
fonte
repeats
), 1,5k pontos leva 2 minutos e 2k leva ... muito tempo.Sim, você pode usar uma função métrica de diferença; no entanto, por definição, o algoritmo de agrupamento k-means baseia-se na distância euclidiana da média de cada cluster.
Você pode usar uma métrica diferente, portanto, mesmo assim ainda calculando a média, poderá usar algo como a distância dos mahalnobis.
fonte
Há pyclustering, que é python / C ++ (então é rápido!) E permite que você especifique uma função métrica personalizada
Na verdade, eu não testei esse código, mas juntei-o de um código de exemplo e de ticket .
fonte
O k-means do Spectral Python permite o uso da distância L1 (Manhattan).
fonte
O Sklearn Kmeans usa a distância euclidiana . Não possui parâmetro métrico. Dito isto, se você está agrupando série de tempo , você pode usar o
tslearn
pacote de python, quando você pode especificar uma métrica (dtw
,softdtw
,euclidean
).fonte