Python Numpy 泊松回归产生错误的数字

标签 python numpy regression least-squares poisson

我想使用泊松回归来模拟足球比赛。我正在尝试根据过去的结果来调整每支球队的进攻和防守评分。假设我有一组这样的结果:

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/

相关文章:

python - 使用 appcfg.py/bulkloader.py 和脚本进行远程备份。如何处理电子邮件/密码字段?

python - 为什么 PyQt4 DialogBox OpenFileName 在 Linux 下卡住直到其他线程完成

python - 根据pandas中的多个条件添加新的数据框

python - 使用索引遍历 numpy(相当于 python 枚举的 numpy)

machine-learning - 数据去相关

python - 判断一个词是否是名词

python - 如何从请求中获取原始 url

python - 应如何重新调整 fft 点以获得与解析解相同的结果?

Python - 如何检查时间序列平稳性?

matlab - 我们可以使用深度神经网络来解决回归问题吗?