使用曲线拟合进行常数因子的幂律处理

3

我希望用一个常数因子来拟合我的x和y数据的幂律关系。我的幂律模型是y(r) = F0 + F*(r)**alpha,其中F0是一个常数。我的代码如下:

x = [0.015000000000000001, 0.024999999999999998, 0.034999999999999996, 0.044999999999999998, 0.055, 0.065000000000000002, 0.075000000000000011, 0.085000000000000006, 0.094999999999999987, 0.125, 0.17500000000000002, 0.22500000000000003, 0.27500000000000002]

y= [5.6283727993522774, 4.6240796612752799, 3.7366642904247769, 3.0668203445969828, 2.5751865553847577, 2.0815063796430979, 1.7152655187581032, 1.4686235817532258, 1.2501921057958358, 0.80178306738561222, 0.43372429238424598, 0.26012305284446235, 0.19396186239328625]


def func(x,m,c,c0):
      return c0 + x**m * c

coeff,var=curve_fit(func,x,y)

print coeff


Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/scipy/optimize/minpack.py", line 511, in curve_fit
    raise RuntimeError(msg)
RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 800.

然后我将maxfev=2000更改为其他数值,结果得到了错误的系数值。如果我在func函数中将斜率m改为(-m),则可以得到正确的答案,但我的斜率将变为负值。有没有办法解决这个问题?

2个回答

6
问题在于curve_fit从默认猜测开始,对于参数而言太差(也就是说,它们都从1开始)。 相反地,利用你所知道的数据来进行一个粗略的猜测:至少,你知道m必须为负(因为这是一种幂律)。 因此,试着将m-1开始。(由于这些是合理的默认值,可以将截距项设置为0,斜率项设置为1)。
def func(x,m,c,c0):
    return c0 + x**m * c

coeff,var=curve_fit(func,x,y, p0=[-1, 1, 0])

这将为您提供正确的输出:
[-0.34815029  2.16546037 -3.4650323 ]

(请注意,您可以将m的起始数字设置为任何介于0-9之间的数字,它仍然会收敛到此结果。)

0

从您的数据来看,一个想法是重新调整您的问题,考虑到X和Y之间数量级的差异。

一个例子在第一篇帖子中详细说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接