我在做拟合回归分析时出现了这个错误:
Improper input: func input vector length N=5 must not exceed func output vector length M=4
我知道N是需要拟合的参数个数,M是样本个数,应该样本个数>参数个数。
但是不知道怎么改这个代码:
# Fit implied volatilities directly to obtain first guess on parameter vectors#
i=0
log('Calculating first guess on parameters ...')
for T in expirs:
i+=1
log('Fitting implied volatility on slice '+str(i)+', T='+str(T)+' ...')
chi.loc[T,:]=chi0(T)
chi.loc[T,:]=sp.optimize.leastsq(residSVI,list(chi.loc[T,:]),args=(T))[0]
log('Got parameters:',chi.loc[T,:])
log('Summary of initial guess for parameters:',chi)
###报错###:
Calculating first guess on parameters ...
Fitting implied volatility on slice 1, T=0.010958904 ...
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/var/folders/b0/hpy4bdl57x55slk98t7zwtk00000gn/T/ipykernel_1517/2592248678.py in
6 log('Fitting implied volatility on slice '+str(i)+', T='+str(T)+' ...')
7 chi.loc[T,:]=chi0(T)
----> 8 chi.loc[T,:]=sp.optimize.leastsq(residSVI,list(chi.loc[T,:]),args=(T))[0]
9 log('Got parameters:',chi.loc[T,:])
10 log('Summary of initial guess for parameters:',chi)
~/opt/anaconda3/lib/python3.9/site-packages/scipy/optimize/_minpack_py.py in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag)
412
413 if n > m:
--> 414 raise TypeError(f"Improper input: func input vector length N={n} must"
415 f" not exceed func output vector length M={m}")
416
TypeError: Improper input: func input vector length N=5 must not exceed func output vector length M=4
在调用scipy.optimize.leastsq函数时,第一个参数应该是求解的方程的函数,第二个参数应该是初始猜测的参数值的向量。第三个参数是一个元组,用于提供方程函数中需要的其他参数。
出现这个错误的原因是,函数residSVI的输入参数个数为5,但是你传递的初始猜测参数值的向量长度为4。因此,需要在调用函数之前将参数向量补充到长度为5。
下面是修改后的代码:
Fit implied volatilities directly to obtain first guess on parameter vectors#
i=0
log('Calculating first guess on parameters ...')
for T in expirs:
i+=1
log('Fitting implied volatility on slice '+str(i)+', T='+str(T)+' ...')
chi.loc[T,:]=chi0(T)
chi.loc[T,:]=sp.optimize.leastsq(residSVI,list(chi.loc[T,:]) + [0, 0], args=(T))[0]
log('Got parameters:',chi.loc[T,:])
log('Summary of initial guess for parameters:',chi)
希望这能帮到你!
这个错误提示说,拟合函数的输入向量长度N(即参数个数)不能超过拟合函数的输出向量长度M(即样本个数)。也就是说,你需要拟合的参数个数不能大于样本个数。
那么如何解决这个问题呢?首先,你需要确保你拟合的参数个数小于样本个数,或者你需要增加样本个数,使得样本个数大于参数个数。
如果你需要增加样本个数,你可以在residSVI函数中添加更多的样本数据。你也可以尝试使用更多的参数来拟合数据,这样你就可以使用更多的样本数据来拟合。
总之,要解决这个问题,你需要确保拟合函数的输入向量长度(即参数个数)小于拟合函数的输出向量长度(即样本个数)。
另外,你也可以尝试使用其他的最小二乘拟合函数,比如curve_fit函数。这个函数可以通过最小二乘法拟合函数的参数。你可以使用这个函数来代替leastsq函数,看看是否能够解决这个问题。
例如,你可以使用下面的代码来使用curve_fit函数进行拟合:
import scipy.optimize as optimize
# Fit implied volatilities directly to obtain first guess on parameter vectors#
i=0
log('Calculating first guess on parameters ...')
for T in expirs:
i+=1
log('Fitting implied volatility on slice '+str(i)+', T='+str(T)+' ...')
chi.loc[T,:]=chi0(T)
params, _ = optimize.curve_fit(residSVI, list(chi.loc[T,:]), args=(T))
chi.loc[T,:] = params
log('Got parameters:',chi.loc[T,:])
log('Summary of initial guess for parameters:',chi)
这样,你就可以使用curve_fit函数进行拟合,解决Improper input的问题。
希望这些建议能够帮助你解决这个问题。
import scipy.optimize as optimize
# Fit implied volatilities directly to obtain first guess on parameter vectors#
i=0
log('Calculating first guess on parameters ...')
for T in expirs:
i+=1
log('Fitting implied volatility on slice '+str(i)+', T='+str(T)+' ...')
chi.loc[T,:]=chi0(T)
params, _ = optimize.curve_fit(residSVI, list(chi.loc[T,:]), args=(T))
chi.loc[T,:] = params
log('Got parameters:',chi.loc[T,:])
log('Summary of initial guess for parameters:',chi)