首页 > 解决方案 > 在 python 中使用 scipy.optimize 的 MLE 应用程序

问题描述

我想在python中运行简单的最大似然估计。我想通过Scipy.optimize.minimize在 python 中使用来尝试它。首先,我将解释我的模型,以便您了解会发生什么。

型号说明

通过 MLE,我想估计 2 个变量的最佳值,以最大化我的目标函数!
这些变量是什么,目标函数是什么?在下图中你可以看到我的目标函数!我的变量是'Betaa''Kasi'。 现在你知道什么是我的目标函数和什么是我的变量(目标函数除外。我会解释它!请继续阅读)。我想在数据集上实现 MLE(点击从我的谷歌驱动器下载它),您可以在下图中看到: 这是非常简单的数据集!包含 501 行和 1 列。现在您已经看到了我的数据,是时候解释 MLE 将如何处理它了!
在此处输入图像描述
item
在此处输入图像描述

MLE

对于“损失”列中的每个值,如果值>160,我应该通过目标函数计算目标值(我在第一节中谈到过),如果值<160,那么目标值将是 0!看看下面的图片,你会发现我在说什么(你也会发现我在说item什么)! 在此处输入图像描述 MLE 将Target通过为“Betaa”和“Kasi”找到最佳值来最大化值的总和!

代码

所以这是为此目的编写的脚本:

from scipy.optimize import minimize
import pandas as pd
import numpy as np


My_DataFrame = pd.read_excel("<FILE_PATH_IN_YOUR_MACHINE>\\Losses.xlsx")
# i did put link of "Losses.xlsx" file in the model explaination section
# so you can download it from my google drive.
loss = My_DataFrame["Loss"]


def obj_function(x):
    k = x[0]
    b = x[1]

    target = np.array([])

    for iloss in loss:
        if iloss>160:
            t = np.log((1/b)*(1+(k*(iloss-160)/b)**((-1/k)-1)))
            target = np.append(target , t)
    
    # multiplied by (-1) so now we have maximization
    return -np.sum(target)


MLE_Model = minimize(obj_function , [0.7,20] )
print(MLE_Model)

和这段代码的结果:

t = np.log((1/b) (1+(k (iloss-160)/b)**((-1/k)-1)))
fun: nan
hess_inv: array([[1, 0 ], [0, 1]])
jac: array([nan, nan])
消息:“由于精度损失,不一定会实现所需的错误。”
nfev:126
尼特:1
njev:42
状态:2
成功:错误
x:数组([-1033.52630224, 25.32290945])

正如您在结果中看到的那样,success: False没有找到最佳解决方案!
现在我不知道如何解决这个问题以及如何解决这个 MLE 问题。
任何帮助,将不胜感激。

标签: pythonnumpyscipymaximizemle

解决方案


正如评论中已经提到的,在评估功率时,由于溢出,有多个运行时警告。仔细观察,您可以观察到您的目标函数是错误的。根据你的图片应该是

(1 + ( k*(iloss-160)/b) )**( (-1/k) - 1 ) 

代替

(1 + ( k*(iloss-160)/b )**( (-1/k) - 1 )

此外,您可以避免计算功率并使用对数规则重写您的目标:

np.log(1/b) + ((-1/k)-1) * ( np.log(b+k*(iloss-160)) - np.log(b))

最后但同样重要的是,强烈建议您熟悉向量化的 numpy 操作以避免循环:

def obj_function(x):
    k, b = x

    iloss = loss[loss > 160.0]
    q = ((-1/k)-1)
    target = np.log(1/b) + q* ( np.log(b+k*(iloss-160)) - np.log(b))
    return -1.0*np.sum(target)

这给了我

In [9]: minimize(obj_function, x0=[0.7, 20])
Out[9]:
      fun: 108.20609317144068
 hess_inv: array([[ 1.03577269e-01, -2.40749570e+00],
       [-2.40749570e+00,  1.45377397e+02]])
      jac: array([ 9.53674316e-07, -9.53674316e-07])
  message: 'Optimization terminated successfully.'
     nfev: 39
      nit: 9
     njev: 13
   status: 0
  success: True
        x: array([ 0.43624657, 32.53159127])

推荐阅读