我想使用泊松回归来模拟足球比赛。我正在尝试根据过去的结果来调整每支球队的进攻和防守评分。假设我有一组这样的结果:
A v B 2 0
B v A 2 1
A v B 1 1
每支球队的进球数会转化为如下向量:
Y = numpy.array([2,0.001,2,1,1,1]) #0.001 will become clear soon
我正在尝试将主客场防守评分放入向量B
中,使得Y = exp(X*B)
其中X是代表的矩阵比赛结果。
向量B
的形式为:
B = [A_home_attack,
A_home_defence,
B_home_attack,
B_home_defence,
A_away_attack,
A_away_defence,
B_away_attack,
B_away_defence]
从上面的结果表中,矩阵 X 必须如下所示:
[1,0,0,0,0,0,0,-1]
[0,-1,0,0,0,0,1,0]
[0,0,1,0,0,-1,0,0]
[0,0,0,-1,1,0,0,0]
[1,0,0,0,0,0,0,-1]
[0,-1,0,0,0,0,1,0]
现在,由于上面模型方程的左侧是用 e^x 表示的,所以我取向量 Y
的对数(因此输入 0 作为 0.001,log(0) 不是定义)。
这是我对上述算法的 Python 实现:
import numpy
Y = numpy.array([2,0.001, 2,1,1,1])
X = numpy.matrix([ [1,0,0,0,0,0,0,-1], [0,-1,0,0,0,0,1,0], [0,0,1,0,0,-1,0,0], [0,0,0,-1,1,0,0,0], [1,0,0,0,0,0,0,-1], [0,-1,0,0,0,0,1,0]])
logY = numpy.log(Y)
beta = numpy.linalg.lstsq(X,logY)
print beta[0]
print "A %.2f v %.2f B" % ( beta[0][0] - beta[0][7], beta[0][6] - beta[0][1] )
上面的输出是:
[ 1.73286795e-01 1.72693882e+00 3.46573590e-01 -1.11022302e-16
1.45089809e-16 -3.46573590e-01 -1.72693882e+00 -1.73286795e-01]
A 0.35 v -3.45 B
数字beta[0][0] - beta[0][7]
和beta[0][6] - beta[0][1]
代表主队和客队的预期进球数。根据定义,这些必须是积极的,因此出现了问题。
如果有人能指出我的方法的错误,我将永远感激不已。
最佳答案
如果假设响应 Y 服从泊松分布,则 Y 的期望值等于模型参数 mu,即 E[Y]=mu。
现在,在泊松回归中,您将预期计数的对数建模为未知参数的线性组合,即 log( E[Y] ) = X * beta。这是一个广义线性模型,其中参数 beta 不一定都是正数。
为了获得拟合分数,您需要再次取指数,即 E[Y] = exp(X * beta)。
import numpy
Y = numpy.array([2,0.001, 2,1,1,1])
X = numpy.matrix([ [1,0,0,0,0,0,0,-1], [0,-1,0,0,0,0,1,0], [0,0,1,0,0,-1,0,0], [0,0,0,-1,1,0,0,0], [1,0,0,0,0,0,0,-1], [0,-1,0,0,0,0,1,0]])
logY = numpy.log(Y)
beta = numpy.linalg.lstsq(X,logY)[0]
print X
print beta
print numpy.exp( X.dot(beta) )
这会产生:
[[ 1.41421356 0.03162278 2. 1. 1.41421356 0.03162278]]
关于Python Numpy 泊松回归产生错误的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31304386/