Python Trueskill(ELO)得分逐渐下降

时间:2017-11-21 06:37:25

标签: python ranking rating

为什么随机人群随机获胜,分数慢慢漂移到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))

1 个答案:

答案 0 :(得分:2)

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

您运行的模拟会产生玩家将拥有截然不同的不确定性参数的情况。这一点,再加上你违反了更高等级的球员将更频繁获胜的假设,这将导致一些奇怪的行为。更好的模拟是有几个循环计划。这样,在每场比赛中,比赛的数量将更加相似。如果您运行以下代码,平均评分将接近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限制,因此如果运行时间过长,模拟将导致负分数。但是,我无法完全解释为什么它总会产生负漂移。直观地说,我认为它会以相等的概率随机地或者负地漂移。我的猜测是,某种阻尼系数会让玩家以较低的技能等级随机逃跑的可能性降低。