首页 > 编程问答 >测量加权 numpy 数组的平衡性

测量加权 numpy 数组的平衡性

时间:2024-08-04 15:54:04浏览次数:13  
标签:python numpy counter

我有玩家 A B ,他们都与不同的对手交手。

玩家 对手 几天前
A C 1
A C 2
A D 10
A F 100
A F 101
A F|| |102 A
G 1 B
C 1 B
C 2 B
D 10 B
F 100 B
F 101 B
F 102 B
G 1|| |B G
2 B G
3 B G
4 B G
5 B G
6 B G
7 B G
8 首先,我想找到最常见的对手。我对“最常见”的定义不是匹配总数,而是匹配的平衡数量。 例如,如果玩家

分别与玩家打了99次和1次 1 我更喜欢对手 2 ,其中 3 4 都打了49次。 A 为了测量“平衡性”,我编写了以下函数: B 此函数按预期工作:

如果我在不同的对手上运行该函数,我会看到以下结果:

import numpy as np
from collections import Counter


def balanceness(array: np.ndarray):
    classes = [(c, cnt) for c, cnt in Counter(array).items()]
    m = len(classes)
    n = len(array)

    H = -sum([(cnt / n) * np.log((cnt / n)) for c, cnt in classes])

    return H / np.log(m)

对手

>> balanceness(array=np.array([0, 0, 0, 1, 1, 1]))
1.0

平衡性|| |n_matches

C 1 4
D 1 2
F 1 6
G 0.5032583347756457 9
显然,对手 是最常见的。然而,

对抗 F 的匹配相对较旧。 A 我应该如何将新近度因素纳入我的计算中以找到“最近的共同对手”? B 编辑|| |经过更多思考后,我决定使用以下函数对每场比赛进行加权 F 我将所有比赛对每个对手的权重相加

对手

平衡性

n_matches

def weight(days_ago: int, epilson: float=0.005) -> float:
    return np.exp(-1 * days_ago * epilson)

weighted_n_matches

C 1 4 3.9701246258837
D 1 2 1.90245884900143
F 1 6 3.62106362790388
G|| |0.5032583347756457 9 8.81753570603108 现在,对手
是“最近平衡的对手”。 然而,此方法忽略了玩家级别的“近期性”,因为我们将价值观。可能存在一种情况,玩家 最近与玩家 进行了很多比赛,而玩家

在遥远的过去面对过玩家 C

我们如何找到对手 1 两名玩家之间最平衡/分布最均匀的 3 最近与两名玩家进行过比赛的对手 2 faced player 3 in the distant past.

How can we find the opponent that is

  1. the most balanced / equally-distributed between two players
  2. the opponent with the most recent matches against the two players

为了找到符合你标准的对手,你需要结合平衡性和新近度。以下是一种可能的方法:

1. 计算加权平衡度

你对个别比赛进行加权的想法是好的。我们可以调整它以计算每个对手的加权平衡度得分。

2. 计算加权新近度

我们也可以为每个对手计算加权新近度得分。

3. 结合得分

最后,我们可以结合加权平衡度得分和加权新近度得分,得到一个综合得分,用于确定最符合你标准的对手。

以下是如何实现此方法的示例代码:

import numpy as np
from collections import Counter

def weight(days_ago: int, epsilon: float = 0.005) -> float:
    return np.exp(-1 * days_ago * epsilon)

def opponent_score(player1_matches: list, player2_matches: list, epsilon: float = 0.005) -> dict:
    """计算每个对手的综合得分,结合了平衡性和新近度。

    Args:
        player1_matches: 玩家 1 比赛的列表,每个元素是一个包含对手和天数的元组。
        player2_matches: 玩家 2 比赛的列表,每个元素是一个包含对手和天数的元组。
        epsilon: 用于加权函数的衰减因子。

    Returns:
        一个字典,其中键是对手,值是它们的综合得分。
    """

    # 创建一个字典来存储每个对手的比赛次数和总权重
    opponent_data = {}
    for player_matches in [player1_matches, player2_matches]:
        for opponent, days_ago in player_matches:
            if opponent not in opponent_data:
                opponent_data[opponent] = {'count': [0, 0], 'weight': [0, 0]}
            opponent_data[opponent]['count'][player_matches == player1_matches] += 1
            opponent_data[opponent]['weight'][player_matches == player1_matches] += weight(days_ago, epsilon)

    # 计算每个对手的加权平衡度和加权新近度得分
    opponent_scores = {}
    for opponent, data in opponent_data.items():
        total_matches = sum(data['count'])
        balance_score = min(data['count']) / total_matches if total_matches > 0 else 0
        recency_score = sum(data['weight']) / total_matches if total_matches > 0 else 0
        opponent_scores[opponent] = (balance_score + recency_score) / 2

    return opponent_scores


# 示例数据
player_a_matches = [('C', 1), ('C', 2), ('D', 10), ('F', 100), ('F', 101), ('F', 102)]
player_b_matches = [('C', 1), ('C', 2), ('D', 10), ('F', 100), ('F', 101), ('F', 102), ('G', 1), ('G', 2), ('G', 3), ('G', 4), ('G', 5), ('G', 6), ('G', 7), ('G', 8)]

# 计算对手得分
opponent_scores = opponent_score(player_a_matches, player_b_matches)

# 打印得分
for opponent, score in sorted(opponent_scores.items(), by=lambda item: item[1], reverse=True):
    print(f"Opponent: {opponent}, Score: {score:.4f}")

此代码将输出每个对手及其综合得分的列表。得分越高的对手在平衡性和新近度方面都得分更高。你可以根据你的具体需求调整加权函数和得分组合方法。

标签:python,numpy,counter
From: 78823898

相关文章

  • 使用 python 和 json 抓取该网站的正确 URL 是什么?
    试图抓取这个网站-->https://ucr.gov/enforcement/1000511它曾经使用下面的代码,然后停止了。无法获取响应中的json或任何内容。query="1000511"url='https://ucr.gov/api/enforcement/{}'.format(query)headers={'User-Agent':'Mozilla/5.0(......
  • Python逆向
    参考链接:https://www.bilibili.com/video/BV1JL4y1p7Tt/?spm_id_from=333.999.0.0https://bbs.kanxue.com/thread-282542.htmhttps://blog.csdn.net/weixin_35967330/article/details/114390031?spm=1001.2014.3001.5501https://0xd13a.github.io/ctfs/0ctf2017/py/前言:py......
  • Python中使用正则表达式
    摘要:正则表达式,又称为规则表达式,它不是某种编程语言所特有的,而是计算机科学的一个概念,通常被用来检索和替换某些规则的文本。一.正则表达式的语法①行定位符行定位符就是用来描述字符串的边界。"^"表示行的开始,"$"表示行的结束。^tm  #tmequalTomorrowMoon可以......
  • 如何在python中使用xarray打开grib2文件?
    将xarray导入为xr导入cfgrib导入生态码将pandas导入为pddata=xr.open_dataset(r"C:\Users\new\forecast_data.grib2",engine="cfgrib")这是我的代码。我只想使用xarray读取这个文件。错误是:无法识别的引擎cfgrib必须是以下之一:['netcdf4'、'scipy'、'......
  • 如何在 java 或 python 中使用 HTTP(S) 解决无法解析的主机名或无法识别的名称错误?
    我尝试以编程方式访问网站的信息,但在Java和Python上都无法解析主机名。如果我指定IP地址,则会将错误更改为TLSV1_UNRECOGNIZED_NAME。不过,这个网站无需任何额外的工作就可以通过任何浏览器解决。我在这里浏览了很多潜在的解决方案,但对于Python,它说这个问题应该在2.7......
  • Python 请求 POST 请求与 websockets 库一起使用时挂起
    我使用Python中的requests库发送POST请求,同时维护与websockets库的WebSocket连接:importasyncioimportrequestsimportwebsocketsasyncdefwebsocket_handler(uri):asyncwithwebsockets.connect(uri)aswebsocket:whileTrue:me......
  • 在Python中,list1[::] = list2的空间复杂度是多少?
    此代码首先迭代列表nums,更新整数0、1、2(也分别称为红色、白色和蓝色)的计数。nums保证只有整数0、1和/或2。找到计数后,代码使用[::],这是一种就地修改列表的技巧,以排序numsdefsortColors(self,nums:List[int])->None:re......
  • [附开题]flask框架高校资产管理系统d8y3s(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育事业的快速发展,高校资产规模日益庞大,种类繁多,管理难度显著增加。传统的资产管理方式往往依赖于手工记录和纸质档案,不仅效率低......
  • [附开题]flask框架贺州图特产管理系统uuy79(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景贺州,这座历史悠久、文化底蕴深厚的城市,以其丰富的自然资源和独特的地理位置孕育了众多令人瞩目的特产。然而,在信息化快速发展的今天,贺州特......
  • [附开题]flask框架红枫超市会员管理系统ew5iq(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着零售行业的快速发展与消费者需求的日益多样化,超市作为人们日常生活中不可或缺的一部分,其管理效率和服务质量直接影响着顾客的购物体验......