我试图找到一组数据的最佳多项式拟合。它计算一定程度的每个多项式拟合的 AIC,然后选择 AIC 最低的那个。据我所知(我可能错了)我发现的最低值 AIC 是最合适的。
在这里,我定义我的多项式:
def p2(xData,a0,a1,a2):
return a0 + a1 * xData + a2 * xData**2
def p3(xData,a0,a1,a2,a3):
return a0 + a1 * xData + a2 * xData**2 + a3 * xData**3
def p4(xData,a0,a1,a2,a3,a4):
return a0 + a1 * xData + a2 * xData**2 + a3 * xData**3 + a4 * xData**4
我计算 AIC 的函数:
def compute_AIC(yData,model,variables):
residual=yData-model
SSE=np.sum(residual**2)
return 2*variables-2*np.log(SSE)
我的拟合多项式的代码适合我的数据并选择最好的:
def polynom_best_fit(xData,yData):
print('Assessing if the best fit is higher order..')
AICS=[]
for i in [2,3,4]:
params=[]
params=poly.polyfit(xData,yData,i)
print(params)
if len(params) == 3:
model_p2=p2(xData,*params)
AICS.append(compute_AIC(yData,model_p2,3))
if len(params) == 4:
model_p3=p3(xData,*params)
AICS.append(compute_AIC(yData,model_p3,4))
if len(params) == 5:
model_p4=p4(xData,*params)
AICS.append(compute_AIC(yData,model_p4,5))
else:
continue
print(AICS)
best=np.where(AICS==min(AICS))
best_model=[]
for i in best:
if np.where(AICS==min(AICS))[0][0] == 0:
print('Second degree best fit')
print('with AIC =', min(AICS))
plt.plot(xData,model_p2,color='red')
plt.scatter(xData,yData)
plt.show()
return min(AICS)
if np.where(AICS==min(AICS))[0][0] == 1:
print('Third degree best fit')
print('with AIC =', min(AICS))
return min(AICS)
if np.where(AICS==min(AICS))[0][0] == 2:
print('Fourth degree best fit')
print('with AIC =', min(AICS))
return min(AICS)
else:
print('Error')
但是,当我使用需要拟合的代码执行此操作时,我得到:
它的 AIC 值低得令人不安。
对于分段线性回归显然看起来最适合的数据集,该函数创建了一个多项式,其 AIC 值低于我的分段线性回归,其 Rsquared 超过 0.99,但 AIC 约为 12。
这没有通过健全性检查,所以我一定在这里做错了什么。我认为也许我对多项式的定义或我定义计算 AIC 的函数的方式是错误的,或者仅仅是我对 AIC 告诉我的最佳拟合的理解是错误的。
也可能是这样的情况,即使我的分段回归往往具有非常好的 Rsquared 值,它们有大量的参数(断点 1、断点 2、slope1、slope2、slope3、offset1、offset2、offset3 - 制作 8 个参数或变量)这可能使多项式胜出,但我仍然怀疑我的代码是否说真话。