繁体   English   中英

scipy.optimize误差幂函数

[英]scipy.optimize error power function

我很难用给定的函数拟合一组值:f(x)= const *(1-(x / a)** b)** c

我正在使用python 3.6.3和以下代码:

import numpy as np
import scipy.optimize as opt
from scipy.optimize import curve_fit

x=[0.,0.4,0.8,1.6,2.,2.4]
y=[0.09882902,0.07298427,0.05111438,0.01679405,0.00517385,0.00065633]

def func(x,a,b,c):
    return y[0] * ( 1 - (x/a)**b )**c

x0=np.array([2.0,0.9,1.5])
opt.curve_fit(func,x,y,p0=x0)

我收到以下错误消息:

RuntimeWarning: invalid value encountered in power
  return y[0] * ( 1 - (x/a)**b )**c
///: OptimizeWarning: Covariance of the parameters could not be estimated
  category=OptimizeWarning)

该问题似乎是由于最后一个指数而出现的,因为以下函数可以正常工作:

def func(x,a,b,c):
    return y[0] * ( 1 - (x/a)**b )*c

只需执行经典的调试步骤:打印组件以检查math-ops是否定义明确。

修改您的功能以:

def func(x,a,b,c):
    print(x/a)
    print((x/a)**b)
    print((1-(x/a)**b))

    result = y[0] * ( 1 - (x/a)**b )**c
    print(result)

    if not np.isfinite(result):
        assert False
    else:
        return result

您将看到:

[ 0.   0.2  0.4  0.8  1.   1.2]
[ 0.          0.23492379  0.43838329  0.81805215  1.          1.17831965]
[ 1.          0.76507621  0.56161671  0.18194785  0.         -0.17831965]
...-py:13: RuntimeWarning: invalid value encountered in power
  result = y[0] * ( 1 - (x/a)**b )**c
[ 0.09882902  0.06613655  0.04159532  0.00767017  0.                 nan]

在该乘幂不适用于该负值的地方,并引入了nan (在后面的步骤中可能会引入更多)。

备注:默认情况下,初始点应为全1(也易于打印)。

要解决此问题,取决于您实际要执行的操作(更改模型;使用范围,...)。

我找到了解决方案,谢谢Sascha。 当x> a时,该函数的确不确定。 为了克服这个问题,我将a的值约束为始终大于x的最大值:

适合= opt.curve_fit(FUNC,X,Y,P0 = X0,边界=([X [-1] +0.001,0.0,1.00],[5.0,1.0,2.0]))

但是,在gnuplot中,拟合可能找到x> a。 我不知道为什么。 也许它是func(x> a)的真正组成部分,但我不知道这样做是否真的很简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM