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
只需执行经典的调试步骤:打印您的组件以检查数学操作是否定义明确。
将您的函数修改为:
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 的最大值:
fit=opt.curve_fit(func,x,y,p0=x0,bounds=([x[-1]+0.001,0.0,1.00],[5.0,1.0,2.0]))
但是,在 gnuplot 中,拟合可能是 x > a。我不知道为什么。也许它正在取 func(x>a) 的实部,但我不知道这样做是否真的很简单。
我在用给定函数拟合一组值时遇到了一些问题: 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
只需执行经典的调试步骤:打印您的组件以检查数学操作是否定义明确。
将您的函数修改为:
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 的最大值:
fit=opt.curve_fit(func,x,y,p0=x0,bounds=([x[-1]+0.001,0.0,1.00],[5.0,1.0,2.0]))
但是,在 gnuplot 中,拟合可能是 x > a。我不知道为什么。也许它正在取 func(x>a) 的实部,但我不知道这样做是否真的很简单。