将曲线拟合到散点图的边缘

时间:2019-06-24 18:56:11

标签: python-3.x curve-fitting scatter-plot

我正在解决一个问题,该问题涉及计算适合散点图边缘的曲线方程,如下所示。这是一个明确定义的边缘,但是我需要精确的配合。

我最初尝试基于此脚本...

Fit a curve to the boundary of a scatterplot

...但是我对Python不够熟悉,无法通过阅读了解这段代码的构成,并且无法完全适应我的情况。

这就是我从该示例中尝试过的内容。此处的目标是将曲线建模为具有极限的指数增长,然后将曲线向下逐渐移向点。但是,这和scipy.optimize curve_fit似乎都无法为我提供精确拟合。

from math import e
model = lambda x, a, b: (a * (1 - (e ** (-b * x)))

def get_flipped(y_data, y_model):
    flipped = y_model - y_data
    flipped[flipped > 0] = 0
    return flipped

def flipped_resid(pars, x, y):
    y_model = model(x, *pars)
    flipped = get_flipped(y, y_model)
    resid = np.square(y + flipped - y_model)
    return np.nan_to_num(resid)

from scipy.optimize import leastsq
guesses =[100, 5]
fit_pars, flag = leastsq(func = flipped_resid, x0 = guesses,
                     args = (x_data, y_data))

Curve to be fit

我对Python(R本机)比较陌生,因此这里可能存在一些明显的错误,但是如何改善贴合度以使线条恰好位于边缘?

1 个答案:

答案 0 :(得分:0)

我沿边缘提取了数据点,为了适应它们,我必须向您的方程式添加偏移量-使其成为“ a *(1-(exp(-b * X)))+偏移量”,通过参数a = 9.9214258118219334E + 01,b = 4.2835994748526849849E + 00和偏移= -1.4428475065933015E + 00可以很好地拟合边缘。缺少补偿可能会导致您遇到困难。

plot