一组坐标为x
和y
的点看起来像this。我想在y = 0
形式的- a - np.exp(-(x - b)/c)
下面的区域中构造一条曲线,其中的条件为找到条件a
,b
和c
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格式上传了整个数据的随机样本。
答案 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
使用不同的负值,也许您可以找到另一个解决方案:))
祝你好运