Pregunta

Busco implementación de Python del algoritmo k-medias con ejemplos a agruparse y la memoria caché mi base de datos de coordenadas.

¿Fue útil?

Solución

agrupación de Scipy implementaciones funcionan bien, y que incluyen un k-medias aplicación.

También hay scipy-cluster, que hace la agrupación de aglomeración; THS tiene la ventaja de que no es necesario para decidir sobre el número de grupos antes de tiempo.

Otros consejos

kmeans2 () tiene algunos problemas numéricos: los demás informó mensajes de error como "Matrix no es positivo definitiva -. descomposición de Cholesky no se puede calcular" en la versión 0.6.0, y sólo se encontró con el mismo en la versión 0.7.1

Por ahora, yo recomendaría usar PyCluster 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 los datos continuos, k-medios es muy fácil.

Se necesita una lista de sus medios, y para cada punto de datos, encontrar la media de su más cercano a y el promedio del nuevo punto de datos a la misma. sus medios representarán los últimos grupos salientes de puntos en los datos de entrada.

hago el promedio de forma continua, por lo que no hay necesidad de tener los datos antiguos para obtener la nueva media. Dada la edad media k, el siguiente x punto de datos, y una n constante que es el número de puntos de datos anteriores para mantener el promedio de, la nueva media 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(x-k[1])
        if error < smallest_error:
            smallest_error = error
            closest_k = k[0]
        means[closest_k] = means[closest_k]*(1-param) + x*(param)

usted podría imprimir los medios cuando todos los datos han pasado a través, pero es mucho más divertido ver que cambian en tiempo real. He utilizado este en sobres de frecuencia de 20 ms bits de sonido y después de hablar con él por un minuto o dos, que tenían categorías consistentes para el corto 'a' vocal, la larga 'o' vocal y consonante 's'. extraño!

Wikipedia , se puede usar scipy, K-means clustering una cuantificación vectorial

O, se puede utilizar un envoltorio de Python para OpenCV, ctypes-OpenCV .

nueva interfaz de Python de OpenCV, y su kmeans aplicación.

(años después) esta kmeans.py bajo es-es-posible-a-especifique-su-propio-distancia-función-usando-scikits-aprender-k-medias es sencillo y razonablemente rápido; que utiliza cualquiera de las métricas de 20 y pico en scipy.spatial.distance.

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

KMeans () es la forma más sencilla de aplicar k-means clustering en Python. Montaje de los grupos es de 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 las agrupaciones para una serie 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 SciKit a aprender la documentación, vinculado anteriormente)

Pycluster y pyplot de Python se pueden utilizar para k-significa la agrupación y para la visualización de datos 2D. Una reciente publicación en el blog Análisis de la bolsa / volumen mediante Python y PyCluster da un ejemplo de agrupamiento usando PyCluster en los datos de valores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top