Python 2.7 当要拟合的参数之一为幂时,SciPy曲线拟合不起作用

Python 2.7 当要拟合的参数之一为幂时,SciPy曲线拟合不起作用,python-2.7,scipy,curve-fitting,Python 2.7,Scipy,Curve Fitting,我正在尝试使用SciPy curve_fit将数据拟合到用户定义的函数,该方法在拟合到具有固定幂次的函数(func1)时有效。但是,当函数包含一个幂作为要拟合的参数(func2)时,曲线拟合不起作用 如果我使用关键字p0提供参数的初始猜测,曲线拟合仍然不起作用。我不能使用bounds关键字,因为我拥有的SciPy版本没有它 该脚本说明了这一点: import scipy from scipy.optimize import curve_fit import sys print 'scipy v

我正在尝试使用SciPy curve_fit将数据拟合到用户定义的函数,该方法在拟合到具有固定幂次的函数(func1)时有效。但是,当函数包含一个幂作为要拟合的参数(func2)时,曲线拟合不起作用

如果我使用关键字p0提供参数的初始猜测,曲线拟合仍然不起作用。我不能使用bounds关键字,因为我拥有的SciPy版本没有它

该脚本说明了这一点:

import scipy
from scipy.optimize import curve_fit
import sys

print 'scipy version: ', scipy.__version__
print 'np.version:    ', np.__version__
print sys.version_info

def func1(x,a):
    return (x-a)**3.0 

def func2(x,a,b):  
    return (x-a)**b

x_train = np.linspace(0, 12, 50)
y       = func2(x_train, 0.5, 3.0)
y_train = y + np.random.normal(size=len(x_train))

print 'dtype of x_train: ', x_train.dtype
print 'dtype of y_train: ', y_train.dtype

popt1, pcov1 = curve_fit( func1, x_train, y_train, p0=[0.6] )
popt2, pcov2 = curve_fit( func2, x_train, y_train, p0=[0.6, 4.0] )

print 'Function 1: ', popt1, pcov1
print 'Function 2: ', popt2, pcov2
其输出如下:

scipy version:  0.14.0
np.version:     1.8.2
sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)
dtype of x_train:  float64
dtype of y_train:  float64
stack_overflow.py:14: RuntimeWarning: invalid value encountered in power
return (x-a)**b
Function 1:  [ 0.50138759] [[  3.90044196e-07]]
Function 2:  [ nan  nan] [[ inf  inf]
 [ inf  inf]]

(正如@xnx首先评论的那样,)第二个公式(其中指数
b
未知且被认为是实值)的问题是,在测试
a
b
的潜在值的过程中,需要评估
z**p
形式的数量,其中,
z
为负实数,
p
为非整数。该数量通常比较复杂,因此程序失败。例如,对于
x=0
和测试变量
a=0.5
b=4.1
,它保持
(x-a)**b=(-0.5)**4.1=0.0555+0.018j

,我猜
func2
在指数为分数时会因
x-a
的负值而跳起来。是否有一种方法可以更改模型(可能会偏移数据),使
x-a
更可能为正值?