Python k-medias algoritmo

Estoy buscando la implementación de Python del algoritmo k-means con ejemplos para agrupar y almacenar en caché mi base de datos de coordenadas.

Las implementaciones de agrupación en clúster de Scipy funcionan bien, e incluyen una implementación de k-means .

También hay scipy-cluster , que hace el agrupamiento aglomerado; Esto tiene la ventaja de que no necesita decidir la cantidad de clusters antes de tiempo.

El kmeans2 () de SciPy tiene algunos problemas numéricos: otros han reportado mensajes de error como “La matriz no es positiva definida. La descomposición de Cholesky no se puede calcular” en la versión 0.6.0, y acabo de encontrar la misma en la versión 0.7.1.

Por ahora, recomendaría usar PyCluster en su lugar. Ejemplo 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 datos continuos, k-means es muy fácil.

Necesita una lista de sus medios, y para cada punto de datos, encuentre la media más cercana a su punto promedio de datos. sus medios representarán los grupos de puntos salientes recientes en los datos de entrada.

Hago el promedio continuamente, por lo que no es necesario tener los datos antiguos para obtener el nuevo promedio. Dado el promedio antiguo k , el siguiente punto de datos x una constante n que es el número de puntos de datos pasados ​​para mantener el promedio de, el nuevo promedio es

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

Aquí está el código completo en 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(xk[1]) if error < smallest_error: smallest_error = error closest_k = k[0] means[closest_k] = means[closest_k]*(1-param) + x*(param) 

simplemente puede imprimir los medios cuando todos los datos hayan pasado, pero es mucho más divertido verlos cambiar en tiempo real. Utilicé esto en envolventes de frecuencia de 20ms de bits de sonido y después de hablar con él durante uno o dos minutos, tenía categorías consistentes para la vocal 'a' corta, la vocal 'o' larga y la consonante 's'. extraño

De wikipedia , puede usar scipy, K-significa agrupar un vector cuantificación

O bien, podría usar un envoltorio de Python para OpenCV, ctypes-opencv .

O podrías abrir la nueva interfaz Python de OpenCV y su implementación kmeans .

(Años más tarde) este kmeans.py bajo es -es -es-posible-especificar-su-propia-función-de-distancia-usar-scikits-learn-k-means es directo y razonablemente rápido; utiliza cualquiera de las métricas de 20 impares en scipy.spatial.distance.

También puede usar GDAL, que tiene muchas funciones para trabajar con datos espaciales.

El KMeans () de SciKit Learn es la forma más sencilla de aplicar el clustering de k-means en Python. Ajustar grupos es simple como: kmeans = KMeans(n_clusters=2, random_state=0).fit(X) .

Este fragmento de código muestra cómo almacenar las coordenadas del centroide y predecir los grupos para una matriz 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.]]) 

(cortesía de la documentación de SciKit Learn, enlazada arriba)

Python’s Pycluster y pyplot se pueden usar para agrupar k-means y para la visualización de datos 2D. Una publicación reciente en el blog Stock Stock / Volume Analysis usando Python y PyCluster da un ejemplo de agrupación usando PyCluster en datos de stock.