python - 在 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 问题。
任何帮助,将不胜感激。
解决方案
正如评论中已经提到的,在评估功率时,由于溢出,有多个运行时警告。仔细观察,您可以观察到您的目标函数是错误的。根据你的图片应该是
(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])
推荐阅读
- javascript - Koa.js 在请求之间保留状态
- parsing - 我将如何在我的语法中实现运算符优先级?
- sirikit - .continueInApp 后我还能让 Siri 说话吗?
- python - 树数据结构__str__方法
- reactjs - 根据 ReactJS 中的身份验证将用户重定向到不同路由的正确方法
- python - 从文件读取时计算一行中有多少'/'
- firebase - Firebase 存储:file().move 未实现?
- java - 在 JMonkeyEngine 中,如何在场景前拥有 FPS 风格的武器
- android - 如果某个字段等于某个值,有没有办法检查 Firestore 文档?
- android - 为什么 viewModel() 在 Activity 或 Fragment 中用于 Composabe 和 viewModels() ?