0

我试图找到一组数据的最佳多项式拟合。它计算一定程度的每个多项式拟合的 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 个参数或变量)这可能使多项式胜出,但我仍然怀疑我的代码是否说真话。

4

1 回答 1

0

从绘图关节到问题,表示的函数 y(x) 看起来像一个由三段组成的分段函数。

论文中给出了一个非常简单的方法(没有猜测的初始值,没有迭代演算):https ://fr.scribd.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf

这种分段线性函数的情况在 pp.29-30 中处理。报纸是法文的。相关页面的翻译如下:

在此处输入图像描述

在此处输入图像描述

由于没有给出数据,因此通过对OP发布的数字的扫描获得了近似数据。

结果是:

在此处输入图像描述

信息:

由于分段函数是非线性函数(甚至由线性段组成),因此全局回归的线性化基于积分方程:

在此处输入图像描述

有关更多说明,请参阅参考文档。

于 2019-08-19T10:30:42.507 回答