使用三个参数最小化scipy中的函数将返回初始猜测

时间:2020-08-06 13:22:28

标签: python scipy minimize

一组坐标为xy的点看起来像this。我想在y = 0形式的- a - np.exp(-(x - b)/c)下面的区域中构造一条曲线,其中的条件为找到条件abc y = 0下面的点的百分比被该行和所涉及的函数包围。

我已经编写了以下代码来执行此操作,但是minimize函数给出了最初的猜测,因此我不知道自己缺少什么。

from scipy.optimize import minimize
import numpy as np

def enclosed_points(params):
    a, b, c = params
    den = (y < 0).sum()                   # Calculate the number of points with y coordinate below y0
    func = - a - np.exp(-(x - b)/c)       # Calculate the value of the function for each x
    num = ((y < 0) & (y > func)).sum()    # Calculate the number of points with y coordinate
                                          # below y0 and above the function
    return np.abs(num/den - 0.9)          # Return the absolute value of the difference between
                                          # the ratio of num and den and the target number (0.9)

initial_guess = [0.1, 0.2, 1]             # Dummy initial guess
result = minimize(enclosed_points, initial_guess)

编辑。 Here我以npy格式上传了整个数据的随机样本。

1 个答案:

答案 0 :(得分:0)

好吧,我尝试了一些不同的方法并更改了代码的某些部分:

def func(x, a, b, c):
    return - a - np.exp(-(x - b)/c)

def enclosed_points(params):
    a, b, c = params
    loss1 = y[np.argwhere( y > 0)]
    loss2 = loss1[np.argwhere( loss1 < func(x[np.argwhere( y > 0)], a, b, c) )]
    loss = ((loss2.sum() / len(y)) - 0.9)**2
    return loss

initial_guess = [-0.1, 0.2, 1]     
result = minimize(enclosed_points, initial_guess, method='SLSQP', options={'eps': 1e-2})

loss1和loss2的功能与您的损失函数相同,但是我将ab改为2的幂(因为在我看来,这是更常见的)(还基于另一个张贴在StackOverflow上;请尝试仔细阅读它们,并熟悉它们与此最小化器有关的问题)。但是,我认为主要的问题是您的问题是非凸的,并且method='SLSQP', options={'eps': 1e-2}函数尝试查找局部最小值。有关详细说明,请参见this帖子。 最后,我想说,以[-0.1,0.2,1]初始点,我可以找到一个解决方案(尝试对minimize使用不同的负值,也许您可​​以找到另一个解决方案:))

祝你好运