Pergunta

Eu estou olhando para Python implementação do algoritmo k-means, com exemplos para cluster de cache e o meu banco de dados de coordenadas.

Foi útil?

Solução

O agrupamento de Scipy As implementações funcionam bem e incluem um K-means implementação.

Há também cluster scipy, que faz agrupamentos aglomerativos; Isso tem a vantagem de que você não precisa decidir sobre o número de clusters com antecedência.

Outras dicas

Scipy's Kmeans2 () tem alguns problemas numéricos: outros têm relatado Mensagens de erro como "Matrix não são positivas definidas - a decomposição de Cholesky não pode ser calculada" na versão 0.6.0, e eu apenas encontrei o mesmo na versão 0.7.1.

Por enquanto, eu recomendaria usar Pycluster em vez de. Exemplo de uso:

>>> import numpy
>>> import Pycluster
>>> points = numpy.vstack([numpy.random.multivariate_normal(mean, 
                                                            0.03 * numpy.diag([1,1]),
                                                            20) 
                           for mean in [(1, 1), (2, 4), (3, 2)]])
>>> labels, error, nfound = Pycluster.kcluster(points, 3)
>>> labels  # Cluster number for each point
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32)
>>> error   # The within-cluster sum of distances for the solution
1.7721661785401261
>>> nfound  # Number of times this solution was found
1

Para dados contínuos, K-means é muito fácil.

Você precisa de uma lista de seus meios e, para cada ponto de dados, encontre a média mais próxima e a média dos novos dados aponte. Seus meios representarão os recentes grupos salientes de pontos nos dados de entrada.

Eu faço a média continuamente, não há necessidade de ter os dados antigos para obter a nova média. Dada a média antiga k, o próximo ponto de dados x, e uma constante n que é o número de pontos de dados anteriores para manter a média de, a nova média é

k*(1-(1/n)) + n*(1/n)

Aqui está o código completo em Python

from __future__ import division
from random import random

# init means and data to random values
# use real data in your code
means = [random() for i in range(10)]
data = [random() for i in range(1000)]

param = 0.01 # bigger numbers make the means change faster
# must be between 0 and 1

for x in data:
    closest_k = 0;
    smallest_error = 9999; # this should really be positive infinity
    for k in enumerate(means):
        error = abs(x-k[1])
        if error < smallest_error:
            smallest_error = error
            closest_k = k[0]
        means[closest_k] = means[closest_k]*(1-param) + x*(param)

Você pode simplesmente imprimir os meios quando todos os dados passaram, mas é muito mais divertido vê -los mudar em tempo real. Eu usei isso em envelopes de frequência de 20 ms de som e, depois de conversar com ele por um minuto ou dois, ele tinha categorias consistentes para a vogal curta 'A', a longa vogal 'o' e a consoante 's'. Wierd!

A partir de Wikipedia, você pode usar o Scipy, K-means agrupando uma quantização de vetor

Ou, você pode usar um invólucro python para OpenCV, Ctypes-Opencv.

Ou você poderia A nova interface Python da OpenCV, e deles Kmeans implementação.

(Anos depois) este kmeans.py sob IS-It-Possível para Especificar-Se-Ande-Distância-Função-Use-Scikits-Learn-K-Means é direto e razoavelmente rápido; Ele usa qualquer uma das métricas de 20 ímpares em scipy.spatial.distance.

Você também pode usar o GDAL, que tem muitas funções para trabalhar com dados espaciais.

Scikit Learn's Kmeans () é a maneira mais simples de aplicar o agrupamento K-Means em Python. Clusters de ajuste é simples como:kmeans = KMeans(n_clusters=2, random_state=0).fit(X).

Este snippet de código mostra como armazenar coordenadas do centróide e prever clusters para uma variedade de coordenadas.

>>> from sklearn.cluster import KMeans
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
...               [4, 2], [4, 4], [4, 0]])
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
>>> kmeans.labels_
array([0, 0, 0, 1, 1, 1], dtype=int32)
>>> kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)
>>> kmeans.cluster_centers_
array([[ 1.,  2.],
       [ 4.,  2.]])

(Cortesia da documentação de Scikit Learn, vinculada acima)

Python Pycluster e pyplot pode ser usado para k-means clustering e para a visualização de dados 2D.Um recente post de blog Preço das ações/Análise do Volume de Python e PyCluster dá um exemplo de cluster usando PyCluster em dados de estoque.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top