python拟合回归分析

我在做拟合回归分析时出现了这个错误:
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的问题。

希望这些建议能够帮助你解决这个问题。

  • scipy.optimize.leastsq函数用于最小二乘法拟合,其中第一个参数是一个函数,它的输入是一个需要拟合的参数向量,输出是一个数值向量。这个错误提示信息告诉你,输入的参数向量长度为N=5,而输出的数值向量长度为M=4,这意味着输入的参数向量长度大于输出的数值向量长度,因此出现了"Improper input"的错误。
  • 这个错误可能是由于你调用scipy.optimize.leastsq函数时所传递的函数的输入和输出参数不匹配所造成的。你需要检查你调用scipy.optimize.leastsq函数时传递的函数(在这里是residSVI函数)的输入和输出参数是否匹配,并确保输入的参数向量长度小于输出的数值向量长度。
  • 你还可以尝试使用其他的拟合函数,比如scipy.optimize.curve_fit函数,它也可以用于最小二乘法拟合,并且更容易使用。你可以尝试使用这个函数来替代scipy.optimize.leastsq函数,看看能否解决这个问题。
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)