python 为什么scipy的curve_fit提供的参数估计与TI-84的回归计算器不同?

t1qtbnec  于 2023-06-28  发布在  Python
关注(0)|答案(1)|浏览(132)

我在对一些数据进行幂律最佳拟合

  1. xdat = [0.117, 0.241, 0.782, 0.734, 1.275, 1.192, 1.483, 0.131, 0.279, 0.453, 1.128, 0.928, 2.197]
  2. ydat = [260.07, 85.82, 87.71, 124.57, 32.35, 80.5, 31.86, 55.36, 44.8, 27.28, 51.21, 53.77, 43.58]

和scipy.optimize的curve_fit函数

  1. def powlaw(x,a,b):
  2. return a*(x**b)
  3. popt, pcov = curve_fit(powlaw, xdat, ydat)

提供了以下结果:

  1. >>> popt
  2. array([51.96762158, -0.4920125 ])

对应于y ~ 52 x-0.49。
同时,我的TI-84(Plus C银Edition)计算器的PwrReg函数给出:

  1. y=a*x^b
  2. a=52.23979898
  3. b=-.308726274

对应于y 〜 52 x 〜 0.31。
对于我的目的来说,轻微的系数差异是可以接受的,但指数差异绝对不是。有什么想法吗

pdsfdshx

pdsfdshx1#

直接的“为什么”是因为TI正在执行对数误差拟合而不是线性误差拟合:

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from scipy.optimize import curve_fit
  4. xdat = np.array([0.117, 0.241, 0.782, 0.734, 1.275, 1.192, 1.483, 0.131, 0.279, 0.453, 1.128, 0.928, 2.197])
  5. ydat = np.array([260.07, 85.82, 87.71, 124.57, 32.35, 80.5, 31.86, 55.36, 44.8, 27.28, 51.21, 53.77, 43.58])
  6. order = xdat.argsort()
  7. xdat = xdat[order]
  8. ydat = ydat[order]
  9. def powlaw(x: np.ndarray, a: float, b: float) -> np.ndarray:
  10. return a * x**b
  11. def powlaw_log(x: np.ndarray, a: float, b: float) -> np.ndarray:
  12. return np.log(a) + b*np.log(x)
  13. popt_lin, _ = curve_fit(
  14. f=powlaw, xdata=xdat, ydata=ydat,
  15. )
  16. popt_log, _ = curve_fit(
  17. f=powlaw_log, xdata=xdat, ydata=np.log(ydat),
  18. )
  19. popt_ti = 52.23979898, -.308726274
  20. ax: plt.Axes
  21. right: plt.Axes
  22. fig, ax = plt.subplots()
  23. ax.plot(xdat, ydat, label='Experiment')
  24. ax.plot(xdat, powlaw(xdat, *popt_lin), label='Fit lin')
  25. ax.plot(xdat, powlaw(xdat, *popt_log), label='Fit log')
  26. ax.plot(xdat, powlaw(xdat, *popt_ti), label='Fit TI', linestyle='dashed')
  27. ax.legend()
  28. plt.show()

但是,由于您的数据在范围内变化不大(即使这是一个幂函数),因此没有明显的赢家。如果你有多个数量级,那将是一个不同的故事。

展开查看全部

相关问题