【问题标题】:Optimal parameters not found for my curve fitting找不到适合我的曲线拟合的最佳参数
【发布时间】:2017-01-21 05:31:50
【问题描述】:

您好,我在用 Python 拟合一些数据时遇到问题。我刚开始用 Python 拟合我的数据,所以我遇到了一些问题......这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import *
from numpy import linalg as LA
def f(x,a,b,c):
    return a*np.power(x,b)+c

x = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79])
y = np.array([7200,7925,8050,8200,8000,7550,7500,6800,6400,8150,6566,6280,6105,5963,5673,5495,5395,4800,4550,4558,4228,4087,3951,3817,3721,3612,3498,3416,3359,3269,3163,3241,2984,4475,2757,2644,2555,2600,3163,2720,2630,2543,2454,2441,2389,2339,2293,2261,2212,2180,2143,2450,2065,2032,1994,1960,1930,1897,1870,1838,1821,1785,1763,1741,1718,1689,1676,1662,1635,1635,1667,1633,1617,1615,1599,1581,1565,1547,1547])
params, extras = curve_fit(f, x, y)
plt.plot(x,y, 'o')
plt.plot(x, f(x, params[0], params[1], params[2]))
plt.title('Fit')
plt.legend(['data','fit'],loc='best')
plt.show()

实际上我想用函数f(x) = a*x^b + c 拟合我的数据,我正在寻找a、b 和c 的最佳值来拟合我的数据。

你知道哪里出了问题吗?

感谢您的帮助。

【问题讨论】:

  • 您对基础模型是幂律的信心如何?

标签: python python-2.7 numpy scipy curve-fitting


【解决方案1】:

三个注意事项:

  • 你的模型不是很好。
  • 它在 x=0 处发散:不要拿第一分。
  • 您必须给出初始参数估计值。

一个例子:

p0=[50000,-1,0]
x=x[10:]
y=y[10:]
params, cov = curve_fit(f, x, y,p0) #params=[3.16e+04  -5.83e-01  -1.00e+03]
plt.plot(x,y, 'o')
plt.plot(x, f(x, *params))
plt.title('Fit')
plt.legend(['data','fit'],loc='best')
plt.show()

您可以通过以下方式估计模型的质量

In [178]: np.sqrt(np.diag(cov))/params
Out[178]: array([ 0.12066005, -0.12537714, -0.53450057])

这表明对参数的误差估计大于10%。

【讨论】:

    【解决方案2】:

    问题在于您用于拟合的功能。考虑使用类似

    def f(x, a, b, c):
      return a*x + b*np.power(x, 2) + c
    

    编辑:不小心发布了原始功能,而不是我想要建议的功能。

    【讨论】:

    • 对不起,我的函数有什么区别:def f(x,a,b,c): return a*np.power(x,b)+c ?
    • @PaulHain 抱歉,我不小心再次发布了您的原始功能(一定是弄乱了我的外壳)。我更正了它并添加了我想首先建议的二阶多项式。
    猜你喜欢
    • 1970-01-01
    • 2020-12-06
    • 2016-07-25
    • 2011-01-31
    • 2019-03-31
    • 2017-03-31
    • 2022-11-23
    • 2018-06-04
    相关资源
    最近更新 更多