【发布时间】:2016-02-08 05:47:13
【问题描述】:
我正在尝试拟合形式的函数:
其中 A 和 B 是固定常数。在 scipy 中,我通常(并且我认为是相当规范的)处理此类问题的方法如下:
def func(t, coefs):
phase = np.poly1d(coefs)(t)
return A * np.cos(phase) + B
def fit(time, data, guess_coefs):
residuals = lambda p: func(time, p) - data
fit_coefs = scipy.optimize.leastsq(residuals, guess_coefs)
return fit_coefs
这行得通,但我想提供一个分析雅可比行列式来提高收敛性。因此:
def jacobian(t, coefs):
phase = np.poly1d(coefs, t)
the_jacobian = []
for i in np.arange(len(coefs)):
the_jac.append(-A*np.sin(phase)*(t**i))
return the_jac
def fit(time, data, guess_coefs):
residuals = lambda p: func(time, p) - data
jac = lambda p: jacobian(time, p)
fit_coefs = scipy.optimize.leastsq(residuals, guess_coefs,
Dfun=jac, col_deriv=True)
即使是 2 个或更少的订单,这也不起作用。使用 optimize.check_gradient() 进行快速检查也不会产生积极的结果。
我几乎可以肯定 Jacobian 和代码是正确的(尽管请纠正我)并且问题更根本:Jacobian 中的 t**i 项会导致溢出错误。这不是函数本身的问题,因为这里的单项式项乘以它们的系数,系数非常小。
我的问题是:
- 我在上面所做的事情在代码方面有问题吗?
- 还是有其他问题?
- 如果我的假设是正确的,有没有办法对拟合函数进行预处理,以便雅可比行列式表现更好?也许我可以拟合数据和时间的对数,或者其他什么。
谢谢!
编辑:忘记了原始函数形式中的正方形
【问题讨论】:
标签: python numpy scipy mathematical-optimization curve-fitting