簡體   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