【问题标题】:How to fit data logarithmic in python?如何在python中拟合数据对数?
【发布时间】:2019-04-29 21:58:56
【问题描述】:

我一直在尝试拟合从一些模拟中获得的一些数据。从曲线来看,我猜对数拟合将是理想的。然而,曲线看起来很时髦。我也尝试过高阶多项式和 np.polyfit,但我都无法工作。 任何帮助将不胜感激!

from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt


xdata=[9.24104360013e-06, 4.72619458107e-06, 4.03957328857e-06, 9.78301182748e-06, 1.36994566431e-05, 1.16294573409e-05, 7.70899546232e-06, 2.72587766232e-06, 2.19089955631e-06, 5.34851640035e-06, 7.84434545123e-06, 7.6524185787e-06, 1.00592536363e-05, 6.08711035578e-07, 4.08259572135e-07, 5.74424798328e-07, 6.20036326494e-07, 4.34755225756e-06, 4.72832211908e-06, 1.25156011417e-06, 1.44996714816e-05, 3.79992166335e-06, 4.45935911838e-06, 6.6307841155e-06, 2.38540191336e-06, 9.4649801666e-07, 9.11518608157e-06, 3.1944675219e-06, 5.32674287313e-06, 1.48463901861e-05, 3.41127723277e-06, 3.40027150288e-06, 3.33064781566e-06, 2.12828505238e-06, 7.22565690506e-06, 7.86527964811e-06, 2.25791582571e-06, 1.94875869207e-05, 1.54712884424e-05, 5.82300791075e-06, 9.5783833758e-06, 1.89519143607e-05, 1.03731970283e-05, 2.53090894753e-05, 9.26047056658e-06, 1.05428610146e-05, 2.89162870493e-05, 4.78624726782e-05, 1.00005855557e-05, 6.88617910928e-05]

ydata=[0.00281616449359, 0.00257023004939, 0.00250030932407, 0.00284317789756, 0.00300158447316, 0.00291690879783, 0.00274898865728, 0.0023625485679, 0.0023018015629, 0.00259860025555, 0.00269155777824, 0.00265941197135, 0.0028073724168, 0.00192920496041, 0.00182900945464, 0.00191452746379, 0.00193227563253, 0.00253266811688, 0.00255961306471, 0.00212426145702, 0.00285906942634, 0.00247877245272, 0.0025348504727, 0.00269881922057, 0.00232270371493, 0.00204672286703, 0.00281306442303, 0.00241938445736, 0.00261083321385, 0.00287440363274, 0.00244324770882, 0.00244364989768, 0.00244593671433, 0.00228714406931, 0.00263301289418, 0.00269385915315, 0.0022968948347, 0.00313898537645, 0.00305650121575, 0.00265291893623, 0.00278748794063, 0.00312801724905, 0.00289450806538, 0.00313176225397, 0.00284010926578, 0.0028957865422, 0.00335438183977, 0.00360421739757, 0.00270734995952, 0.00377301191882]


plt.plot(xdata,ydata,'o')

x = np.array(xdata, dtype=float) #transform your data in a numpy array of floats 
y = np.array(ydata, dtype=float) #so the curve_fit can work

#def func(x,a,b,c):
#    return a*x**2+ b*x +c

def func(x,a,b):
    return a*np.log(x)+ b


popt, pcov = curve_fit(func, x, y)
plt.plot(x, func(x, *popt), label="Fitted Curve")
plt.show()

【问题讨论】:

  • 如果数据是对数的,您可以计算指数并尝试线性/多项式拟合。
  • 您只需要在绘制线条时对数据进行排序。使用plt.plot(sorted(x), func(sorted(x), *popt), label="Fitted Curve"); plt.legend()

标签: python matplotlib logarithm


【解决方案1】:

在绘图前排序x

x_sorted = np.sort(x)
plt.plot(x_sorted, func(x_sorted, *popt), label="Fitted Curve")
plt.show()

【讨论】:

  • 你也可以只用plt.plot(sorted(x), func(sorted(x), *popt), label="Fitted Curve")
  • @Sheldore sorted 是 python 标准函数,因此比 np.sort 慢一个数量级(至少在我的机器上)。此外,它返回一个列表,如果您进一步处理它,您需要再次将其转换回ndarray(仅用于绘图无关紧要)。最后,您调用了两次排序算法,效率较低(在这种情况下也无所谓)。一般来说,在使用ndarrays 时,应该尽量坚持纯numpy 函数。
  • 是的,至少对于这么小的列表并没有什么不同
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 2015-11-03
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 2016-11-07
相关资源
最近更新 更多