如何使用多因子加权排序提供最相关的结果

drz*_*aus 29 sorting algorithm bayesian relevance weighted-average

我需要对2+个因子进行加权排序,按"相关性"排序.然而,这些因素并非完全孤立,因为我希望一个或多个因素影响其他因素的"紧迫性"(权重).

示例:贡献的内容(文章)可以上/下投票,因此具有评级; 他们有一个发布日期,他们也被标记为类别.用户撰写文章并可以投票,并且可能有也可能没有自己的某种排名(专家等).可能与StackOverflow类似,对吧?

我想为每个用户提供按标签分组但按"相关性"排序的文章列表,其中相关性是根据文章的评级和年龄计算的,并且可能受作者排名的影响.IE是几年前写的一篇排名很高的文章可能不一定像昨天写的中等文章一样重要.也许如果一篇文章是由专家撰写的,那么它将被视为比"Joe Schmoe"所写的文章更具相关性.

另一个很好的例子是为酒店分配一个由价格,评级和景点组成的"元评分".

我的问题是,多因素排序的最佳算法是什么?这可能是该问题的重复,但我对任意数量因素的通用算法感兴趣(更合理的期望是2 - 4个因素),最好是我不需要的"全自动"功能调整或要求用户输入,我无法解析线性代数和特征向量古怪.


到目前为止我找到的可能性:

注意:S是"排序分数"

  1. "线性加权" - 使用如下函数:,其中任意指定权重,并且是因子的值.你也想要标准化(即).我认为这有点像Lucene搜索是如何工作的.S = (w1 * F1) + (w2 * F2) + (w3 * F3)wxFxFFx_n = Fx / Fmax
  2. "Base-N加权" - 更像是分组而不是加权,它只是一个线性加权,其中权重增加了基数10的倍数(与CSS选择器特异性相似的原则),因此更重要的因素显着更高: .S = 1000 * F1 + 100 * F2 + 10 * F3 ...
  3. 估计真实价值(ETV) - 这显然是谷歌分析在他们的报告中引入的,其中一个因素的价值影响(权重)另一个因素 - 后果是对更"统计上显着"的价值进行排序.链接解释得非常好,所以这里只是等式: ,"更重要"因素(文章中的"跳出率")在哪里,是"重要性修改"因素(文章中的"访问").S = (F2 / F2_max * F1) + ((1 - (F2 / F2_max)) * F1_avg)F1F2
  4. 贝叶斯估计 - 看起来与ETV非常相似,这就是IMDb计算其评级的方式.有关说明,请参阅此StackOverflow帖子 ; 等式:,其中与#3相同,并且是"重要性"因子的最小阈值限制(即不应考虑任何小于X的值).S = (F2 / (F2+F2_lim)) * F1 + (F2_lim / (F2+F2_lim)) × F1_avgFxF2_lim

选项#3或#4看起来很有前途,因为你不必像在#1和#2中那样选择任意加权方案,但问题是你如何做到这两个以上的因素呢?

我还遇到了一个双因素加权算法SQL实现,这基本上是我最终需要编写的.

gan*_*oji 6

正如评论中所提到的,我会向有类似问题的人建议所谓的"折衷解决方案",他们更关心的是不必设置权重而不是使一个标准比其他标准更重要.

基本上,您将每个标准视为一个坐标(当然,在标准化之后).根据您的判断,您可以选择绝对最佳点,例如,在这种情况下,最高级别的作者,最新的文章等.一旦您选择了最佳解决方案,彼此的"解决方案"将根据其与该最佳点的距离进行评级.样本公式将是每篇文章得分的欧几里德距离的倒数:S = 1 /(sqrt((rank-rank_ideal)^ 2 +(age-age_ideal)^ 2 + ... +(xn-xn_ideal)^ 2 )).

这会将所有标准视为平等,因此请记住这一点.


wel*_*her 0

考虑权重的链接。例如,您有 3 个因素:XYZ。您可以计算每条记录的ETVyzW = (Z/Zmax * Y) + (1 - Z/Zmax) * Yavg,然后计算ETVxwS = (W/Wmax * X) + (1 - W/Wmax) * Xavg。您可以类似地链接更多因素。

  • 但是您无法在 **ETVxw** 的函数中标准化“W”(“W”与“Wmax”),因为它已经是内部标准化因素的结果 (2认同)