«Горячий» алгоритм всегда возвращает 0 - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь повторить горячий алгоритм reddit для сортировки моих сообщений.Вот моя функция:

def hot(self):
    s = self.upvotes
    baseScore = log(max(s, 1))
    now = datetime.now()

    timeDiff = (now - self.post.date).days
    if (timeDiff > 1):
        x = timeDiff - 1
        baseScore = baseScore * exp(-8 * x * x)
    print('Final:', baseScore) #always prints 0
    return baseScore

в основном, exp(-8 * x * x) всегда делает число 0. Поэтому мне интересно, как я должен заставить этот алгоритм работать.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Короче говоря : вы создали экстремальную ледяную бурю , в которой сообщения просто замерзают через 48 часов.

Нет ничего "неправильного" в вашемалгоритм, но вы позволяете счетам «остывать» слишком быстро.

Представьте, что посту два дня (тогда предложение if) срабатывает.В этом случае x = 1, и в этом случае exp(..) приведет к:

>>> exp(-8)
0.00033546262790251185

Это верно.0.00033... или 0.03%.Таким образом, это означает, что если ваш пост набрал 10 000 голосов, базовый балл составляет 9.21, и после этого умножения только:

>>> log(10000) * exp(-8)
0.003089724985059729

Да, схема охлаждения должна гарантировать, что в конечном итоге все остынет, но непоместив сообщения в ледяную бурю.

Вы можете, например, удалить фактор 8*.Это означает, что на второй день мы умножаем счет на ~ 0.37 или 36,79%.Вы можете немного поэкспериментировать с фактором или некоторыми другими частями схемы охлаждения и, таким образом, позволить постам хорошо остыть.

Другой аспект заключается в том, что время довольно опровергнуто : вы считаетеколичество дней.Но это означает, что до тех пор, пока второй день не полностью закончен, значение равно 1. Но с момента, когда второй день закончился, " температура " поста делает гигантское падение.Вы можете использовать количество секунд и вместо этого делить на 86'400:

timeDiff = (now - self.post.date).total_seconds() / 86400  # continuum
0 голосов
/ 01 июня 2018

Проблема возникает в этой строке.

baseScore = baseScore * exp(-8 * x * x)

Поскольку x принимает значения только в днях, оно всегда будет целым числом.Теперь, если x == 0, тогда вы получите exp(-8 * x * x) == 1, но как только x == 1, тогда оно будет очень близко к 0.Итог: ваша функция не является непрерывной .

То, что вы хотите, это постепенно уменьшить жаркость сообщения.Это может быть достигнуто, если x принимать значения от 0 до 1.Одним из способов было бы считать разницу времени в минутах и, таким образом, учитывать дробные дни.

timeDiff = (now - self.post.date).minutes / 1440

Тогда сообщения будут оставаться горячими в течение нескольких часов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...