我需要对2+个因子进行加权排序,按"相关性"排序。然而,这些因素并不是完全孤立的,因为我希望其中一个或多个因素能影响其他因素的"紧迫性"(权重)。
示例:投稿内容(文章)可以进行上/下投票,因此有评级;他们有一个发布日期,他们还被标记了类别。用户可以撰写文章并进行投票,也可以自己进行排名(专家等)。可能类似于StackOverflow,对吧?
我想为每个用户提供一个按标签分组但按"相关性"排序的文章列表,其中相关性是根据文章的评级和年龄计算的,可能受作者排名的影响。例如,几年前写的一篇排名靠前的文章可能不一定像昨天写的排名中等的文章那么重要。也许如果一篇文章是由专家写的,它会被视为比"乔·施莫"写的更相关。
另一个很好的例子是为酒店分配一个由价格、评级和景点组成的"元评分"。
我的问题是,多因素排序的最佳算法是什么?这可能是这个问题的重复,但我对任何数量的因素的通用算法感兴趣(更合理的预期是2-4个因素),最好是一个"全自动"函数,我不必调整或需要用户输入,我也不能解析线性代数和特征向量的古怪。
到目前为止我发现的可能性:
注意:S
是"排序分数"
-
"线性加权"-使用如下函数:
S = (w1 * F1) + (w2 * F2) + (w3 * F3)
,其中wx
是任意分配的权重,Fx
是因子的值。您还需要规范化F
(即Fx_n = Fx / Fmax
)。我认为这就是Lucene搜索的工作方式 -
"Base-N weighted"更像是分组而不是加权,它只是一种线性加权,其中权重是Base-10的倍数(类似于CSS选择器特异性的原理),因此更重要的因素显著更高:
S = 1000 * F1 + 100 * F2 + 10 * F3 ...
-
估计真值(ETV)-这显然是谷歌分析公司在其报告中引入的,其中一个因素的值影响(权重)另一个因素-结果是对更"具有统计意义"的值进行排序。链接很好地解释了这一点,所以这里只有等式:
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=1/(sqrt((rank-rank_sideal)^2+(age-age_ideal)^2+…+(xn-xn_idal)^2))。
这将平等对待所有标准,所以请记住这一点。
@gankoji简短指出的解决方案是TOPSIS方法的简化。
在TOPSIS中,折衷解可以看作是选择离理想解欧几里得距离最短、离负理想解欧几里德距离最远的解。
这类问题属于多准则决策。
Python包scikit-criteria和mcdm提供了最流行方法的实现。包文档链接到各自的算法论文。
考虑权重的链接。例如,您有3个因素:X、Y和Z。您可以将ETVyz计算为每条记录的W = (Z/Zmax * Y) + (1 - Z/Zmax) * Yavg
,然后将ETVxw运算为S = (W/Wmax * X) + (1 - W/Wmax) * Xavg
。你可以把更多相似的因素联系起来。