回归分析中的最小二乘法

数据挖掘与机器学习 fireling 10832℃

在做回归分析时,求最佳拟合曲线通常采用最小二乘法来求解。最小二乘法是一种数学优化方法,它通过最小化误差的平方和来寻找数据的最佳函数匹配。

采用statsmodels进行回归分析

如果只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为线性回归,如Y=1+10X。

采用statsmodels进行线性回归分析,同时假设回归数据中存在误差项,其满足正态分布


'''Artificial data'''
## Y=1+10*X
nsample = 100
x = np.linspace(0, 10, nsample)
x_ = x
X = sm.add_constant(x_)
beta = np.array([1, 10])

'''Our model needs an intercept so we add a column of 1s'''
e = np.random.normal(size=nsample)
y_true = np.dot(X, beta)
y = y_true+e

'''Fit and summary'''
model = sm.OLS(y, X)
results = model.fit()
y_fitted = results.fittedvalues
print(results.summary())
print('Parameters: ', results.params)

'''Plot figure'''
fig, ax = plt.subplots(figsize=(8,6))
ax.plot(x, y, 'o', label='data')
ax.plot(x, y_true, 'b-', label='True')
ax.plot(x, y_fitted, 'r--.',label='OLS')
ax.legend(loc='best')
plt.show()

可以得到结果:


                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.999
Model:                            OLS   Adj. R-squared:                  0.999
Method:                 Least Squares   F-statistic:                 9.986e+04
Date:                Wed, 30 Aug 2017   Prob (F-statistic):          3.05e-149
Time:                        10:52:33   Log-Likelihood:                -133.16
No. Observations:                 100   AIC:                             270.3
Df Residuals:                      98   BIC:                             275.5
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const          0.9654      0.184      5.254      0.000         0.601     1.330
x1            10.0320      0.032    316.009      0.000         9.969    10.095
==============================================================================
Omnibus:                        7.078   Durbin-Watson:                   1.883
Prob(Omnibus):                  0.029   Jarque-Bera (JB):                6.548
Skew:                           0.583   Prob(JB):                       0.0379
Kurtosis:                       3.461   Cond. No.                         11.7
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
('Parameters: ', array([  0.96540594,  10.03203855]))

我们真实的系数是1和10,回归的系数是0.96540594和10.03203855,也就是回归曲线为Y=0.96540594+10.03203855*X。

figure_1

如果是非线性回归,如Y=1+0.1X+10X^2,也可以转换成线性回归的方式求解:


## Y=1+0.1*X+10*X^2
nsample = 100
x = np.linspace(0, 10, nsample)
x_ = np.column_stack((x, x**2))
X = sm.add_constant(x_)
beta = np.array([1, 0.1, 10])

figure_2

最小二乘法与极大似然估计

前面的线性回归分析中model.fit()函数采用了最小二乘法,通过最小化误差的平方和来计算拟合模型的参数。为什么会将误差的平方和作为线性回归分析的损失函数呢?

假设我们要拟合的平面:

0

自变量和因变量存在线性关系,除此之外,允许引入误差:

1

从概率的角度上讲,假设误差符合正态分布,则有:

2

求最佳的拟合模型,也就是需要寻找使得损失函数L(theta)最大的参数theta,这个损失函数也就是似然估计。如果所有的样本都是在独立同分布(Independent Identical Distribution, IID)的,极大似然估计认为,如果某个参数使得样本出现的概率最大,就把该参数作为估计的真实值。

3

对似然估计取对数,将“求积”转换成“求和”的形式:

4

因此,求解极大似然估计,转换为,求解最小化误差的平方和

5

对于误差的平方和,我们对其最小化的过程中,往往使用梯度下降法,而误差的平方和函数,恰恰方便了对参数的“求导”。因此,对于最小二乘法来说,将误差的平方和作为线性回归的损失函数是一个很自然而然的选择。

 

转载请注明:宁哥的小站 » 回归分析中的最小二乘法

喜欢 (12)