Algorithm 在给定完整历史记录的情况下,计算团队赢得体育比赛的几率的算法

Algorithm 在给定完整历史记录的情况下,计算团队赢得体育比赛的几率的算法,algorithm,math,statistics,game-theory,Algorithm,Math,Statistics,Game Theory,假设: 球队从不改变 球队的技术没有提高 每个团队相对于其他团队的一些子集的表现的整个历史都是已知的 团队之间的比赛数量很大,但可能很少(每个团队都没有与其他团队比赛) 例如: 我有一长串比赛结果,如下所示: Team A beats Team B Team B beats Team A Team A beats Team B Team C beats Team A Team A beats Team C double getOddsTeam1Winning(int team1, int

假设:

  • 球队从不改变
  • 球队的技术没有提高
  • 每个团队相对于其他团队的一些子集的表现的整个历史都是已知的
  • 团队之间的比赛数量很大,但可能很少(每个团队都没有与其他团队比赛)
例如:

我有一长串比赛结果,如下所示:

Team A beats Team B
Team B beats Team A
Team A beats Team B
Team C beats Team A
Team A beats Team C
double getOddsTeam1Winning(int team1, int team2){

    if(!isInSameConnectedComponent(team1, team2)){
        // if two teams are not in the same
        // connected component,

        // we can use heuristic,
        // we'll compare how many matches has team1 won,
        // compared to team2.

        var team1Wins = (team1Wins - team1Loses);
        var team2Wins = (team2Wins - team2Loses);

        return team1Wins / (team1Wins + team2Wins);
    }

    if(isDirectMatchBetween(team1, team2)){
        return team1WinsOverTeam2/
            totalMatchesPlayedBetweenTeam1AndTeam2;
    }

    List<double> odds= new List<double>();

    foreach(var opponentTeam in teamsThatTeam1HasPlayedWith){

        var oddsThatOponentTeamBeatsTeam2 = getOddsTeam1Winning(opponentTeam, team2);
        var oddsThatTeam1BeatsOpponentTeam = getOddsTeam1Winning(team1, opponentTeam);

        // combine them &  push them to odds list
    }

    return odds.Average(); // taking average of odds?!
}
问题:

预测任何球队击败任何其他球队的正确下注几率

在上面的例子中,也许我们可以得出结论,A应该在66%的时间里击败B。这是基于直接观察,非常简单。然而,找到C击败B的概率似乎更难。他们从来没有一起踢过球,但看起来很可能是C>B,信心有些低落

我所做的研究:

我读过很多关于技能游戏的不同排名系统,比如国际象棋的Elo和Glicko评级系统。这是因为它们对所涉及的概率分布进行了假设。例如,埃洛的中心假设是,每场比赛中每个棋手的国际象棋表现都是一个正态分布的随机变量。然而,根据维基百科,还有其他更适合现有数据的发行版


我不想假设一个分布。在我看来,手头上有10000多个匹配结果,我应该能够从证据中推断出分布(我不知道怎么做),或者使用某种强化学习方案,而不管分布是什么。

你可以尝试应用,主要是基于其他人利用这个来锻炼自己的优势。然而,任何这样的系统都是建立在某种概率模型的基础上的,你最好为你的特定游戏建立一个概率模型。例如,对于足球,一种方法是将一支球队的进球数建模为泊松过程,这取决于他们进攻和对方防守的强度。一旦你有了一个模型,你就可以将它与数据相匹配,例如通过最大似然法


作为模型发挥作用的示例,请参见。这是一个简单的例子,其中a通常比B强,B通常比C强,C通常比a强,这不是给定一个简单的一维强度系统所期望的情况。

我们需要做出一些假设,如以下示例所示:

Team Rock beats Team Scissors
Team Paper beats Team Rock
Team Rock beats Team Scissors
现在我们在剪刀队和布队之间展开了一场战斗。既然纸队击败了石头队,而石头队又两次击败了剪刀队,我们可以假设最好的胜算是纸队击败剪刀队

然而,在上面我们假设了一个传递模型,这显然是不适用的。它可能更适合一些运动,如足球,但仍然不完全适合

ELO所做的是假设所有团队都有一些“内在的力量”,从
0
infinity
。很明显,没有任何技能真的像这样有效,但事实证明它是预测游戏的有用模型。还请注意,这个模型在石头、布、剪刀游戏中效果不佳

国际象棋中的下一个假设是“内在力量”的绝对差异产生了一个关于一个棋手击败另一个棋手的可能性的概率分布。同样,这显然不是真的,因为像白色/黑色的部分也发挥作用。然而,通过观察多场比赛的获胜机会,可以更精确地(显示证据)

根据以上两个假设,我们可以计算获胜机会,如果模型很适合比赛,那么它们可能相当精确。不幸的是,这种建模并不是一门精确的科学,无论你做出什么样的假设,你总能找到一个不适用的游戏/情况

我希望这能给你一些灵感,让你为你的模型提出更多的假设:)一旦你有了这些假设,你就可以通过看看它是否能预测你在训练集中已有的一些结果来测试它的效果。有一整套机器学习和统计文献供您欣赏:)

==步骤1===

假设A队和B队相互进行了n场比赛,A队赢了m场。通过应用平坦贝塔分布,下次获胜的概率为:(m+1)/(n+2)

如您所见,如果m和n是大数字,则大致等于m/n

==步骤2===

在你的情况下,我建议采取以下策略

设m=mp+md+mr,n=np+nd+nr

后缀p表示优先,d表示直接,r表示间接

您可以将mp和np分别设置为1和2(假设之前为平坦),也可以采用高级方式(在末尾详细说明)

md和nd是胜利和游戏

mr和nr通过某种策略进行计算

最终获胜的概率是(mp+md+mr)/(np+nd+nr)

==步骤3===

如何计算mr和nr:

你可以用一些润湿剂。例如,如果A定义C和C定义B,则将其计算为p赢A赢B。对于更长的链,使用指数衰减

p的最佳值可以通过交叉验证来计算,在交叉验证中,您省略了数据的某些部分,并使用p来最大化遗漏数据的概率。对于你的特殊问题,我建议省略一对之间的博弈,估计概率,并与实际值进行比较

您可以使用:k*log^2(s/t)作为惩罚,其中k是被遗漏的A对和B对之间的游戏数,s是预测的,t是获胜的实际概率。你也可以用KL散度之类的东西

==步骤4===

再次访问设置mp和np

你需要在同一支球队之间进行多次对决,才能解决这个问题

每双