我试图确定最好的模型函数和参数用于真实的世界的数据。我有几个数据集,都表现出类似的指数衰减,我想计算每个数据集的拟合函数参数。
最大数据集在X轴上从1变化到约1,000,000,并且在y轴上从0变化到约10,000。
我是Numpy和Scipy的新手,所以我试着将这个问题的代码适应我的数据,但没有成功:fitting exponential decay with no initial guessing
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import scipy.optimize
x = np.array([ 1., 4., 9., 16., 25., 36., 49., 64., 81., 100., 121.,
144., 169., 196., 225., 256., 289., 324., 361., 400., 441., 484.,
529., 576., 625., 676., 729., 784., 841., 900., 961., 1024., 1089.,
1156., 1225., 1296., 1369., 1444., 1521., 1600., 1681., 1764., 1849., 1936.,
2025., 2116., 2209., 2304., 2401., 2500., 2601., 2704., 2809., 2916., 3025.,
3136., 3249., 3364., 3481., 3600., 3721., 3844., 3969., 4096., 4225., 4356.,
4489., 4624., 4761., 4943.])
y = np.array([3630., 2590., 2063., 1726., 1484., 1301., 1155., 1036., 936., 851., 778.,
714., 657., 607., 562., 521., 485., 451., 421., 390., 362., 336.,
312., 293., 279., 265., 253., 241., 230., 219., 209., 195., 183.,
171., 160., 150., 142., 134., 127., 120., 114., 108., 102., 97.,
91., 87., 83., 80., 76., 73., 70., 67., 64., 61., 59.,
56., 54., 51., 49., 47., 45., 43., 41., 40., 38., 36.,
35., 33., 31., 30.])
# Define the model function
def model_func(x, A, K, C):
return A * np.exp(-K * x) + C
# Optimise the curve
opt_parms, parm_cov = sp.optimize.curve_fit(model_func, x, y, maxfev=1000)
# Fit the parameters to the data
A, K, C = opt_parms
fit_y = model_func(x, A, K, C)
# Visualise the original data and the fitted function
plt.clf()
plt.title('Decay Data')
plt.plot(x, y, 'r.', label='Actual Data\n')
plt.plot(x, fit_y, 'b-', label='Fitted Function:\n $y = %0.2f e^{%0.2f t} + %0.2f$' % (A, K, C))
plt.legend(bbox_to_anchor=(1, 1), fancybox=True, shadow=True)
plt.show()
当我使用Python 2运行这段代码时。7(在Windows 7 64位上)我收到错误消息RuntimeWarning: overflow encountered in exp
。上图显示了函数不适合我的数据的问题。
我使用的模型函数是否适合我的数据?如果是这样,我如何更好地计算拟合函数参数,以便我可以将它们用于新数据?
1条答案
按热度按时间aiazj4mn1#
我想你需要把X数据的日志记录下来。这是我的二次对数方程y = a + B * np的图。log(x)+ c * np。log(x)**2”。所有1的scipy默认初始参数估计值。0对我来说很好,给出RMSE = 4。020和R平方= 0。9999.
更新:添加了Python图形拟合器