uniforme probabilidad matriz kernels interpretacion gaussiano funciones estimador densidad curva construcción confusion machine-learning scikit-learn cluster-analysis data-mining kernel-density

machine-learning - probabilidad - kernel gaussiano



¿Cómo se usaría una estimación de densidad de kernel como un método de agrupamiento 1D en scikit learn? (1)

Necesito agrupar un conjunto simple de datos univariados en un número preestablecido de grupos. Técnicamente, estaría más cerca de agrupar u ordenar los datos, ya que solo es 1D, pero mi jefe lo llama agrupación, por lo que me atendré a ese nombre. El método actual utilizado por el sistema en el que estoy es K-medias, pero eso parece una exageración.

¿Hay una mejor manera de realizar esta tarea?

Las respuestas a algunas otras publicaciones mencionan KDE (Estimación de la densidad del kernel), pero ese es un método de estimación de la densidad, ¿cómo funcionaría?

Veo cómo KDE devuelve una densidad, pero ¿cómo le digo que divida los datos en contenedores?

¿Cómo tengo un número fijo de contenedores independientemente de los datos (ese es uno de mis requisitos)?

Más específicamente, ¿cómo se podría lograr esto con scikit learn?

Mi archivo de entrada se ve como:

str ID sls 1 10 2 11 3 9 4 23 5 21 6 11 7 45 8 20 9 11 10 12

Quiero agrupar el número de sls en grupos o contenedores, de manera que:

Cluster 1: [10 11 9 11 11 12] Cluster 2: [23 21 20] Cluster 3: [45]

Y mi archivo de salida se verá como:

str ID sls Cluster ID Cluster centroid 1 10 1 10.66 2 11 1 10.66 3 9 1 10.66 4 23 2 21.33 5 21 2 21.33 6 11 1 10.66 7 45 3 45 8 20 2 21.33 9 11 1 10.66 10 12 1 10.66


Escriba el código usted mismo. Entonces se ajusta mejor a tu problema!

Placa de preparación: Nunca asuma que el código que descarga de la red es correcto u óptimo ... asegúrese de entenderlo completamente antes de usarlo.

%matplotlib inline from numpy import array, linspace from sklearn.neighbors.kde import KernelDensity from matplotlib.pyplot import plot a = array([10,11,9,23,21,11,45,20,11,12]).reshape(-1, 1) kde = KernelDensity(kernel=''gaussian'', bandwidth=3).fit(a) s = linspace(0,50) e = kde.score_samples(s.reshape(-1,1)) plot(s, e)

from scipy.signal import argrelextrema mi, ma = argrelextrema(e, np.less)[0], argrelextrema(e, np.greater)[0] print "Minima:", s[mi] print "Maxima:", s[ma] > Minima: [ 17.34693878 33.67346939] > Maxima: [ 10.20408163 21.42857143 44.89795918]

Tus grupos por lo tanto son

print a[a < mi[0]], a[(a >= mi[0]) * (a <= mi[1])], a[a >= mi[1]] > [10 11 9 11 11 12] [23 21 20] [45]

Y visualmente, hicimos esta división:

plot(s[:mi[0]+1], e[:mi[0]+1], ''r'', s[mi[0]:mi[1]+1], e[mi[0]:mi[1]+1], ''g'', s[mi[1]:], e[mi[1]:], ''b'', s[ma], e[ma], ''go'', s[mi], e[mi], ''ro'')

Cortamos en los marcadores rojos. Los marcadores verdes son nuestras mejores estimaciones para los centros de cluster.