我有一些来自研究的数据(x
和y
坐标),我必须绘制它们并找到适合数据的最佳曲线。我的曲线是:
我能够找到最适合多项式的
while(i < 6):
coefs, val = poly.polyfit(x, y, i, full=True)
我取得最小化val
的学位。
当我必须符合幂律(我研究中最有可能)时,我不知道如何正确地做到这一点。这就是我所做的。我已将日志函数应用于所有x
和y
,并且我已尝试将其与线性多项式拟合。如果误差(val)低于之前尝试的其他多项式,我选择幂律函数(当然,如果线的m为负)。我对么?
现在我如何从y = mx + q
行开始重建我的幂律,以便用原始点绘制它?我还需要显示找到的功能。
我尝试过:
def power_law(x, m, q):
return q * (x**m)
使用
x_new = np.linspace(x[0], x[-1], num=len(x)*10)
y1 = power_law(x_new, coefs[0], coefs[1])
popt, pcov = curve_fit(power_law, x_new, y1)
但结果曲线不适合数据。
答案 0 :(得分:3)
如果你谷歌短语“曲线拟合”,我的网站是最高回报 - 所以我对这种事情有点了解。
我建议不要对数据进行任何记录或其他变换,因为scipy有一个非常适合这种类型拟合的非线性求解器。看看:
http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html
我在我的网站上使用scipy非线性求解器,它可以直接在线调整您的数据。尝试:
http://zunzun.com/Equation/2/Power/Standard%20Power/
并确保没有实验引入的偏移,例如DC偏移电压,请尝试:
http://zunzun.com/Equation/2/Power/Standard%20Power%20With%20Offset/
使用非线性拟合可能遇到的一个问题是为非线性求解器选择合适的起始参数集以进行迭代求精。 BSD许可的网站源代码使用遗传算法自动确定起点,因此您可能需要自己尝试。它附带了许多例子,包括一个适合数百个方程式并对其进行排名的“函数查找器” - 您也可以在线尝试。源代码位于Google Code Repository:
https://code.google.com/p/pyeq2/
或zipped和tgz'd源代码发布的链接位于网站每个页面的底部。
如果您有任何疑问,请直接与我联系,我将很乐意为您提供帮助。我喜欢这些东西。
James zunzun@zunzun.com