[英]Using Scipy curve_fit with piecewise function
我收到了一个优化警告:
OptimizeWarning: Covariance of the parameters could not be estimated
category=OptimizeWarning)
当我尝试使用scipy.optimize.curve_fit
将我的分段函数拟合到我的数据scipy.optimize.curve_fit
。 意思是没有适合发生。 我可以轻松地将抛物线拟合到我的数据中,并且我正在为curve_fit
提供我认为良好的初始参数。 下面的完整代码示例。 有谁知道为什么curve_fit
可能与np.piecewise
不np.piecewise
? 还是我犯了一个不同的错误?
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
def piecewise_linear(x, x0, y0, k1, k2):
y = np.piecewise(x, [x < x0, x >= x0],
[lambda x:k1*x + y0-k1*x0, lambda x:k2*x + y0-k2*x0])
return y
def parabola(x, a, b):
y = a * x**2 + b
return y
x = np.array([-3, -2, -1, 0, 1, 2, 3])
y = np.array([9.15, 5.68, 2.32, 0.00, 2.05, 5.29, 8.62])
popt_piecewise, pcov = curve_fit(piecewise_linear, x, y, p0=[0.1, 0.1, -5, 5])
popt_parabola, pcov = curve_fit(parabola, x, y, p0=[1, 1])
new_x = np.linspace(x.min(), x.max(), 61)
fig, ax = plt.subplots()
ax.plot(x, y, 'o', ls='')
ax.plot(new_x, piecewise_linear(new_x, *popt_piecewise))
ax.plot(new_x, parabola(new_x, *popt_parabola))
ax.set_xlim(-4, 4)
ax.set_ylim(-2, 16)
这是类型的问题,你必须改变以下行,以便x
作为浮点数给出:
x = np.array([-3, -2, -1, 0, 1, 2, 3]).astype(np.float)
否则, piecewise_linear
可能最终会转换类型。
为了安全起见,您还可以将初始点浮动到此处:
popt_piecewise, pcov = curve_fit(piecewise_linear, x, y, p0=[0.1, 0.1, -5., 5.])
为了完整np.piecewise
,我将指出拟合分段线性函数不需要np.piecewise
:任何这样的函数都可以用绝对值构造,每个弯曲使用np.abs(x-x0)
的倍数。 以下内容非常适合数据:
def pl(x, x0, a, b, c):
y = a*np.abs(x-x0) + b*x + c
return y
popt_pl, pcov = curve_fit(pl, x, y, p0=[0, 0, 0, 0])
print(pl(x, *popt_pl))
输出接近原始y值:
[ 8.90899998 5.828 2.74700002 -0.33399996 2.03499998 5.32
8.60500002]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.