[英]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.