Przeczytałem kilka tutoriali na temat prawidłowego sposobu generowania logarytmicznej dystrybucji wag tagcloud. Większość z nich grupuje znaczniki w etapy. Wydaje mi się to trochę głupie, więc opracowałem własny algorytm na podstawie tego, co przeczytałem, aby dynamicznie dystrybuował liczbę znaczników wzdłuż krzywej logistycznej między progiem a maksimum. Oto esencja w Pythonie:Jakie jest prawidłowe algandm dla logartycznej krzywej rozkładu pomiędzy dwoma punktami?
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
Zasadniczo bez logarytmicznej obliczania indywidualnego zliczania, to generuje linię prostą między punktami (mincount, minSize) i (MAXCOUNT, maxSize).
Algorytm wykonuje dobre przybliżenie krzywej między dwoma punktami, ale ma jedną wadę. Mincount jest szczególnym przypadkiem, a jego logarytm daje zero. Oznacza to, że rozmiar mincount byłby mniejszy niż min. Próbowałem gotować numery, aby spróbować rozwiązać ten szczególny przypadek, ale nie wydaje się, aby to naprawić. Obecnie traktuję mincount jako specjalny przypadek i dodam "or 1
" do wiersza logcount.
Czy istnieje poprawniejszy algorytm do narysowania krzywej między dwoma punktami?
Update Mar 3: Jeśli się nie mylę, przejmuję dziennik liczenia, a następnie podłączam go do równania liniowego. Aby opisać specjalny przypadek innymi słowy, w y = lnx przy x = 1, y = 0. Tak dzieje się w mincount. Ale mincount nie może wynosić zero, tag nie był używany 0 razy.
Wypróbuj kod i podłącz własne numery do przetestowania. Traktowanie mincount jako szczególnego przypadku jest w porządku przeze mnie, mam wrażenie, że byłoby to łatwiejsze niż jakiekolwiek rzeczywiste rozwiązanie tego problemu. Po prostu mam ochotę musi być rozwiązanie tego i że ktoś prawdopodobnie wymyślił rozwiązanie.
UPDATE 06 kwietnia: prosty google wyszukiwania pojawia się wiele tutoriali czytałem, ale this jest prawdopodobnie najbardziej kompletny przykład schodkowych chmury tagów.
UPDATE Apr 28: W odpowiedzi na rozwiązanie antti.huimy: Podczas tworzenia wykresu krzywa tworzona przez algorytm leży poniżej linii między dwoma punktami. Próbowałem żonglować liczbami, ale wciąż nie potrafię wymyślić sposobu na odwrócenie tej krzywej na drugą stronę linii. Zgaduję, że gdyby funkcja została zmieniona na jakąś formę logarytmu zamiast wykładnika, zrobiłaby dokładnie to, czego potrzebowałam. Czy to jest poprawne? Jeśli tak, czy ktoś może wyjaśnić, jak to osiągnąć?
Możesz wspomnieć tutoriale, ja czy linki haz? – akuhn
zgodzili się, bez większego tła trudno jest zorientować się, jaki jest faktyczny problem. – wds