我正在尝试使用以下代码找到最合适的曲线:
popt, pcov = curve_fit(lambda t,a,b: a+b*np.log(t), data_list, noise_data, absolute_sigma=True)
返回的参数为[-51.90326506,13.77241918],即: y = -51.90326507 + 13.77241918 * log(x)
绘制在MatPlotLib上,结果如下:
但是,在Google图表上绘制的相同方程式如下:
Results plotted on Google's graph tool
我使用下面的代码生成最佳拟合曲线:
popt, pcov = curve_fit(lambda t,a,b: a+b*np.log(t), data_list, noise_data, absolute_sigma=True)
curvex=np.linspace(min(data_list), max(data_list))
p1 = popt[0]
p2 = popt[1]
curvey=(lambda x,c,m: m*np.log(x)+c)(curvex,p1,p2)
# plot data
plt.plot(data_list,noise_data,'x',label = 'Xsaved')
plt.plot(curvex,curvey,'r', linewidth=2, label = 'Model')
为什么存在这种差异? python是正确的还是Google的地图正确?
答案 0 :(得分:1)
这是因为默认情况下,谷歌图形使用日志到基数10
,但是numpy默认使用日志到基数e
。
通过使用numpy明确地使用日志登录到基础10
,我们可以重新创建google给我们的图:
import matplotlib.pyplot as plt
import numpy as np
a = -51.9
b = 13.8
x = np.linspace(0, 175000)
fig, ax = plt.subplots(1, 2, figsize=[10, 4])
# Use log to the base 10 to create google's plot
ax[0].plot(x, a + b*np.log10(x))
ax[0].set_title('Base 10 log (google default)')
# Log to the base e is the numpy default
ax[1].plot(x, a + b*np.log(x))
ax[1].set_title('Base e log (numpy default)')
fig.tight_layout()
这给了我以下情节: