【发布时间】:2020-08-25 17:51:13
【问题描述】:
我正在尝试用指数函数拟合我的数据
import numpy as np
def exponentional(k, alpha, k0, c):
return k0 * np.exp(k *-alpha) + c
我使用了来自 scipy.optimize 的 curve_fit,
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
uniq_deg = [2,...,103,..,203,...,307,...,506]
normalized_deg_dist = [0.99,...,0.43,..0.12,..,0.04,..., 0.01]
popt, pcov = curve_fit(exponentional, uniq_deg, normalized_deg_dist,
p0 = [1,0.00001,1,1], maxfev = 6000)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.semilogy(uniq_deg, normalized_deg_dist, 'bo', label = 'Real data')
ax.semilogy(uniq_deg,[exponentional(d,*popt) for d in uniq_deg], 'r-', label = 'Fit')
ax.set_xlabel('Degree' )
ax.set_ylabel('1-CDF degree')
ax.legend(loc='best')
ax.set_title(f'Degree distribution in {city}')
plt.show()
导致:
看起来不太合适。
我哪里错了?
【问题讨论】:
-
我建议你使用 sklearn。它让一切变得简单。
-
你能发布数据集吗?此外,您可以尝试将模型转换为对数空间并在那里进行拟合(然后只是线性拟合);这有时可以帮助获得更好的结果。
-
@VinayakMikkal 很抱歉,但如果您从数学角度不明白出了什么问题,那么更改 python 包不是解决方案。
-
你好,玛丽亚姆,这可能非常合适。您正在拟合线性空间。因此,1 级的误差远比 10e-3 级的误差重要得多,尤其是当拟合确实检查了这些误差的平方时。因此,1e-2 以下的所有数据实际上都无关紧要。看来您的适合度设置为
c<0,这样您就可以在对数尺度上获得这种差异。您的模型是否真的需要c?它可以是负面的还是你能确定c>=0?请注意,如果您按照@Cleb 的建议将数据放入对数空间中,则可以更改加权对数。 -
这是一个巨大的数组。我应该在这里复制并粘贴吗? @Cleb
标签: python scipy curve-fitting