Мне нужно обеспечить взвешенную сортировку по 2+ факторам, упорядоченным по «актуальность». Однако факторы не изолированы полностью, я хочу, чтобы один или несколько факторов влияли на «срочность» (вес) других.
Пример: добавленный контент ( статей ) можно проголосовать за / против и, таким образом, получить рейтинг; у них есть дата публикации, и они также помечены категориями. Пользователи пишут статьи и могут голосовать, а также могут иметь или не иметь какой-то рейтинг (эксперт и т. Д.).Наверное, похоже на StackOverflow, не так ли?
Я хочу предоставить каждому пользователю список статей, сгруппированных по тегам, но отсортированных по «релевантности», где релевантность рассчитывается на основе рейтинга и возраста статьи. , и, возможно, зависит от рейтинга автора. I.E. статья с высоким рейтингом, написанная несколько лет назад, не обязательно может быть такой же актуальной, как статья со средним рейтингом, написанная вчера. И, возможно, если бы статья была написана экспертом, она была бы более актуальной, чем статья, написанная «Джо Шмо».
Другим хорошим примером может быть присвоение гостиницам «мета-оценки», состоящей из цены, рейтинга и достопримечательностей .
У меня вопрос: какой алгоритм для многофакторной сортировки лучше? Это может быть дубликатом этого вопроса , но меня интересует общий алгоритм для любого количества факторов (более разумное ожидание - 2–4 фактора), предпочтительно «полностью автоматическая» функция, которая Мне не нужно настраивать или требовать ввода данных пользователем, и я не могу анализировать линейную алгебру и странность собственных векторов.
Возможности, которые я обнаружил на данный момент:
Примечание: S
- это «оценка сортировки»
S = (w 1 * F 1 ) + (w 2 * F 2 ) + (w 3 * F 3 )
, где w x
- произвольно присвоенные веса, а F x
- значения факторов. Вы также можете нормализовать F
(т.е. F x_n = F x / F макс
). Я думаю, что так работает поиск Lucene . S = 1000 * F 1 + 100 * F 2 + 10 * F 3 ...
]. S = (F 2 / F 2_max * F 1 ) + ((1 - (F 2 / F 2_max )) * F 1_avg )
, где F 1
- это " более важный «фактор» («показатель отказов» в статье), а F 2
- «модифицирующий значимость» фактор («посещения» в статье). S = (F 2 / (F 2 + F 2_lim )) * F 1 + (F 2_lim / (F 2 + F 2_lim )) × F 1_avg
, где F x
являются то же, что и № 3, и F 2_lim
- это минимальный пороговый предел для фактора «значимости» (т. е. любое значение меньше X не должно рассматриваться).Варианты №3 или №4 выглядят действительно многообещающими, поскольку вам действительно не нужно выбирать произвольную схему взвешивания, как в вариантах №1 и №2, но проблема в том, как это сделать для более чем двух факторов. ?
Я также наткнулся на реализацию SQL для двухфакторного алгоритма взвешивания , который мне в конечном итоге нужно будет написать.
Рассмотрим цепочку весов. Например. у вас есть 3 фактора: X , Y и Z . Вы можете вычислить ETVyz как W = (Z/Zmax * Y) + (1 - Z/Zmax) * Yavg
для каждой записи, а затем вычислить ETVxw как S = (W/Wmax * X) + (1 - W/Wmax) * Xavg
. Вы можете объединить больше факторов, аналогично.