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í:
- Agrupe los datos unidimensionales de manera óptima? [cerrado] 3 respuestas
- 1D Number Array Clustering [duplicado] 2 respuestas
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: