34

我需要提供 2+ 个因素的加权排序,按“相关性”排序。但是,这些因素并不是完全孤立的,因为我希望一个或多个因素影响其他因素的“紧迫性”(权重)。

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

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

另一个很好的例子是为酒店分配一个由价格、评级和景点组成的“元分数”

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


到目前为止我发现的可能性:

注:S是“排序分数”

  1. “线性加权” - 使用类似的函数:,其中是任意分配的权重,并且是因子的值。您还想规范化(即)。我认为这有点像Lucene 搜索的工作原理S = (w1 * F1) + (w2 * F2) + (w3 * F3)wxFxFFx_n = Fx / Fmax
  2. “Base-N weighted” - 更像是分组而不是加权,它只是一个线性加权,其中权重以 base-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 帖子;equation: ,其中与#3 相同,并且是“显着性”因子的最小阈值限制(即不应考虑小于 X 的任何值)。S = (F2 / (F2+F2_lim)) * F1 + (F2_lim / (F2+F2_lim)) × F1_avgFxF2_lim

选项 #3 或 #4 看起来很有希望,因为您不必像在 #1 和 #2 中那样选择任意加权方案,但问题是如何针对两个以上的因素进行此操作?

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

4

3 回答 3

8

正如评论中提到的,我会向任何有类似问题的人建议所谓的“妥协解决方案”,他们更关心不必设置权重,而不是让一个标准比其他标准更重要。

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

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

于 2014-12-30T17:44:58.370 回答
0

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

于 2012-03-20T18:42:37.090 回答
0

@gankoji 很快指出的解决方案是 TOPSIS 方法的简化。

在TOPSIS中,折衷解可以看作是选择离理想解欧几里得距离最短、离负理想解欧几里得距离最远的解。

这类问题属于术语 MCDM - 多标准决策。

Python 包scikit-criteriamcdm提供了最流行的方法的实现。包文档链接到相应的算法论文。

于 2020-09-01T13:33:05.453 回答