【不务正业】设计一个神经网络预测足球比赛胜负

由:admin 发布于:2024-02-07 分类:体育吧 阅读:131 评论:0

  首先作为一个研究生,以下内容皆游离在我的研究内容之外。但是没办法,我承认我确实有“逢赌必输”的运气加成,总之跟着我的直觉反买必中,可能也算一种预测方法。不过大家也都知道,兴趣才是最好的老师,本人潜心钻研,旨在为各位“赌狗”提供更加准确的专业解决方案。

  好了,言归正传。神经网络作为时下最热门的概念,确实可以“坑蒙拐骗”一群非计算机专业的吃瓜群众,好像“万物皆可神经网络”。当然这是个悖论,以下问题对此进行了很好地解释:是不是并不是所有问题都适合用神经网络预测?

  神经网络说起来非常玄乎,不过在我看来其实也就是个复杂的数学模型,复杂到你我都看不太懂而已(姑且认为你不太懂)。神经网络的作用主要有回归、预测等等……对没错,所谈论的预测其实也就是一种函数逼近而已。反正咱自己也预测不准,不如用神经网络试一试,死马当活马医了,说干就干!

  OK我首先从最简单的BP(Back Propagation)神经网络做起,与文献[1]的思想类似,但其使用Java语言,而本文利用的是Python语言的Tensorflow框架(以下皆是)。

  关于BP神经网络,大家可以参考这个话题:bp神经网络

  BP神经网络其实就是按照一定规则连接起来的多个神经元。按结构来说分为输入层、隐藏层和输出层。第层的每个神经元和第N层的所有神经元相连,第N-1层神经元的输出就是第N层神经元的输入,且每个连接都有一个权值。关于这些内容,网上有众多介绍并且大同小异,在此不过多赘述了。大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!

  当然,数学模型离不开理论推导,这对刚入门的人来说也是个超级困难的过程。关于BP神经网络的推导和误差的梯度下降法可以借鉴以下这篇文章:https://zhuanlan.zhihu.com/p/24801814

  关于BP神经网络的激活函数,一般使用的是Sigmoid函数: Sigmoid\left( x \right)=\frac{1}{1+e^{-x}}

  上文的推导也是基于Sigmoid函数做的,然而我却不准备用Sigmoid函数。

  在网上看了一些文献之后,准备利用Tanh函数作为激活函数: Tanh\left( x \right)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} 那么以上推导也会有一定的变化。

  

  由图可见,Sigmoid函数在输入处于[-1,1]之间时,函数值变化敏感。一旦接近或者超出区间就失去敏感性,处于饱和状态,影响神经网络预测的精度值。Tanh函数的输出和输入能够保持非线性单调上升和下降关系,符合BP网络的梯度求解,容错性好。

  神经网络的输入应该是+影响足球比赛胜负的各因素,但现实比赛中,影响胜负的因素却没有固定标准,以某APP提供的数据暂且归纳为以下几点(排名不分先后):

  (1)主队进球数:废话。

  (2)对方进球数:这也是一句废话。

  (3)主/客场:作为一个球迷,当然希望主队的每一场比赛都是在主场。如果要拿“客场进球优势”呛我,请当我没说,不过至少这样不用满世界跑来跑去踢比赛了对吧……OK那么我们定义主场为“1”,客场为“0”,中立场为“0.5”。

  (4)控球率:指一场比赛某一方控制足球的时间比率,两队的控球率之和为100%,正好不用归一化了。(PS:其实这个数据的使用比较纠结,因为貌似和球队风格有关,某些“宇宙队”就喜欢拿着球来回传……不过既然有这个现成的数据咱还是用吧!)

  (5)主队射正数:主要包括进入球网的、本可以进入球网,却被守门员救出的、本可以进入球网,却被最靠后的防守队员挡出的。简而言之,射正一定是进球的前提,进球又是获胜的前提。

  (6)对方射正数:同上。

  (7)主队危险进攻:顾名思义,有危险的进攻才能进球,想必也都理解。

  (8)对方危险进攻:同上。

  (9)主队任意球+角球数:任意球和角球也是比较重要的进球方式

  (10)对方任意球+角球数:同上。

  (11)主队红牌数:红牌作为一项负因素,意味着主队要被罚下一人,比赛以少打多。

  (12)对方红牌数:同上。

  (13)士气:士气是决定比赛的重要因素之一,但其存在不可量化的缺陷,这里引入一个士气评估标准。初始士气值为0.5,每赢一场比赛加0.1分,平局不加分,输一场扣0.1分,某名首发球员复出加0.1分,受伤扣0.1分。为满足归一化要求,士气值上限不超过1分,下限不低于0分。

  (PS:如果还有别的因素我未列举的,欢迎私信给我,用作优化网络、提升精度使用。)

  接下来对以上数据归一化处理,其中(3)、(4)、(13)可以直接使用,(1)、(2)直接与结果相关,暂时不用。(4)~(10)作为比赛正相关因素,认为其值越大表示胜利可能性越高,设置两两为一组,做归一化处理:

  p=\frac{data_{1}}{data_{1}+data_{2}}\left (data_{1} \ne0或data_{2}\ne0\right)

  p=0.5\left( data_{1}=data_{2}=0 \right)

  其中 data_{1} 为本方数据, data_{2} 为对手数据,将数据限制在[0,1]之间,便于神经网络输入。

  (11)、(12)作为比赛负相关因素,认为其值越小表示胜利可能性越高,做归一化处理:大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!

  t=\frac{data_{2}}{data_{1}+data_{2}}\left (data_{1} \ne0或data_{2}\ne0\right)

  t=0.5\left( data_{1}=data_{2}=0 \right)

  BP神经网络使用的是有监督学习,那么我们为赢球标注为“1”,输球为“0”,平局为“0.5”大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!。

  例如将RealMadrid在2020年2月1日至2020年2月23日的五场比赛(比分分别为1:0、3:4、4:1、2:2、0:1,RealMadrid在前)归一化处理后列表如下。

  这里只选取了五场比赛结果,可以考虑选取最近的 N 场比赛结果作为输入,可做后续研究。

  在此神经网络下,输入即为前7列*5维个数据。

  同样地,针对预测场次的数据,可以考虑选取最近的 M 场比赛数据计算平均得出。这里模拟预测2020年2月27日vs ManchesterCity的比赛结果,选取截至此前的赛季平均数据作为模拟(其中主/客场按本场比赛计算),如表所示。

  归一化后,得到测试集为[0,0.642,0.468,0.480,0.487,0.421,0.6]:

  选用RealMadrid的前五场比赛作为训练集:

  进行模型训练:

  该训练模型有7层输入,设置2个隐藏层和1个输出。

  输出为:

  

  显示RealMadrid本场比赛的胜率为0.429,还不及五成。嗯,看来凶多吉少。

  结果当天的新闻......

  OK!看起来预测的结果还不错!

  接下来再测试几场比赛的胜负,准确率大约在70%左右,还有30%可能是真的预测不出来,比如这样的……

  或者这样的……

  果然冷门也是足球的一部分,可能也是足球的魅力所在吧!

  听说五大联赛因为新冠肺炎都停了,好吧,可能近一段时间都没比赛要去预测了,希望早日战胜病毒,在家一直闲着感觉也不是很好……

  顺便坐等中超成为世界第一大足球联赛!

  最后如果有预测需求的兄弟直接联系我。

【不务正业】设计一个神经网络预测足球比赛胜负

【不务正业】设计一个神经网络预测足球比赛胜负

相关阅读