如何基于多个局部排名列表构建最优全局排名列表?
问题
现有一组待评审对象,由评委团队评审,规则如下:
- 每位评委仅评审对象的一个子集,并将所看对象从优到劣排名
- 每个对象至少被两位评委评审
- 评审存在噪声(评委可能意见不一致)
- 没有评委看过全部对象
请问有没有合适的算法,能基于所有评委提交的局部排名,生成「最优」的全局排名列表?
Python示例(伪代码)
# 假设有6个待评审对象,需要完成排名 # 4位评委,每位评审3个对象,每个对象恰好被两位评委评审 items = ['a', 'b', 'c', 'd', 'e', 'f'] j1_rank = ['a', 'c', 'e'] # 排名从低到高(左差右优) j2_rank = ['b', 'd', 'f'] j3_rank = ['a', 'b', 'c'] j4_rank = ['d', 'e', 'f'] # 目标:合并j1-j4的局部排名,生成全局排名列表 expected_ranked_list = ['a', 'b', 'c', 'd', 'e', 'f']
我了解排名聚合算法,但线上资料大多偏技术化、数学化或满是术语的科研文献,且多聚焦于排序投票场景(比如政治候选人选举),和我的需求不匹配。
补充说明:经@JoshGordon和@SurajShourie指出,['a', 'b', 'd', 'c', 'e', 'f']也是可接受的预期结果。
解决方案
当然有适配这类场景的算法,下面推荐两种易理解、易实现的实用思路,不需要复杂的数学推导:
1. 局部位置加权计分法
这是最直观的方案,适合快速落地:
- 步骤:
- 针对每个评委的局部排名,按排名方向给对象赋值:比如示例里是「从低到高」(左差右优),局部排名有m个对象时,排在第i位(从0开始计数)的对象,局部得分设为
i+1(越靠右的对象得分越高,代表越优);如果是从优到左的排名,就反过来赋值。 - 把每个对象在所有评审过它的评委处的局部得分相加,得到全局总分。
- 按全局总分从低到高排序,就得到示例要求的「从低到高」全局排名;如果要从优到劣,就按总分从高到低排序。
- 针对每个评委的局部排名,按排名方向给对象赋值:比如示例里是「从低到高」(左差右优),局部排名有m个对象时,排在第i位(从0开始计数)的对象,局部得分设为
- 示例计算:
按规则给每个局部排名的对象赋值:- j1_rank:a→1,c→2,e→3
- j2_rank:b→1,d→2,f→3
- j3_rank:a→1,b→2,c→3
- j4_rank:d→1,e→2,f→3
统计每个对象的总分: - a:1+1=2;b:1+2=3;c:2+3=5;d:2+1=3;e:3+2=5;f:3+3=6
按总分从低到高排序:a(2) < b(3)=d(3) < c(5)=e(5) < f(6)
因为b和d、c和e总分相同,且没有评委同时评审过这两组对象,所以它们的顺序可以任意,这就解释了为什么['a', 'b', 'd', 'c', 'e', 'f']也是可接受结果。
2. 两两比较计分法
如果想更精准处理评委的相对偏好,可以用这种方法:
- 步骤:
- 遍历所有评委的局部排名,对每个排名里的任意两个对象,若对象Y排在X的右边(示例中代表Y比X优),就给Y记1次「胜场」。
- 统计每个对象的总胜场数,胜场越多代表越优。
- 按胜场数从少到多排序,得到「从低到高」的全局排名;反之则是从优到劣。
- 示例计算:
从各评委的排名中提取胜负关系:- j1_rank:c胜a、e胜a、e胜c
- j2_rank:d胜b、f胜b、f胜d
- j3_rank:b胜a、c胜a、c胜b
- j4_rank:e胜d、f胜d、f胜e
统计总胜场: - a:0;b:1;c:3;d:1;e:3;f:4
按胜场从少到多排序:a(0) < b(1)=d(1) < c(3)=e(3) < f(4)
结果和加权计分法一致,同样支持总分相同时的任意顺序。
噪声处理小技巧
如果评委意见分歧大,可以通过以下方式优化:
- 去掉极端值:对每个对象的局部得分,去掉一个最高分和一个最低分后再计算总分
- 评委加权:给专业度更高的评委的局部得分乘以权重(比如1.5),提升其意见的占比
内容的提问来源于stack exchange,提问作者tomr_stargazer
相关产品推荐
相关产品推荐

