我有一个具有cosinus形状的数据集。我尝试用这个函数拟合这个数据集:
a.cos(b-psi)+c
我的目标是估算最适合我的数据的参数a,b和c。所以我尝试使用scipy.leastsq来最小化这个:data-a.cos(b-psi)+c
。
(psi与数据一起找到)。
我的首字母参数是ndarray x (x=np.array([a0,b0,c0]))
,我的数据存储在元组args=(psi,data)
中,我有我的功能:
def func(x, *args):
psi = args[0].ravel()
data = args[1].ravel()
return np.array(data - (x[0]*np.cos(x[1]-psi) + x[2]))
然后我使用以下行启动scipy.leastsq:
xopt = leastsq(coreg.func,x0,args,full_output=1)
(带初始参数:)
Out[30]: array([ 3.8, 1.3, 0. ])
但结果如下:
(array([ 3.8, 1.3, 0. ]),
None,
{'fjac': array([[ nan, nan, nan, ..., nan, nan, nan],
[ nan, nan, nan, ..., nan, nan, nan],
[ nan, nan, nan, ..., nan, nan, nan]]),
'fvec': array([-3.17913524, -2.19610415, -2.06748506, ..., 1.76355583,
2.32077375, 2.89394884]),
'ipvt': array([1, 2, 3], dtype=int32),
'nfev': 4,
'qtf': array([ nan, nan, nan])},
'The cosine of the angle between func(x) and any column of the\n Jacobian is at most 0.000000 in absolute value',
4)
我不知道为什么它无法计算雅可比行列式,我认为这就是为什么它给了我与我最初相同的参数。
如果它可以提供帮助,则每个对象的值都是:
Variable Type Data/Info
--------------------------------
args tuple n=2
np module <module 'numpy' from '/us<...>ages/numpy/__init__.pyc'>
psi ndarray 1201x1201: 1442401 elems, type `float64`, 11539208 bytes (11 Mb)
data ndarray 1201x1201: 1442401 elems, type `float64`, 11539208 bytes (11 Mb)
x ndarray 3: 3 elems, type `float64`, 24 bytes
答案 0 :(得分:0)
您的函数的雅可比矩阵易于分析写出。提供给最小呼叫。
答案 1 :(得分:0)
感谢您的回答!
所以我像这样进入jacobian? (抱歉,我是python的初学者)
def jacobi(x,*args):
psi = args[0].ravel()
target = args[1].ravel()
return -x[0]*np.sin(x[1]-psi)
但是这里有什么回来:
/usr/lib64/python2.7/site-packages/scipy/optimize/minpack.pyc in leastsq(func,
x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev,
epsfcn,factor,diag)
367 _check_func('leastsq', 'Dfun', Dfun, x0, args, n, (n,m))
368 else:
--> 369 _check_func('leastsq', 'Dfun', Dfun, x0, args, n, (m,n))
370 if (maxfev == 0):
371 maxfev = 100*(n + 1)
/usr/lib64/python2.7/site-packages/scipy/optimize/minpack.pyc in _check_func
(checker, argname, thefunc, x0, args, numinputs,
output_shape)
28 else:
29 msg += "."
---> 30 raise TypeError(msg)
31 if issubdtype(res.dtype, inexact):
32 dt = res.dtype
TypeError: leastsq: there is a mismatch between the input and output shape of the
'Dfun' argument 'jacob'.