使用最大似然推导 Python 中的回归系数

Using maximum likelihood to derive regression coefficients in Python

作为我自己的学习练习,我正在尝试使用 Python 中的 MLE 方法估计回归参数。

根据我收集到的信息,对数似然函数归结为最大化以下内容:

所以我需要对截距和斜率求偏导数,将每个都设置为零,这应该会给出系数。

我一直在尝试使用 sympy 来解决这个问题,如下所示:

from sympy import *
b = Symbol('b')# beta1
a = Symbol('a')# intercept
x = Symbol('x', integer=True)
y = Symbol('y', integer=True)
i = symbols('i', cls=Idx)

x_values = [2,3,2]
y_values = [1,2,3]
n = len(x_values)-1

function = summation((Indexed('y',i) - a+b*Indexed('x',i))**2, (i, 0, n))

partial_intercept = function.diff(a)

print(partial_intercept)
# 6*a - 2*b*x[0] - 2*b*x[1] - 2*b*x[2] - 2*y[0] - 2*y[1] - 2*y[2]

intercept_f = lambdify([x, y], partial_intercept)

inter = solve(intercept_f(x_values, y_values), a)

print(inter)
# [7*b/3 + 2]

我本以为斜率只有一个值,这样 'b' 变量就消失了。但是,我发现这是不可能的,因为变量 b 仍然存在于我的导数方程中。

有人对我哪里出错有什么建议吗?

谢谢!

编辑:修复了代码块中的拼写错误

最后的表达式7*b/2 + 2告诉你,我们要满足a = 7*b/2 + 2,这取决于b的数量。

您应该同时解决 ab 作为一个系统。

在下面的代码中,我发现ab必须同时满足并求解的关系。

from sympy import *

b = Symbol('b')# beta1
a = Symbol('a')# intercept
x = Symbol('x', integer=True)
y = Symbol('y', integer=True)
i = symbols('i', cls=Idx)

x_values = [2,3,2]
y_values = [1,2,3]
n = len(x_values)-1

function = summation((Indexed('y',i) - a+b*Indexed('x',i))**2, (i, 0, n))

partial_intercept = function.diff(a)

print(partial_intercept)
# 6*a - 2*b*x[0] - 2*b*x[1] - 2*b*x[2] - 2*y[0] - 2*y[1] - 2*y[2]

intercept_f = lambdify([x, y], partial_intercept)

inter = solve(intercept_f(x_values, y_values), a)

print(inter)
#[7*b/3 + 2]

partial_gradient = function.diff(b)

print(partial_gradient)
# 6*a - 2*b*x[0] - 2*b*x[1] - 2*b*x[2] - 2*y[0] - 2*y[1] - 2*y[2]

intercept_f = lambdify([x, y], partial_gradient)

inter2 = solve(intercept_f(x_values, y_values), b)
print(inter2)

ans = solve([a-inter[0], b-inter2[0]])
print(ans)

输出如下:

6*a - 2*b*x[0] - 2*b*x[1] - 2*b*x[2] - 2*y[0] - 2*y[1] - 2*y[2]
[7*b/3 + 2]
2*(-a + b*x[0] + y[0])*x[0] + 2*(-a + b*x[1] + y[1])*x[1] + 2*(-a + b*x[2] + y[2])*x[2]
[7*a/17 - 14/17]
{a: 2, b: 0}

a 应设置为 2b 应设置为 0.