Каков корректный algorthm для logarthmic кривой распределения между двумя точками?

Что делает indexer --rotate, это посылает сигнал HUP запущенному searchd (он понимает, что из идентификатора процесса, указанного в файле, указанном в pid_file в конфигурации, вы даете его в --config или -c). Если поиск не запущен, сигнал не будет отправлен. Если выполняется поиск, но вы пытаетесь проиндексировать без --rotate, он выдаст предупреждение.

Идея такова:

  • no searchd: вы просто создаете новый индекс. Все просто.
  • работает searchd, и вы индексируете с помощью --rotate: когда ваш индекс построен, имена его файлов получают суффикс .new., и индексатор посылает сигнал на searchd. Searchd принимает сигнал и заменяет существующие индексные файлы новыми (с суффиксом .new.), также выполняет некоторые другие внутренние операции и в целом это называется поворотом индекса.

Другой способ поворота - создать свой индекс на новом месте и затем вызвать RELOAD INDEX idx FROM

5
задан dburke 28 April 2009 в 19:45
поделиться

5 ответов

Благодаря помощи antti.huima я переосмыслил то, что пытался сделать.

Взяв его метод решения задачи, я хочу уравнение, в котором логарифм mincount равен линейному уравнению между две точки.

weight(MIN) = ln(MIN-(MIN-1)) + min_weight
min_weight = ln(1) + min_weight

Хотя это дает мне хорошую отправную точку, мне нужно, чтобы она прошла через точку (MAX, max_weight). Потребуется константа:

weight(x) = ln(x-(MIN-1))/K + min_weight

Решив для K, мы получим:

K = ln(MAX-(MIN-1))/(max_weight - min_weight)

Итак, чтобы поместить все это обратно в некоторый код Python:

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)
    constant = log(maxcount - (mincount - 1)) / (maxsize - minsize)
    for c in count:
        size = log(c - (mincount - 1)) / constant + minsize
        countdist.append({'count': c, 'size': round(size, 3)})
    return countdist
2
ответ дан 15 December 2019 в 01:12
поделиться

Давайте начнем с Вашего отображения от зарегистрированного количества до размера. Это - линейное отображение, Вы упомянули:

   size
    |
max |_____
    |   /
    |  /|
    | / |
min |/  |
    |   |
   /|   |
0 /_|___|____
    0   a

где минуты и макс. являются минутой и макс. размерами и a=log (maxcount)-b. Строка имеет y=mx+c где x=log (количество)-b

От графика мы видим, что градиент, m, (maxsize-minsize)/a.

Нам нужен x=0 в y=minsize, так журнал (mincount)-b=0-> b=log (mincount)

Это оставляет нас со следующим Python:

mincount = min(count)
maxcount = max(count)
xoffset = log(mincount)
gradient = (maxsize-minsize)/(log(maxcount)-log(mincount))
for c in count:
    x = log(c)-xoffset
    size = gradient * x + minsize

Если Вы хотите удостовериться, что минимальное количество всегда - по крайней мере 1, замените первую строку:

mincount = min(count+[1])

который добавляет 1 к списку количества прежде, чем сделать минуту. То же идет для проверки, что maxcount всегда - по крайней мере 1. Таким образом Ваш заключительный код на вышеупомянутое:

from math import log
count = [1, 3, 5, 4, 7, 5, 10, 6]
def logdist(count, maxsize=1.75, minsize=.75):
    countdist = []
    mincount = min(count+[1])
    maxcount = max(count+[1])
    xoffset = log(mincount)
    gradient = (maxsize-minsize)/(log(maxcount)-log(mincount))
    for c in count:
        x = log(c)-xoffset
        size = gradient * x + minsize
        countdist.append({'count': c, 'size': round(size, 3)})
    return countdist
1
ответ дан 15 December 2019 в 01:12
поделиться

то, что Вы имеете, - то, что у Вас есть теги, количества которых от МИН до МАКСА; пороговая проблема может быть проигнорирована здесь, потому что она составляет установку каждого количества ниже порога к пороговому значению и взятию минимума и максимума только впоследствии.

Вы хотите отобразить количества тега на "веса", но "логарифмическим способом", который в основном означает (насколько я понимаю) следующее. Во-первых, теги с количеством МАКС получают max_weight вес (в Вашем примере, 1.75):

weight(MAX) = max_weight

Во-вторых, теги с количеством МИН получают min_weight вес (в Вашем примере, 0.75):

weight(MIN) = min_weight

Наконец, это содержит это, когда Ваши уменьшения количества 1, вес умножается с постоянным K <1, который указывает на крутизну кривой:

weight(x) = weight(x + 1) * K

Решая это, мы добираемся:

weight(x) = weight_max * (K ^ (MAX - x))

Обратите внимание, что с x = МАКС, экспонента является нулем, и множимое справа становится 1.

Теперь у нас есть дополнительное требование, чтобы вес (МИН) = min_weight, и мы могли решить:

weight_min = weight_max * (K ^ (MAX - MIN))

от которого мы добираемся

K ^ (MAX - MIN) = weight_min / weight_max

и взятие логарифма с обеих сторон

(MAX - MIN) ln K = ln weight_min - ln weight_max

т.е.

ln K = (ln weight_min - ln weight_max) / (MAX - MIN)

Правая сторона отрицательна, как желаемый, потому что K <1. Затем

K = exp((ln weight_min - ln weight_max) / (MAX - MIN))

Таким образом, теперь у Вас есть формула для вычисления K. После этого Вы просто запрашиваете любое количество x между МИН и МАКСОМ:

weight(x) = max_weight * (K ^ (MAX - x))

И Вы сделаны.

1
ответ дан 15 December 2019 в 01:12
поделиться

На логарифмической шкале Вы просто выводите журнал на печать чисел линейно (другими словами, притворяетесь, что выводитесь на печать линейно, но берете журнал чисел, которые будут напечатаны сначала).

Нулевая проблема не может быть решена аналитически - необходимо выбрать минимальный порядок величины для масштаба, и независимо от того, что Вы никогда не можете достигать нуля. Если Вы хотите вывести что-то на печать в нуле, Ваш выбор состоит в том, чтобы произвольно дать ему минимальное распоряжение величины масштаба, или опустить его.

0
ответ дан 15 December 2019 в 01:12
поделиться

У меня нет точного ответа, но я думаю, что Вы хотите искать Линеаризующие Экспоненциальные Данные. Запустите, вычисляют уравнение строки, проходящей через точки, и берут журнал обеих сторон того уравнения.

0
ответ дан 15 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: