Python Trueskill (ELO) 分数下降

Python Trueskill (ELO) scores drift down

为什么随机人群随机获胜,分数慢慢漂移到0。我知道分数可能是随机的,但为什么总是负漂移?

import trueskill as ts
from random import choice

r = []
for i in range(10):
    r.append(ts.Rating())


def avg(r):
    ratings = [(a.mu, a.sigma) for a in r]
    mus = list(zip(*ratings))[0]
    sigmas = list(zip(*ratings))[1]
    avg_mu = sum(mus) / float(len(mus))
    avg_sigma = sum(sigmas) / float(len(sigmas))
    return avg_mu, avg_sigma


for j in range(20000):
    p1_ix = choice(range(len(r)))
    p2_ix = choice(range(len(r)))
    p1 = r[p1_ix]
    p2 = r[p2_ix]
    r[p1_ix], r[p2_ix] = ts.rate_1vs1(p1, p2)
    if not j % 1000:
        print(avg(r))

您使用的是 TrueSkill 算法,而不是 ELO。 TrueSkill 有一种不同的更新技能等级的方法。虽然 ELO 是一个零和系统,但 TrueSkill 依靠不确定性参数(由游戏数量及其结果决定)来调整技能等级。因此,如果一场比赛中的两名球员具有相等的不确定性值,则 TrueSkill 只是零和游戏。

您 运行 的模拟会产生玩家具有截然不同的不确定性参数的情况。这一点,再加上您违反了评分较高的玩家将更常获胜的假设,将导致一些 st运行ge 行为。更好的模拟是有几个循环调度。这样每场比赛的比赛次数就会更加相似。如果您 运行 下面的代码,平均评分将接近 25。

import trueskill as ts
from random import choice, shuffle
import numpy as np

r = []
for i in range(10):
    r.append(ts.Rating())


def avg(r):
    ratings = [(a.mu, a.sigma) for a in r]
    mus = list(zip(*ratings))[0]
    sigmas = list(zip(*ratings))[1]
    avg_mu = sum(mus) / float(len(mus))
    avg_sigma = sum(sigmas) / float(len(sigmas))
    return avg_mu, avg_sigma


for j in range(4444):
    # Create array of all possible matchup combinations
    possible_matches = np.array(list(itertools.combinations(list(range(len(r))), 2)))
    # Shuffle the matches to create a random-order round-robin schedule
    np.random.shuffle(possible_matches)
    for match in possible_matches:
        # Shuffle the order of the players in each match to randomize the result
        np.random.shuffle(match)
        p1_ix = match[0]
        p2_ix = match[1]
        p1 = r[p1_ix]
        p2 = r[p2_ix]
        r[p1_ix], r[p2_ix] = ts.rate_1vs1(p1, p2)
    if j % 222 == 0:
        print(avg(r))

此外,请务必注意 TrueSkill 不受 0 的限制,因此如果您 运行 的时间足够长,您的模拟将导致负分。但是,我无法完全解释为什么它总是产生负漂移。直觉上,我认为它会 运行 以相同的概率向正向或负向漂移。我的猜测是,有某种阻尼因素使得玩家不太可能 运行domly 运行 离开高得离谱的技能等级。