Мне нужно обеспечить взвешенную сортировку по 2+ факторам, упорядоченным по "релевантности". Однако факторы не полностью изолированы, поскольку я хочу, чтобы один или несколько факторов влияли на "срочность" (вес) других.
Пример: предоставленный контент (статьи) может быть поднят/проголосован и, следовательно, иметь рейтинг; у них есть дата публикации, и они также помечены категориями. Пользователи пишут статьи и могут голосовать, а также могут или не могут иметь своего рода ранжирование (эксперт и т.д.). Вероятно, похоже на StackOverflow, правильно?
Я хочу предоставить каждому пользователю список статей, сгруппированных по тегу, но отсортированных по "релевантности", где релевантность вычисляется на основе рейтинга и возраста статьи и, возможно, зависит от ранжирования автора. И.Е. статья с высоким рейтингом, которая была написана несколько лет назад, необязательно может быть столь же актуальной, как и ранжированная в среднесрочной статье статья, написанная вчера. И, может быть, если бы статья была написана экспертом, ее рассматривали бы как более релевантную, чем написанную Джо Джо Шмоем.
Другим хорошим примером может быть присвоение гостиниц "мета-счетом" , состоящее из цены, рейтинга и достопримечательностей.
Мой вопрос: какой лучший алгоритм для множественной сортировки факторов? Это может быть дубликат этот вопрос, но меня интересует общий алгоритм для любого числа факторов (более разумное ожидание - это 2 - 4 фактора), предпочтительно "полностью автоматическая" функция, которую мне не нужно настраивать или требовать ввода пользователем, и я не могу разобрать линейную алгебру и безупречность собственных векторов.
Возможности, которые я нашел до сих пор:
Примечание: S
- это "оценка сортировки"
- "Линейно взвешенный" - используйте функцию типа:
S = (w1 * F1) + (w2 * F2) + (w3 * F3)
, гдеwx
- произвольно назначенные веса, аFx
- значения факторов. Вы также хотите нормализоватьF
(т.е.Fx_n = Fx / Fmax
). Я думаю, что это как-то как Работа Lucene работает. - "Base-N weighted" - больше похоже на группировку, чем взвешивание, это просто линейное взвешивание, когда весы растут кратно базовым 10 (аналогичный принцип для специфичность селектора 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 рассчитывает их рейтинг. См. qaru.site/info/99970/...; уравнение:
S = (F2 / (F2+F2_lim)) * F1 + (F2_lim / (F2+F2_lim)) × F1_avg
, гдеFx
совпадают С# 3, аF2_lim
- минимальный пороговый предел для фактора значимости (т.е. любое значение, меньшее X, не следует рассматривать).
Варианты # 3 или # 4 выглядят действительно многообещающими, так как вам действительно не нужно выбирать произвольную схему взвешивания, как в # 1 и # 2, но проблема в том, как вы это делаете для более чем двух факторов
Я также натолкнулся на SQL-реализация для двухфакторного весового алгоритма, в основном это то, что мне нужно написать в конечном счете.