【问题标题】:how can I do a maximum likelihood regression using scipy.optimize.minimize如何使用 scipy.optimize.minimize 进行最大似然回归
【发布时间】:2015-06-02 04:05:40
【问题描述】:

如何使用scipy.optimize.minimize 进行最大似然回归?我这里特别想使用minimize函数,因为我有一个复杂的模型,需要添加一些约束。我目前正在尝试使用以下内容的简单示例:

from scipy.optimize import minimize

def lik(parameters):
    m = parameters[0]
    b = parameters[1]
    sigma = parameters[2]
    for i in np.arange(0, len(x)):
        y_exp = m * x + b
    L = sum(np.log(sigma) + 0.5 * np.log(2 * np.pi) + (y - y_exp) ** 2 / (2 * sigma ** 2))
    return L

x = [1,2,3,4,5]
y = [2,3,4,5,6]
lik_model = minimize(lik, np.array([1,1,1]), method='L-BFGS-B', options={'disp': True})

当我运行它时,收敛失败。有人知道我的代码有什么问题吗?

我收到的消息是“ABNORMAL_TERMINATION_IN_LNSRCH”。我正在使用与在 R 中使用 optim 相同的算法。

【问题讨论】:

  • convergence fails 表示算法错误,不是代码。你能详细说明到底发生了什么吗?你尝试过不同的搜索模型和初始条件吗?
  • 我添加了我在编辑中收到的消息。当我尝试不同的起始参数时,我得到“ValueError:操作数无法与形状(5,)(10,)一起广播”

标签: python scipy regression


【解决方案1】:

谢谢亚历山大。你是对的,我的似然函数是错误的,而不是代码。使用我在维基百科上找到的公式,我将代码调整为:

import numpy as np
from scipy.optimize import minimize

def lik(parameters):
    m = parameters[0]
    b = parameters[1]
    sigma = parameters[2]
    for i in np.arange(0, len(x)):
        y_exp = m * x + b
    L = (len(x)/2 * np.log(2 * np.pi) + len(x)/2 * np.log(sigma ** 2) + 1 /
         (2 * sigma ** 2) * sum((y - y_exp) ** 2))
    return L

x = np.array([1,2,3,4,5])
y = np.array([2,5,8,11,14])
lik_model = minimize(lik, np.array([1,1,1]), method='L-BFGS-B')
plt.scatter(x,y)
plt.plot(x, lik_model['x'][0] * x + lik_model['x'][1])
plt.show()

现在它似乎工作了。

感谢您的帮助!

【讨论】:

  • 好东西 :) 抱歉,在您发布答案之前,我不在,无法查看此内容。
  • 谢谢。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
  • 2017-08-08
  • 1970-01-01
  • 2017-05-30
  • 2019-03-30
  • 2020-06-29
相关资源
最近更新 更多