He leído un montón de tutoriales sobre la forma correcta de generar una distribución logarítmica de los pesos de la nube de etiquetas. La mayoría de ellos agrupa las etiquetas en pasos. Esto me parece algo tonto, así que desarrollé mi propio algoritmo basado en lo que he leído para que distribuya dinámicamente el conteo de la etiqueta a lo largo de la curva logarítmica entre el umbral y el máximo. Aquí está la esencia de la misma en Python:¿Cuál es el algoritmo correcto para una curva de distribución logarmíntica entre dos puntos?
from math import log
count = [1, 3, 5, 4, 7, 5, 10, 6]
def logdist(count, threshold=0, maxsize=1.75, minsize=.75):
countdist = []
# mincount is either the threshold or the minimum if it's over the threshold
mincount = threshold<min(count) and min(count) or threshold
maxcount = max(count)
spread = maxcount - mincount
# the slope of the line (rise over run) between (mincount, minsize) and (maxcount, maxsize)
delta = (maxsize - minsize)/float(spread)
for c in count:
logcount = log(c - (mincount - 1)) * (spread + 1)/log(spread + 1)
size = delta * logcount - (delta - minsize)
countdist.append({'count': c, 'size': round(size, 3)})
return countdist
Básicamente, sin el cálculo logarítmico de la cuenta individual, se generaría una línea recta entre los puntos, (mincount, minsize) y (MaxCount, maxsize).
El algoritmo hace una buena aproximación de la curva entre los dos puntos, pero adolece de un inconveniente. El minuto es un caso especial, y su logaritmo produce cero. Esto significa que el tamaño del mincount sería menor que el mínimo. Intenté cocinar los números para tratar de resolver este caso especial, pero parece que no puedo hacerlo bien. Actualmente solo trato el mincount como un caso especial y agrego "or 1
" a la línea de logcount.
¿Hay un algoritmo más correcto para dibujar una curva entre los dos puntos?
Update Mar 3: Si no me equivoco, estoy tomando el registro del conteo y luego lo enchufo en una ecuación lineal. Para poner la descripción del caso especial en otras palabras, en y = lnx en x = 1, y = 0. Esto es lo que sucede en el minuto. Pero el mincount no puede ser cero, la etiqueta no se ha usado 0 veces.
Pruebe el código y conecte sus propios números para probar. Considero que tratar el mincount como caso especial está bien, tengo la sensación de que sería más fácil que cualquiera que sea la solución real a este problema. Siento que hay debe ser una solución a esto y que alguien probablemente ha encontrado una solución.
ACTUALIZACIÓN Abr 6: Una simple búsqueda google convierte un muchos de los tutoriales que he leído, pero this es probablemente el ejemplo más completo de las nubes de etiquetas escalonadas.
ACTUALIZACIÓN abr 28: En respuesta a la solución de antti.huima: Cuando se representa gráficamente, la curva que crea el algoritmo se encuentra por debajo de la línea entre los dos puntos. He estado tratando de hacer malabarismos con los números, pero todavía no se me ocurre una forma de pasar esa curva al otro lado de la línea. Supongo que si la función se cambiara a alguna forma de logaritmo en lugar de a un exponente, haría exactamente lo que necesitaría. ¿Es eso correcto? Si es así, ¿alguien puede explicar cómo lograr esto?
Usted menciona tutoriales, yo ¿Pueden los enlaces de haz? – akuhn
de acuerdo, sin más antecedentes es bastante difícil entender cuál es el problema real. – wds