Python 基于AIC准则的逐步回归

Python 基于AIC准则的逐步回归,python,pandas,linear-regression,Python,Pandas,Linear Regression,我使用AIC标准在Python中进行逐步回归。我想识别函数y=2+3sinx+lnx,基函数为{1,x,x^2,…,cosx,sinx}。我已经完成了程序,但效果不太好,有人能告诉我为什么吗 n = 500 x = np.random.uniform(low=1, high=10, size=n) x1 = np.sort(x) e = np.random.normal(0, 0.5, n) y = 2+3*np.sin(x1)+np.log(x1) #noise y2 = y +e bas

我使用AIC标准在Python中进行逐步回归。我想识别函数y=2+3sinx+lnx,基函数为{1,x,x^2,…,cosx,sinx}。我已经完成了程序,但效果不太好,有人能告诉我为什么吗

n = 500
x = np.random.uniform(low=1, high=10, size=n)
x1 = np.sort(x)
e = np.random.normal(0, 0.5, n)
y = 2+3*np.sin(x1)+np.log(x1) #noise
y2 = y +e


basic_func = {'1': x1/x1,
              'x': x1,
              'x^2': x1**2,
              'x^3': x1**3,
              'x^4': x1**4,
              'sinx': np.sin(x1),
              'cosx': np.cos(x1),
              'tanx': np.tan(x1),
              'logx': np.log(x1)}
X = pd.DataFrame(basic_func,columns=['1','x', 'x^2', 'x^3', 'x^4', 'sinx', 'cosx', 'tanx', 'logx'])
X2 = X

k = len(X2.columns)
lr = LinearRegression()

while 1:
    aic = []
    if len(X2.columns) > 2:
        for i in range(k):
            lr.fit(X2.drop(X2.columns[i],axis=1).iloc[:], y2)
            y1 = lr.predict(X2.drop(X2.columns[i],axis=1).iloc[:])
            aic.append(n*np.log(1/n*np.sum((y2-y1)**2)) + 2 * (k-1))
    else:
        for i in range(k):
            lr.fit(X2.drop(X2.columns[i], axis=1).iloc[:].values.reshape(-1, 1), y2)
            y1 = lr.predict(X2.drop(X2.columns[i], axis=1).iloc[:].values.reshape(-1, 1))
            aic.append(n * np.log(1 / n * np.sum((y2 - y1) ** 2)) + 2 * (k-1))

  lr.fit(X2.iloc[:], y2)
    y3 = lr.predict(X2.iloc[:])
    aic.append(n * np.log(1 / n * np.sum((y2 - y3) ** 2)) + 2 * k)
    aic_min = min(aic)
    r = aic.index(aic_min)

    if aic[-1] == min(aic):
        break

    k = k-1
    X2 = X2.drop(X2.columns[r],axis=1)

欢迎来到SO!请详细说明“但效果不太好”。这是什么意思?不要让用户猜到你的问题是什么。是否有错误消息(如果有,请将其添加到您的问题中),输出是否不符合预期(如果有,请描述不匹配),…您是对的。所以问题是,10次中有9次它会返回大约5个函数,通常是x,x^2,x^3,x^4和sinx或tanx。但是正确的答案(sinx,logx)很少发生。