python - 拟合单指数衰减误差python
问题描述
我有两个数组会导致 df_intensity_01 与 df_time 的图。
df_time
[[ 0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170
180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350
360 370 380 390 400 410 420 430 440 450 460 470 480 490 500 510 520 530
540 550 560 570 580 590 600 610 620 630 640 650 660 670 680 690 700 710
720 730 740 750 760 770 780 790 800]]
df_intensity_01
[1. 0.98666909 0.935487 0.91008815 0.86347009 0.81356788
0.79591582 0.78624289 0.76503846 0.75105705 0.72333501 0.67815733
0.69481674 0.68321344 0.66108185 0.65859392 0.64047511 0.63100282
0.63605049 0.6248548 0.60341172 0.57538132 0.57952294 0.57901395
0.56353725 0.56164702 0.55901125 0.54833934 0.53271058 0.52880127
0.52268282 0.51111965 0.5067436 0.49988595 0.49689326 0.48888879
0.48247889 0.4790469 0.47320723 0.46156169 0.45921527 0.4592913
0.45104607 0.44445031 0.44618426 0.43893589 0.42988811 0.42887013
0.42842872 0.41952032 0.41286965 0.41392143 0.41175663 0.40432874
0.39645523 0.39813004 0.38932936 0.38264912 0.38094263 0.3855869
0.38378537 0.37570065 0.37573022 0.37550635 0.36941113 0.36502241
0.36607629 0.36624103 0.36163477 0.35550154 0.35627875 0.35421111
0.34858053 0.34767026 0.34967665 0.34818347 0.34007975 0.34139552
0.34017057 0.33732993 0.33320098]
我正在尝试将数据拟合到一个指数衰减函数,其中我提供了拟合的初始系数。
def func(x, a, b, c):
return a * np.exp(-b * x) + c
xdata = df_time
guess=[1,0.001,0]
ydata = df_intensity
plt.plot(xdata, ydata, 'b-', label='data')
popt, pcov = curve_fit(func, xdata, ydata,p0=guess)
popt
plt.plot(xdata, func(xdata, *popt), 'r-',
label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
plt.xlabel('x')
plt.ylabel('y')
我收到一个我真的不知道如何解决的错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
ValueError: object too deep for desired array
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-62-97bcc77fc6c7> in <module>
5 ydata = df_intensity
6 plt.plot(xdata, ydata, 'b-', label='data')
----> 7 popt, pcov = curve_fit(func, xdata, ydata,p0=guess)
8 popt
9
/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
749 # Remove full_output from kwargs, otherwise we're passing it in twice.
750 return_full = kwargs.pop('full_output', False)
--> 751 res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
752 popt, pcov, infodict, errmsg, ier = res
753 cost = np.sum(infodict['fvec'] ** 2)
/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag)
392 with _MINPACK_LOCK:
393 retval = _minpack._lmdif(func, x0, args, full_output, ftol, xtol,
--> 394 gtol, maxfev, epsfcn, factor, diag)
395 else:
396 if col_deriv:
error: Result from function call is not a proper array of floats.
解决方案
首先,您需要两个输入都是一维数组(只有一组大括号:)[ ]
。目前它看起来像是df_time
一个二维数组,这似乎是您发布的错误的来源。
然后,当您绘制数据时,请记住您需要为 的每个值x
评估函数,以便您的x
和y
数组的长度相同。您可以使用列表推导来做到这一点,记住将您的x
值转换为,float
以便您可以将它们传递给您的函数:
plt.plot(xdata, [func(float(x), *popt) for x in xdata], 'r-',
label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
整个工作代码如下所示:
df_time = ['0', '10', '20', '30', '40', '50', '60', '70', '80', '90', '100',
'110', '120', '130', '140', '150', '160', '170', '180', '190', '200',
'210', '220', '230', '240', '250', '260', '270', '280', '290', '300',
'310', '320', '330', '340', '350', '360', '370', '380', '390', '400',
'410', '420', '430', '440', '450', '460', '470', '480', '490', '500',
'510', '520', '530', '540', '550', '560', '570', '580', '590', '600',
'610', '620', '630', '640', '650', '660', '670', '680', '690', '700',
'710', '720', '730', '740', '750', '760', '770', '780', '790', '800']
df_intensity = ['1.', '0.98666909', '0.935487', '0.91008815', '0.86347009', '0.81356788',
'0.79591582', '0.78624289', '0.76503846', '0.75105705', '0.72333501', '0.67815733',
'0.69481674', '0.68321344', '0.66108185', '0.65859392', '0.64047511', '0.63100282',
'0.63605049', '0.6248548', '0.60341172', '0.57538132', '0.57952294', '0.57901395',
'0.56353725', '0.56164702', '0.55901125', '0.54833934', '0.53271058', '0.52880127',
'0.52268282', '0.51111965', '0.5067436', '0.49988595', '0.49689326', '0.48888879',
'0.48247889', '0.4790469', '0.47320723', '0.46156169', '0.45921527', '0.4592913',
'0.45104607', '0.44445031', '0.44618426', '0.43893589', '0.42988811', '0.42887013',
'0.42842872', '0.41952032', '0.41286965', '0.41392143', '0.41175663', '0.40432874',
'0.39645523', '0.39813004', '0.38932936', '0.38264912', '0.38094263', '0.3855869',
'0.38378537', '0.37570065', '0.37573022', '0.37550635', '0.36941113', '0.36502241',
'0.36607629', '0.36624103', '0.36163477', '0.35550154', '0.35627875', '0.35421111',
'0.34858053', '0.34767026', '0.34967665', '0.34818347', '0.34007975', '0.34139552',
'0.34017057', '0.33732993', '0.33320098']
from scipy.optimize import curve_fit
def func(x, a, b, c):
return a * np.exp(-b * x) + c
xdata = [float(x) for x in df_time]
guess=[1,0.001,0]
ydata = df_intensity
plt.plot(xdata, ydata, 'b-', label='data')
popt, pcov = curve_fit(func, xdata, ydata,p0=guess)
fig = plt.figure() # created a 2nd figure for 2nd plot
plt.plot(xdata, [func(float(x), *popt) for x in xdata], 'r-',
label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
plt.xlabel('x')
plt.ylabel('y');
推荐阅读
- php - PHP需要设置文件的大小
- python - 处理海量文件(每个 > 60GB)以将行从一个文件替换到另一个文件并写入新文件 Python
- python - 如何让 Tkinter 小部件使用“绑定”调用函数
- reactjs - TypeError:未定义不是对象(评估'_useContext.user')
- integration - localStack - 如何在 eventbridge 和 cloudwatch 之间集成?
- php - PDO->execute 返回的值与 odbc_exec 不同
- r - R tryCatch 但在出现警告的情况下保留表达式结果
- android - 如何加密滑翔缓存数据?
- javascript - 导入 Bootstrap 模式后下拉菜单不起作用
- node.js - AWS S3 预签名 POST 访问被拒绝