Python中的分段指数拟合

时间:2016-11-09 08:34:48

标签: python numpy

我正试图进行分段拟合,如图1所示:

enter image description here

以下是代码:

import numpy as np
from matplotlib import pyplot as plt
from scipy import optimize

def piecewise_linear(x, x0, y0, k1, k2):
    return np.piecewise(x, [x < x0], [lambda x: k1*np.power(x,k2), lambda x: y0])

x=np.arange(0.0,100.0,1.0)
y=piecewise_linear( x, 45.0, 2025.0, 1.0, 2.0)

popt , pcov = optimize.curve_fit(piecewise_linear, x, y)
tau = np.linspace(x[0], x[-1], 200)
perr = np.sqrt(np.diag(pcov))
print popt
print perr
print pcov
plt.plot(x, y, 'b+')
plt.plot(tau, piecewise_linear(tau, *popt),'r')
plt.loglog()
plt.show()
plt.close()

但是这给了我适合作为图。 2: enter image description here

无论我如何更改数据集,参数x0都固定为1。

我不知道我的代码有什么问题,我该如何纠正?

1 个答案:

答案 0 :(得分:1)

在您的optimize.curve_fit()中,您需要使用p0 = []为拟合指定一些初步猜测,您可以在p0输入初始猜测,其文档可以找到here }。

就您所提供的示例而言,您已经使用x0, y0, k1, k2的值来计算y,因此只需将这些值输入curve_fit

def piecewise_linear(x, x0, y0, k1, k2):
    return np.piecewise(x, [x < x0], [lambda x: k1*np.power(x,k2), lambda x: y0])

x=np.arange(0.0,100.0,1.0)
y=piecewise_linear( x, 45.0, 2025.0, 1.0, 2.0)

#insert the initial guesses into curve_fit below using p0 = [...]
popt , pcov = optimize.curve_fit(piecewise_linear, x, y, p0=[45, 2000, 1, 2])
tau = np.linspace(x[0], x[-1], 200)
perr = np.sqrt(np.diag(pcov))

print (popt)
print (perr)
print (pcov)

plt.plot(x, y, 'b+')
plt.plot(tau, piecewise_linear(tau, *popt),'r')
plt.loglog()
plt.show()

这给出了以下图表:

enter image description here