Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
多源局部排名数据下的全局排序算法详解与Python实践_创想鸟

多源局部排名数据下的全局排序算法详解与Python实践

多源局部排名数据下的全局排序算法详解与python实践

本文介绍了一种实用的算法,用于从多位评审员提供的、不完整且可能存在分歧的局部排名列表中,构建一个统一的全局排序列表。该方法通过为每个项目在局部列表中的位置赋予分数,然后聚合所有评审员的分数来确定项目的最终排名,有效解决了传统聚合方法难以处理的复杂场景,并提供了Python实现示例。

在许多实际应用中,我们常常需要对一系列对象进行整体排序,但获取完整且一致的排序列表并非易事。例如,在产品评估、内容审核或竞赛评选中,多位评审员可能只对部分对象进行评判,且每位评审员的排序结果可能存在差异甚至冲突。传统的排名聚合算法有时过于复杂,或不适用于这种局部、非完全重叠的排名场景。本文将详细阐述一种基于位置评分的聚合算法,旨在从这些分散且带有“噪音”的局部排名中,提炼出最具代表性的全局排序。

核心思想:基于位置的评分聚合

本算法的核心思想是为每个项目在每个局部排名列表中的位置赋予一个分数,然后将这些分数进行累加,最终根据累加的总分来确定项目的全局排名。具体来说,一个项目在局部排名中越靠前,其获得的得分就越高。通过这种方式,我们不仅考虑了项目是否被评判,更重要的是考虑了其在评判者心中的相对优劣程度。

这种方法能够有效处理以下挑战:

局部性: 评审员只对部分项目进行评判。不一致性: 不同评审员对同一项目的看法可能不同。噪音: 评判过程可能存在主观性和随机性。非完全重叠: 不同的局部排名列表包含的项目集合可能大相径庭。

算法实现步骤

该算法主要分为三个关键步骤:标准化局部排名为分数、聚合所有项目的分数、以及生成全局排序列表。

立即学习“Python免费学习笔记(深入)”;

步骤一:标准化局部排名为分数

首先,我们需要将每个评审员提供的局部排名列表转换为一个项目-分数对的字典。对于一个给定的局部排名列表,列表中位置越靠前的项目应获得越高的分数。

假设一个局部排名列表 [‘A’, ‘B’, ‘C’],其中 ‘A’ 是最佳,’C’ 是最差。我们可以这样分配分数:

‘A’:len(list) – index(‘A’) = 3 – 0 = 3 分’B’:len(list) – index(‘B’) = 3 – 1 = 2 分’C’:len(list) – index(‘C’) = 3 – 2 = 1 分

这样,列表中第一个项目获得最高分,最后一个项目获得最低分。

def _rank_list_to_scores(rank_list):    """    将局部排名列表转换为基于位置的分数字典。    列表中的第一个元素(最佳)获得最高分,最后一个元素(最差)获得最低分。    Args:        rank_list (list): 一个裁判的局部排名列表。    Returns:        dict: 项目及其对应分数的字典。    """    list_length = len(rank_list)    # 使用map和lambda函数简洁地创建得分字典    # x是列表中的元素,rank_list.index(x)是其索引    return dict(map(lambda x: (x, list_length - rank_list.index(x)), rank_list))# 示例:j1_rank = ['a', 'c', 'e']j1_rank_scores = _rank_list_to_scores(j1_rank)# j1_rank_scores 将是 {'a': 3, 'c': 2, 'e': 1}print(f"裁判1的评分: {j1_rank_scores}")

步骤二:聚合所有项目的分数

接下来,我们需要遍历所有待排名的项目,并累加它们从所有评审员那里获得的分数。由于每个评审员只评判了部分项目,因此在累加时需要处理项目可能未出现在某个评审员列表中的情况。

我们可以使用 collections.defaultdict(int) 来方便地进行分数累加,对于未评判的项目,其默认得分为0。

from collections import defaultdictdef _aggregate_scores(all_items, judge_score_dicts):    """    聚合所有项目的分数。    Args:        all_items (list): 包含所有待排名项目的列表。        judge_score_dicts (list of dict): 包含所有裁判评分字典的列表。    Returns:        defaultdict: 每个项目及其累加总分的字典。    """    aggregated_scores = defaultdict(int)    for item in all_items:        for judge_score_dict in judge_score_dicts:            # 如果项目不在某个裁判的评分中,则其得分为0            aggregated_scores[item] += judge_score_dict.get(item, 0)    return aggregated_scores# 假设已经有了所有裁判的评分字典# j1_rank_scores = {'a': 3, 'c': 2, 'e': 1}# j2_rank_scores = {'b': 3, 'd': 2, 'f': 1}# j3_rank_scores = {'a': 3, 'b': 2, 'c': 1}# j4_rank_scores = {'d': 3, 'e': 2, 'f': 1}# all_judge_scores = [j1_rank_scores, j2_rank_scores, j3_rank_scores, j4_rank_scores]# aggregated_result = _aggregate_scores(['a', 'b', 'c', 'd', 'e', 'f'], all_judge_scores)# aggregated_result 将是 {'a': 6, 'b': 5, 'c': 3, 'd': 5, 'e': 3, 'f': 2}# print(f"聚合后的分数: {aggregated_result}")

步骤三:生成全局排序列表

最后一步是根据累加的总分对所有项目进行降序排序。得分最高的项目将排在全局列表的最前面。

def _generate_global_rank(aggregated_scores):    """    根据聚合分数生成最终的全局排序列表。    Args:        aggregated_scores (defaultdict): 每个项目及其累加总分的字典。    Returns:        list: 重构后的全局排序列表。    """    # 根据累加的得分降序排列项目,得分最高的项目排在前面。    # sorted函数返回一个元组列表,每个元组包含(项目, 总得分)。    # lambda item: item[1] 指定按元组的第二个元素(即得分)进行排序。    final_ranked_items_with_scores = sorted(aggregated_scores.items(), key=lambda item: item[1], reverse=True)    # 提取排序后的项目名称作为最终的全局排名列表    global_ranked_list = [item[0] for item in final_ranked_items_with_scores]    return global_ranked_list# 假设 aggregated_scores = {'a': 6, 'b': 5, 'c': 3, 'd': 5, 'e': 3, 'f': 2}# global_rank = _generate_global_rank(aggregated_scores)# global_rank 将是 ['a', 'b', 'd', 'c', 'e', 'f']# print(f"最终全局排名: {global_rank}")

完整示例代码

以下是结合上述三个步骤的完整 Python 函数和示例用法:

from collections import defaultdictdef reconstruct_global_rank(all_items, partial_ranks_by_judges):    """    从多个局部排名列表重构一个全局排序列表。    Args:        all_items (list): 包含所有待排名项目的列表。        partial_ranks_by_judges (list of lists): 每个子列表代表一个裁判的局部排名。                                                  列表中的顺序表示从最佳到最差。    Returns:        list: 重构后的全局排序列表。    """    # 步骤一:标准化局部排名为分数    judge_score_dicts = []    for rank_list in partial_ranks_by_judges:        list_length = len(rank_list)        score_dict = dict(map(lambda x: (x, list_length - rank_list.index(x)), rank_list))        judge_score_dicts.append(score_dict)    print(f"标准化后的裁判评分字典: {judge_score_dicts}")    # 步骤二:聚合所有项目的分数    aggregated_scores = defaultdict(int)

以上就是多源局部排名数据下的全局排序算法详解与Python实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369185.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
冒泡排序最坏情况下比较次数的计算方法
上一篇 2025年12月14日 09:26:32
从部分排序列表中重建全局排序:一种实用的算法教程
下一篇 2025年12月14日 09:26:41

相关推荐

  • 在平板电脑上使用SublimeText进行开发的体验

    在平板电脑上使用SublimeText进行开发的体验在平板电脑上使用SublimeText进行开发的体验在平板电脑上使用SublimeText进行开发的体验在平板电脑上使用SublimeText进行开发的体验

    平板电脑上无法原生运行sublime text,但可通过远程连接实现使用。具体方法包括:①使用ssh客户端(如termius、blink shell)或vnc/rdp客户端连接远程服务器;②借助外接键盘和触控设备提升输入效率;③结合云端开发环境(如gitpod、codespaces)替代本地ide;…

    2026年10月1日 • 用户投稿
    100
  • 豆包AI如何辅助Android开发?快速构建移动应用界面

    豆包AI如何辅助Android开发?快速构建移动应用界面豆包AI如何辅助Android开发?快速构建移动应用界面豆包AI如何辅助Android开发?快速构建移动应用界面豆包AI如何辅助Android开发?快速构建移动应用界面

    豆包ai在android开发中可作为高效助手,通过多种方式提升开发效率。1. 可快速生成xml布局代码,根据描述输出结构清晰的ui组件,如按钮栏、卡片列表等,并支持material design风格;2. 提供java/kotlin代码片段建议,如页面跳转、适配器编写,并解释关键逻辑;3. 推荐界面…

    2026年10月1日 • 用户投稿
    000
  • 如何让豆包AI处理Python中的字符串操作

    如何让豆包AI处理Python中的字符串操作如何让豆包AI处理Python中的字符串操作如何让豆包AI处理Python中的字符串操作如何让豆包AI处理Python中的字符串操作

    豆包ai不能运行python代码,但能辅助编写和调试字符串操作。你可以描述具体需求,如提取邮箱、替换空格等,它会提供示例代码;可提问字符串方法区别、判断纯数字、格式化方式等常见问题;还可用于检查代码逻辑,如split与正则表达式的使用建议,提升字符串处理效率。 ☞☞☞AI 智能聊天, 问答助手, A…

    2026年10月1日 • 用户投稿
    000
  • 用豆包AI解析Python中的CSV文件数据

    用豆包AI解析Python中的CSV文件数据用豆包AI解析Python中的CSV文件数据用豆包AI解析Python中的CSV文件数据用豆包AI解析Python中的CSV文件数据

    解析 csv 文件的核心方法包括使用 python 内置 csv 模块、pandas 进行结构化数据处理以及结合 ai 工具辅助调试和生成代码。1. 使用 csv 模块适合小规模数据,通过 reader 对象逐行读取,适用于无第三方依赖的场景;2. pandas 提供更高效的数据处理能力,支持列名识…

    2026年10月1日 • 用户投稿
    000
  • 分享自己的SublimeText使用经验和技巧

    分享自己的SublimeText使用经验和技巧分享自己的SublimeText使用经验和技巧分享自己的SublimeText使用经验和技巧分享自己的SublimeText使用经验和技巧

    sublime text的核心功能包括命令面板、多光标编辑、goto anything和代码片段。命令面板通过可搜索命令提升操作效率;多光标编辑支持同时在多个位置修改内容;goto anything实现快速文件与符号跳转;代码片段减少重复输入并降低错误率。这些功能共同构建了高效流畅的开发体验。 对我…

    2026年10月1日 • 用户投稿
    200
  • MySQL怎样导出数据到文件 CSV/Excel格式导出全攻略

    MySQL怎样导出数据到文件 CSV/Excel格式导出全攻略MySQL怎样导出数据到文件 CSV/Excel格式导出全攻略MySQL怎样导出数据到文件 CSV/Excel格式导出全攻略MySQL怎样导出数据到文件 CSV/Excel格式导出全攻略

    mysql导出数据到文件的方法主要包括命令行方式、select…into outfile语句、mysqldump命令、图形化工具及编程语言连接数据库。1. 命令行方式通过mysql命令执行查询并将结果输出至文件,可结合sed替换分隔符;2. select…into outfi…

    2026年10月1日 • 用户投稿
    100
  • 教你如何修复失效资源管理器快捷键

    教你如何修复失效资源管理器快捷键教你如何修复失效资源管理器快捷键教你如何修复失效资源管理器快捷键教你如何修复失效资源管理器快捷键

    熟练掌握电脑快捷键不仅能提升工作效率,还能让日常操作更加便捷。然而,有用户反馈在使用 win+e 快捷键时发现无任何反应,正常情况下该组合键应能快速打开文件资源管理器。遇到这种情况该怎么办呢?别担心,下面黑鲨小编将为大家详细介绍如何修复win+e快捷键失效的问题,一起来看看具体操作步骤吧! 1、按下…

    2026年10月1日 • 用户投稿
    100
  • ChatGPT如何用API开发 接入与调试完整流程

    ChatGPT如何用API开发 接入与调试完整流程ChatGPT如何用API开发 接入与调试完整流程ChatGPT如何用API开发 接入与调试完整流程ChatGPT如何用API开发 接入与调试完整流程

    使用chatgpt api开发的关键在于掌握申请流程和调试技巧。1. 申请api权限需注册openai账号,创建项目并绑定支付信息,审核通过后生成api key;2. 调用api时选择gpt-3.5-turbo模型,构造包含角色与内容的消息结构,并在请求头中添加authorization字段;3. …

    2026年10月1日 • 用户投稿
    200
  • Python 开发环境配置与调试插件推荐

    Python 开发环境配置与调试插件推荐Python 开发环境配置与调试插件推荐Python 开发环境配置与调试插件推荐Python 开发环境配置与调试插件推荐

    选择python开发环境和调试插件需根据个人习惯与项目需求决定。推荐vs code适合新手及轻量级项目,pycharm适合需要高级功能的开发者,jupyter notebook适用于数据分析;常用调试插件包括pdb、vs code python插件、pycharm debugger和ipdb;配置虚…

    2026年10月1日 • 用户投稿
    100
  • 参加SublimeText线下技术交流活动的经验

    参加SublimeText线下技术交流活动的经验参加SublimeText线下技术交流活动的经验参加SublimeText线下技术交流活动的经验参加SublimeText线下技术交流活动的经验

    参加sublime text线下技术交流活动让我意识到,最大化活动价值的关键在于带着问题去、勇于分享、保持开放心态并及时实践。1. 带着具体问题参与交流,能更高效筛选和吸收信息;2. 主动提问和分享经验,有助于引发深入讨论并互相启发;3. 保持开放心态,尝试理解他人用法背后的逻辑;4. 活动后立即实…

    2026年10月1日 • 用户投稿
    200
  • 从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践

    从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践

    前言 从最初对人工智能的懵懂认知,到逐渐踏入prompt工程的世界,我们一路探索,从私有化部署的实际场景,到对deepseek技术的全面解读,再逐步深入到nl2sql、知识图谱构建、rag知识库设计,以及chatbi这些高阶应用。一路走来,我们在ai的领域里一步一个脚印,不断拓展视野和能力边界。如果…

    2026年10月1日 • 用户投稿
    200
  • Sublime快速生成Markdown API文档技巧_适合后端文档自动输出流程

    Sublime快速生成Markdown API文档技巧_适合后端文档自动输出流程Sublime快速生成Markdown API文档技巧_适合后端文档自动输出流程Sublime快速生成Markdown API文档技巧_适合后端文档自动输出流程Sublime快速生成Markdown API文档技巧_适合后端文档自动输出流程

    使用sublime text生成markdown api文档可提升效率,具体方法如下:1. 利用snippet预设模板快速插入固定格式内容,减少重复编写;2. 结合注释规范与正则替换从代码中提取接口信息,简化手动输入;3. 使用多光标编辑、列选和快捷键批量处理文档内容,加快字段处理速度。通过这些技巧…

    2026年10月1日 • 用户投稿
    100
  • 使用Sublime构建Flask项目基础结构_快速启动后端服务示例

    使用Sublime构建Flask项目基础结构_快速启动后端服务示例使用Sublime构建Flask项目基础结构_快速启动后端服务示例使用Sublime构建Flask项目基础结构_快速启动后端服务示例使用Sublime构建Flask项目基础结构_快速启动后端服务示例

    搭建 flask 项目需先安装 python 和 flask 环境,接着创建清晰的项目文件结构,然后编写并运行 flask 应用代码,最后配置调试模式提升开发效率。首先确保安装 python 3.7+ 并通过 pip install flask 安装 flask;其次建议建立包含 app.py、te…

    2026年10月1日 • 用户投稿
    100
  • ChatGPT如何生成3D模型 ChatGPT三维建模辅助功能初探

    ChatGPT如何生成3D模型 ChatGPT三维建模辅助功能初探ChatGPT如何生成3D模型 ChatGPT三维建模辅助功能初探ChatGPT如何生成3D模型 ChatGPT三维建模辅助功能初探ChatGPT如何生成3D模型 ChatGPT三维建模辅助功能初探

    许多用户对于ChatGPT在三维建模领域的应用充满好奇,尤其是它能否直接“生成”3D模型。本文将深入探讨ChatGPT在三维建模工作流程中扮演的角色,重点阐述其作为辅助工具的功能,而非直接的模型生成器。我们将介绍如何利用ChatGPT进行构思、获取技术指导、甚至生成辅助代码,帮助您了解并掌握将Cha…

    2026年10月1日 • 用户投稿
    200
  • Excel表格怎么制作一个漂亮的考勤表_Excel考勤表制作教程

    Excel表格怎么制作一个漂亮的考勤表_Excel考勤表制作教程Excel表格怎么制作一个漂亮的考勤表_Excel考勤表制作教程Excel表格怎么制作一个漂亮的考勤表_Excel考勤表制作教程Excel表格怎么制作一个漂亮的考勤表_Excel考勤表制作教程

    答案是制作Excel考勤表的关键在于结构清晰、格式美观和功能实用。首先设置表头标题居中加粗,A列列明姓名,B列可选部门或编号,C列起按日期排列,末列添加出勤、迟到、缺勤统计项;接着通过调整字体、背景色、边框及隔行变色提升视觉效果;然后用√、○、×、△标记出勤状态,并利用COUNTIF函数自动统计各项…

    2026年10月1日 • 用户投稿
    200
  • Sublime编写后端单元测试脚本实践_确保接口逻辑与数据准确可靠

    Sublime编写后端单元测试脚本实践_确保接口逻辑与数据准确可靠Sublime编写后端单元测试脚本实践_确保接口逻辑与数据准确可靠Sublime编写后端单元测试脚本实践_确保接口逻辑与数据准确可靠Sublime编写后端单元测试脚本实践_确保接口逻辑与数据准确可靠

    单元测试在sublime中编写是可行且高效的。首先,sublime轻便快速,适合习惯其环境的开发者;其次,通过安装anaconda或sublimerepl插件可提升脚本运行与调试效率;最后,配置构建系统后可一键运行测试,结合终端命令还可执行整个目录下的测试用例,使工具虽非ide但具备完整测试能力。 …

    2026年10月1日 • 用户投稿
    100
  • 主板供电相数是不是越多越好?如何判断?

    供电相数并非越多越好,需结合CPU需求、用料与散热设计综合判断。多相供电可提升稳定性与超频能力,但存在虚标现象,真实相数应以MOSFET数量、DrMOS用料、PWM控制器及散热为准,普通用户6相足够,高端平台建议10相以上真实供电。 主板供电相数并不是越多越好,而是要结合实际需求和整体设计来看。供电…

    2026年10月1日
    100
  • java如何用else扩展if的条件判断 java条件分支语句的简单用法

    java如何用else扩展if的条件判断 java条件分支语句的简单用法java如何用else扩展if的条件判断 java条件分支语句的简单用法java如何用else扩展if的条件判断 java条件分支语句的简单用法java如何用else扩展if的条件判断 java条件分支语句的简单用法

    else语句是if条件不成立时的备选执行路径,它确保在if或else if条件都不满足时执行默认代码块;1. else与if构成互斥逻辑,保证仅一个分支执行,而独立if语句可能触发多个条件;2. if-else if-else链用于处理多重互斥条件,需按从严格到宽松的顺序排列条件以避免逻辑错误;3.…

    2026年10月1日 • 用户投稿
    100
  • Claude支持自动化测试吗 Claude软件质量保障应用指南

    Claude支持自动化测试吗 Claude软件质量保障应用指南Claude支持自动化测试吗 Claude软件质量保障应用指南Claude支持自动化测试吗 Claude软件质量保障应用指南Claude支持自动化测试吗 Claude软件质量保障应用指南

    本文将围绕Claude在软件质量保障领域的应用展开叙述。虽然Claude本身不能像传统的自动化测试框架那样直接执行测试,但它能够作为强大的辅助工具,在测试流程的多个环节中发挥重要作用。下文将通过分步讲解的方式,介绍如何利用Claude生成测试用令、辅助编写脚本代码以及分析测试结果,从而有效提升软件质…

    2026年10月1日 • 用户投稿
    100
  • Sublime结合Postman调试REST接口流程_构建后端API调试闭环

    Sublime结合Postman调试REST接口流程_构建后端API调试闭环Sublime结合Postman调试REST接口流程_构建后端API调试闭环Sublime结合Postman调试REST接口流程_构建后端API调试闭环Sublime结合Postman调试REST接口流程_构建后端API调试闭环

    使用 sublime 和 postman 联合调试 rest 接口,是一种轻量高效的开发方式。1. sublime 作为轻量编辑器,通过插件支持语法高亮、快速运行脚本、集成终端和 git 版本控制,提升 api 开发效率;2. postman 可构造各类 http 请求、管理环境变量、执行自动化测试…

    2026年10月1日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信