簡體   English   中英

Scipy最小化-無法最小化目標函數

[英]Scipy Minimize - Unable to minimize objective function

我正在嘗試使用scipy minimise優化函數以找到rev_tot最大值。 這里obj_data是一個概率列表, prem是一個常數, inc可以采用任何實際值。 以下是我為目標函數編寫的代碼:

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

def objective(x,*args):

    prem = args[0]
    prob = args[1]
    inc = x[0]


    rev_tot = 0
    rev = 0
    del_p = 0.2*(1-np.exp(-2*(1-np.exp(-inc/400))))
    for i in range(len(prob)):
        rev = (prob[i]*(1+del_p)*prem) - inc
        rev_tot = rev_tot + rev
    return 1/rev_tot


prem = 3300
par = [0.9,0.1,0.5,0.4]
x0 = np.array([3]) # initial guess
solve = minimize(objective,x0,args=(prem,par),method='SLSQP')
solve.x

我想找到inc值,它將最小化1/rev_tot (從而最大化rev_tot 。當我調用時:

minimize(objective,x0,args=(prem,par),method='SLSQP')

該函數運行,但是solve.x初始值沒有變化。 我無法弄清楚為什么沒有發生最小化。

您的問題是由於您的return 1/rev_tot ,求解器必須處理極小的數字。 因此,x軸上的變化不能很好地反映在y值的變化中,並且求解器估計它已經收斂:

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

def objective(x,*args):

    prem = args[0]
    prob = args[1]
    inc = x[0]

    rev_tot = 0
    rev = 0
    del_p = 0.2*(1-np.exp(-2*(1-np.exp(-inc/400))))
    for i in range(len(prob)):
        rev = (prob[i]*(1+del_p)*prem) - inc
        rev_tot = rev_tot + rev
    return 1/rev_tot

prem = 3300
par = [0.9,0.1,0.5,0.4]
x0 = np.array([2]) # initial guess
solve = minimize(objective,x0,args=(prem,par),method='SLSQP')
x_min = solve.x
print(x_min)
#plot your function to visualize the outcome
x_func = np.linspace(1, 100, 1000)
y_func = []
for item in x_func:
    y_func.append((objective(np.asarray([item]), prem, par)))

y_min = objective(np.asarray([x_min]), prem, par)

plt.plot(x_func, y_func)
plt.plot(x_min, y_min, "ro")
plt.show()

輸出:

[2.]

在此處輸入圖片說明

解決方案1)
不同的求解器對某些問題的管理比其他解決方案要好。 將您的求解器更改為“ Nelder-Mead”。 輸出:

[63.07910156]

在此處輸入圖片說明

解決方案2)
使用求解器“ SLSQP”的返回值return 1000000/rev_tot擴大返回值。 輸出:

[63.07110511]

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM