当前位置:  开发笔记 > 编程语言 > 正文

使用Scipy curve_fit和分段函数

如何解决《使用Scipycurve_fit和分段函数》经验,为你挑选了1个好方法。

我收到了一个优化警告:

OptimizeWarning: Covariance of the parameters could not be estimated
                 category=OptimizeWarning)

当我试图使用我的分段函数来适应我的数据scipy.optimize.curve_fit.意思是没有适合发生.我可以轻松地将抛物线拟合到我的数据中,并且我正在提供curve_fit我认为良好的初始参数.下面的完整代码示例.有谁知道为什么curve_fit可能不相处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)

在此输入图像描述



1> J. P. Peters..:

这是类型的问题,您必须更改以下行,以便将其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.])


我建议`x = np.array([ - 3,-2,-1,0,1,2,3],dtype = np.float)`它会立即告诉NumPy构造一个浮点数组,而不是构造一个整数数组然后转换类型.
推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有