首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Scipy curve_fit与分段函数结合使用

将Scipy curve_fit与分段函数结合使用
EN

Stack Overflow用户
提问于 2017-01-14 03:15:53
回答 2查看 4.1K关注 0票数 10

我收到了一个优化警告:

代码语言:javascript
复制
OptimizeWarning: Covariance of the parameters could not be estimated
                 category=OptimizeWarning)

当尝试使用scipy.optimize.curve_fit将分段函数拟合到我的数据时。这意味着没有发生拟合。我可以很容易地将抛物线拟合到我的数据中,并且我为curve_fit提供了我认为是很好的初始参数。下面是完整的代码示例。有人知道为什么curve_fit可能和np.piecewise相处不好吗?或者我犯了一个不同的错误?

代码语言:javascript
复制
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)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-14 04:36:48

这是类型的问题,您必须更改以下行,以便x以浮点数的形式给出:

代码语言:javascript
复制
x = np.array([-3, -2, -1, 0, 1, 2, 3]).astype(np.float)

否则,piecewise_linear可能最终会转换这些类型。

为了安全起见,您也可以将初始点放在这里:

代码语言:javascript
复制
popt_piecewise, pcov = curve_fit(piecewise_linear, x, y, p0=[0.1, 0.1, -5., 5.])
票数 9
EN

Stack Overflow用户

发布于 2017-01-14 04:54:41

为了完整性,我将指出拟合分段线性函数不需要np.piecewise:任何这样的函数都可以用绝对值构造,对每个弯道使用np.abs(x-x0)的倍数。下面的代码可以很好地拟合数据:

代码语言:javascript
复制
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值:

代码语言:javascript
复制
[ 8.90899998  5.828       2.74700002 -0.33399996  2.03499998  5.32
  8.60500002]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41641880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档