Мне нужно предоставить взвешенную сортировку по 2+ факторам, упорядоченную по «релевантности». Однако факторы не полностью изолированы, поскольку я хочу, чтобы один или несколько факторов влияли на «срочность» (вес) других.
Пример: за добавленный контент (статьи) можно проголосовать за или против и, таким образом, получить рейтинг; у них есть дата публикации, и они также помечены категориями. Пользователи пишут статьи и могут голосовать, а также могут иметь или не иметь какой-либо рейтинг (эксперт и т. д.). Вероятно, похоже на StackOverflow, верно?
Я хочу предоставить каждому пользователю список статей, сгруппированных по тегам, но отсортированных по «релевантности», где релевантность рассчитывается на основе рейтинга и возраста статьи и, возможно, зависит от рейтинга автор. т.е. статья с высоким рейтингом, написанная несколько лет назад, не обязательно будет столь же актуальной, как статья со средним рейтингом, написанная вчера. И, возможно, если бы статья была написана экспертом, она была бы признана более актуальной, чем статья, написанная «Джо Шмо».
Другим хорошим примером может быть присваивание отелям "мета-оценки", состоящей из цены, рейтинга и достопримечательностей.
Мой вопрос: каков наилучший алгоритм для сортировки по нескольким факторам? Это может быть дубликат этот вопрос, но меня интересует общий алгоритм для любого количества факторов (более разумное ожидание - 2-4 фактора), предпочтительно "полностью автоматическая функция, которую мне не нужно настраивать или требовать ввода пользователем, и я не могу анализировать линейную алгебру и дурацкие собственные векторы.
Возможности, которые я нашел до сих пор:
Примечание. S
— это "оценка сортировки"
- "Линейно взвешенный" – используйте функцию, например:
S = (w1 * F1) + (w2 * F2) + (w3 * F3)
, гдеwx
– произвольно присвоенные веса, а _4 – значения факторов. Вы также хотели бы нормализоватьF
(т.е.Fx_n = Fx / Fmax
). Я думаю, что это как Поиск Lucene работает. - "Взвешенные по основанию N" – это больше похоже на группировку, чем на взвешивание, это просто линейное взвешивание, при котором веса увеличиваются кратно десятичной системе (принцип аналогичен специфичность селектора CSS), так что более важно факторы значительно выше:
S = 1000 * F1 + 100 * F2 + 10 * F3 ...
. - Оценочная истинная ценность (ETV) — это, очевидно, то, что Google Analytics представила в своих отчетах, где значение одного фактора влияет (веса) на другой фактор, следствием чего является сортировка по более "статистически значимым" ценности. Ссылка объясняет это довольно хорошо, так что вот просто уравнение:
S = (F2 / F2_max * F1) + ((1 - (F2 / F2_max)) * F1_avg)
, гдеF1
— «более важный» фактор («показатель отказов» в статье), аF2
— фактор «изменяющий значимость» («посещения» в статье). ). - Байесовская оценка — очень похоже на ETV, так IMDb рассчитывает свой рейтинг. См. это сообщение StackOverflow для объяснения; уравнение:
S = (F2 / (F2+F2_lim)) * F1 + (F2_lim / (F2+F2_lim)) × F1_avg
, гдеFx
такие же, как #3, аF2_lim
— это минимальный пороговый предел для фактора «значительности» (т. е. любое значение меньше X не должно учитываться).
Варианты № 3 или № 4 выглядят многообещающе, поскольку вам не нужно выбирать произвольную схему взвешивания, как в вариантах № 1 и № 2, но проблема заключается в том, как сделать это для более чем двух факторов?
Я также столкнулся с SQL-реализацией для двухфакторной алгоритм взвешивания, который мне в конечном итоге и нужно будет написать.
S = (f1 * .80) + (f2 * .80)
? - person 425nesp   schedule 24.03.2019