def CalcElo(winteam, loseteam): R1 = GetElo(winteam) R2 = GetElo(loseteam) # 计算等级分 参考elo计算公式 E1 = 1/(1 + math.pow(10,(R2 - R1)/400)) E2 = 1/(1 + math.pow(10,(R1 - R2)/400)) if R1>=2400: K=16 elif R1<=2100: K=32 else: K=24 R1new = round(R1 + K*(1 - E1)) R2new = round(R2 + K*(0 - E2)) return R1new, R2new
时间: 2023-12-02 15:03:22 浏览: 54
这段代码看起来像是用来计算两个团队之间的 Elo 等级分的。其中,GetElo 函数用于获取团队的当前 Elo 等级分,而 CalcElo 函数则用于计算比赛后两个团队的新 Elo 等级分。在计算时,根据 Elo 计算公式,先计算出每个团队的预期胜率 E1 和 E2,然后根据比赛胜负结果,计算出每个团队的新 Elo 等级分,并返回这两个新等级分。其中,如果团队的当前 Elo 等级分在 2100 到 2400 之间,则使用 K=24 的公式进行计算,否则使用 K=16 或 K=32 的公式。
相关问题
def GenerateTrainData(stat, trainresult): X = [] y = [] for index, rows in trainresult.iterrows(): winteam = rows['WTeam'] loseteam = rows['LTeam'] winelo = GetElo(winteam) loseelo = GetElo(loseteam) # 主场加100 if rows['WLoc'] == 'H': winelo = winelo+100 else: loseelo = loseelo+100 # 把elo当为评价每个队伍的第一个特征值 fea_win = [winelo] fea_lose = [loseelo] for key, value in stat.loc[winteam].iteritems(): fea_win.append(value) for key, value in stat.loc[loseteam].iteritems(): fea_lose.append(value) if np.random.random() > 0.5: X.append(fea_win+fea_lose) y.append(0) else: X.append(fea_lose+fea_win) y.append(1) # 更新team elo分数 win_new_score, lose_new_score = CalcElo(winteam, loseteam) team_elos[winteam] = win_new_score team_elos[loseteam] = lose_new_score return np.nan_to_num(X),y
这段代码是用于生成机器学习所需的训练数据。其中,stat 指代每个队伍的统计数据,trainresult 指代比赛结果数据。对于每一场比赛,先获取胜利队伍和失败队伍的 Elo 等级分,并在主场胜者 Elo 等级分加 100。然后,将胜利队伍和失败队伍的 Elo 等级分以及统计数据作为特征值,组合成特征向量。接着,根据 0.5 的概率将特征向量和胜负标签(0 表示胜利队伍,1 表示失败队伍)加入到训练数据集中。最后,根据比赛结果更新每个队伍的 Elo 等级分,并返回训练数据集 X 和对应的标签 y。值得注意的是,这里使用了 np.nan_to_num 函数将特征向量中的 NaN 值替换为 0。
阅读全文