una tabla hacer frecuencias frecuencia datos correlaciones como analisis acumulada python machine-learning cluster-analysis data-mining

tabla - frecuencia acumulada python



Agrupar valores por su proximidad en python(¿aprendizaje automático?) (3)

Una buena opción si no sabes la cantidad de clústeres es MeanShift :

import numpy as np from sklearn.cluster import MeanShift, estimate_bandwidth x = [1,1,5,6,1,5,10,22,23,23,50,51,51,52,100,112,130,500,512,600,12000,12230] X = np.array(zip(x,np.zeros(len(x))), dtype=np.int) bandwidth = estimate_bandwidth(X, quantile=0.1) ms = MeanShift(bandwidth=bandwidth, bin_seeding=True) ms.fit(X) labels = ms.labels_ cluster_centers = ms.cluster_centers_ labels_unique = np.unique(labels) n_clusters_ = len(labels_unique) for k in range(n_clusters_): my_members = labels == k print "cluster {0}: {1}".format(k, X[my_members, 0])

Salida para este algoritmo:

cluster 0: [ 1 1 5 6 1 5 10 22 23 23 50 51 51 52] cluster 1: [100 112 130] cluster 2: [500 512] cluster 3: [12000] cluster 4: [12230] cluster 5: [600]

Modificando la variable quantile puede cambiar los criterios de selección del número de agrupamiento

Esta pregunta ya tiene una respuesta aquí:

Tengo un algoritmo que se ejecuta en un conjunto de objetos. Este algoritmo produce un valor de puntaje que dicta las diferencias entre los elementos en el conjunto.

La salida ordenada es algo como esto:

[1,1,5,6,1,5,10,22,23,23,50,51,51,52,100,112,130,500,512,600,12000,12230]

Si coloca estos valores en una hoja de cálculo, verá que forman grupos

[1,1,5,6,1,5] [10,22,23,23] [50,51,51,52] [100,112,130] [500,512,600] [12000,12230]

¿Hay alguna manera de obtener programáticamente esas agrupaciones?

¿Tal vez algún algoritmo de agrupación usando una biblioteca de aprendizaje automático? ¿O estoy pensando demasiado?

He visto scikit pero sus ejemplos son demasiado avanzados para mi problema ...


Puede usar la agrupación para agruparlos. El truco consiste en comprender que hay dos dimensiones en sus datos: la dimensión que puede ver y la dimensión "espacial" que se parece a [1, 2, 3 ... 22]. Puedes crear esta matriz en numpy así:

import numpy as np y = [1,1,5,6,1,5,10,22,23,23,50,51,51,52,100,112,130,500,512,600,12000,12230] x = range(len(y)) m = np.matrix([x, y]).transpose()

Luego puede realizar la agrupación en la matriz, con:

from scipy.cluster.vq import kmeans kclust = kmeans(m, 5)

La salida de kclust se verá así:

(array([[ 11, 51], [ 15, 114], [ 20, 12115], [ 4, 9], [ 18, 537]]), 21.545126372346271)

Para ti, la parte más interesante es la primera columna de la matriz, que dice cuáles son los centros a lo largo de esa dimensión x:

kclust[0][:, 0] # [20 18 15 4 11]

A continuación, puede asignar sus puntos a un clúster en función de cuál de los cinco centros están más cerca de:

assigned_clusters = [abs(cluster_indices - e).argmin() for e in x] # [3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 2, 2, 2, 2, 1, 1, 0, 0, 0]


No use agrupamiento para datos de 1 dimensión

Los algoritmos de agrupamiento están diseñados para datos multivariantes. Cuando tenga datos de una dimensión, ordénelos y busque los espacios más grandes . Esto es trivial y rápido en 1d, y no es posible en 2d. Si desea algo más avanzado, use la Estimación de la densidad del kernel (KDE) y busque los mínimos locales para dividir el conjunto de datos.

Hay una cantidad de duplicados de esta pregunta: