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

36
我需要在两个或更多因素上提供加权排序,按“相关性”排序。但是,这些因素并不完全独立,因为我希望其中一个或多个因素会影响其他因素的“紧急程度”(权重)。
例如:贡献内容(文章)可以被投票赞成或反对,因此具有评分;它们有发布日期,并且也被标记为类别。用户编写文章并可以投票,可能有一定的排名(专家等)。大概与StackOverflow类似,对吗?
我想为每个用户提供按标签分组但按“相关性”排序的文章列表,其中“相关性”是基于文章的评分和年龄计算的,可能受到作者排名的影响。即,一篇几年前写的高排名文章可能不像昨天写的中等排名文章那么相关。而且,如果一篇文章是由专家撰写的,那么它将被视为比由“Joe Schmoe”撰写的文章更相关。
另一个很好的例子是将酒店分配一个“元评分”,包括价格、评分和景点
我的问题是,多因素排序的最佳算法是什么?这可能是那个问题的重复,但我对适用于任意数量因素(2-4个因素更为合理)的通用算法感兴趣,最好是“全自动”函数,不需要调整或用户输入,并且我无法解析线性代数和特征向量方程。
我找到的可能性有:
注意:S是“排序分数”。
  1. "线性加权" - 使用类似于这样的函数:S = (w1 * F1) + (w2 * F2) + (w3 * F3),其中wx是任意指定的权重,Fx是因素的值。您还需要归一化F(即Fx_n = Fx / Fmax)。我认为这有点像Lucene搜索的工作方式。
  2. "基数加权" - 更像是分组而不是加权,它只是一个线性加权,其中权重是10的递增倍数(类似于CSS选择器特异性),以便更重要的因素显着更高:S = 1000 * F1 + 100 * F2 + 10 * F3 ...
  3. 估计真实值(ETV) - 这显然是Google Analytics在其报告中引入的内容,其中一个因素的价值影响(权重)另一个因素 - 结果是根据更多“统计显著性”值进行排序。链接解释得很好,因此这里只是方程式:S = (F2 / F2_max * F1) + ((1 - (F2 / F2_max)) * F1_avg),其中F1是“更重要”的因素(文章中的“跳出率”),F2是“显著性修改”的因素(文章中的“访问次数”)。
  4. 贝叶斯估计 - 看起来与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实现,这基本上就是我最终需要编写的东西。

为了明确起见,在您的示例中,您会更改哪些因素的权重?其中一个因素比其他因素更重要,还是您只是想避免手动建立权重? - gankoji
1
@gankoji,老实说我已经不记得了(两年前的事情);我可能只是想避免手动建立权重,因为每当我们改变重要性时,就必须部署代码,而且一开始选择正确的权重也很重要。 - drzaus
4
评论后我才注意到这是两年前的帖子。我原本想建议你在优化术语中使用所谓的“折衷解决方案”。基本上,你选择解决方案空间中的绝对理想“点”(最高排名帖子,最新日期等),然后从该点到欧几里得距离的倒数即为你的分数。也就是说,S = 1 /(sqrt((rank-rank_ideal)^ 2 +(age-age_ideal)^ 2 ...(xn-xn_ideal)^ 2); 无论如何,希望你已经搞定了。 - gankoji
2
@gankoji 不用担心;你应该把那个建议发布为答案,这样更容易被找到。 - drzaus
对于线性加权算法,权重必须加起来等于1吗?如果我有类似 S = (f1 * .80) + (f2 * .80) 这样的东西会发生什么? - 425nesp
@425nesp 网络炸了,你可能会像SO的愚人节重新设计一样(评论中使用Comic Sans字体!!!)...不过更有可能的是它只是任意地增加你的最终值,如果仅用于排序,则可能并不重要。 - drzaus
3个回答

8

正如评论中提到的,对于那些更关心不需要设置权重而不是让一个标准比其他标准更加重要的人,我建议采用所谓的“妥协解决方案”。

基本上,您将每个标准视为坐标(当然,在归一化之后)。根据您的判断,选择绝对最佳点,例如在本例中,最高排名的作者,最新文章等。一旦您选择了最佳解决方案,则根据其与最优解之间的距离对每个其他“解决方案”进行评级。一个示例公式可以是每篇文章得分的欧几里德距离的倒数:S = 1 /(sqrt((rank-rank_ideal)^ 2 +(age-age_ideal)^ 2 + ... +(xn-xn_ideal)^ 2))。

这将所有标准视为相等,所以请记住这一点。


如果它命中完全相同的匹配,这不会导致除以零吗? - Gokigooooks
是的,如果您有一个非唯一的集合,则可能会出现除以零的情况。在代码中处理这个问题很简单(先计算除数,检查“小数”,如果必要则出错/抛出异常)。话虽如此,在这种用例中,非唯一性a)没有被提及为约束条件,b)似乎不太可能发生,考虑到数据集的类型和维数。 - gankoji
非常抱歉打扰您,先生,但我有另一个问题!如果每个标准的值之间存在很大差异,例如标准#1范围为1-30,而标准#2范围为1000+,那么权重会被标准#2严重拉动,该如何进行归一化处理呢? - Gokigooooks
将每个标准/测量值除以该标准的最大可能值。这将使每个标准归一化为1。 - gankoji

1

如@gankoji所指出的那样,该解决方案是TOPSIS方法的简化。

在TOPSIS中,妥协解可以被视为选择距离理想解最短且距离负理想解最远的解。

这类问题属于MCDM - 多准则决策制定术语。

Python软件包scikit-criteriamcdm提供了大多数流行方法的实现。该软件包文档链接到相应的算法论文。


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

2
但是对于函数 ETVxw,您不能对 W(即 WWmax 的比较)进行归一化处理,因为它已经是内部归一化因子的结果。 - drzaus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接