一共两个部分,第一,线性模型和最小二乘估计方法的概括。第二,
基于最小二乘估计方法,实现线性回归方程中回归参数的估计。并且和statsmodels中的方法进行对比。
线性模型是指预测值是特征(feature)的线性组合(liner combination),数学表达式如下:
y i ^ = β 0 + β 1 x i 1 + . . . + β p x i p (1) \hat {y_i}= \beta_0 + \beta_1 x_{i1} + ... + \beta_p x_{ip} \tag{1} yi^=β0+β1xi1+...+βpxip(1)
y i = y ^ i + ϵ i (2) y_i = \hat y_i + \epsilon_i \tag{2} yi=y^i+ϵi(2)
i = 1 , 2 , . . . , n i=1,2,...,n i=1,2,...,n
其中:
y ^ \hat {y} y^是预测值(也叫因变量);
y y y是真实值;
β = ( β 1 , . . . , β p ) \beta = (\beta_1,..., \beta_p) β=(β1,...,βp)是系数coef_;
β 0 \beta_0 β0是截距intercept_;
x i 1 , . . . , x i p x_{i1},..., x_{ip} xi1,...,xip是第 i i i个样本点, 是 x x x的行向量;
ϵ i \epsilon_i ϵi是第 i i i个样本点估计的误差项。
普通最小二乘法拟合线性模型,本质上解决的是:
min β ∣ ∣ x β − y ∣ ∣ 2 2 \min_ {\beta} || x\beta-y || _2 ^ 2 βmin∣∣xβ−y∣∣22
其中:
β = ( β 1 , . . . , β p ) \beta = (\beta_1,..., \beta_p) β=(β1,...,βp)是回归系数coef_;
x = ( x 1 , . . . , x p ) x = (x_1,..., x_p) x=(x1,...,xp)是 x x x的列向量,也叫自变量;
y = ( y 1 , y 2 , . . . , y p ) y = (y_1,y_2,...,y_p) y=(y1,y2,...,yp)是样本观测值(也叫自变量);
线性回归模型基本假设:
{ E ( ϵ i ) = 0 v a r ( ϵ i ) = σ 2 c o v ( ϵ i , ϵ j ) = 0 \left\{ \begin{aligned} E(\epsilon_i) & = &0 \\ var(\epsilon_i) & = & \sigma^2 \\ cov(\epsilon_i, \epsilon_j)& = & 0 \end{aligned} \right. ⎩⎪⎨⎪⎧E(ϵi)var(ϵi)cov(ϵi,ϵj)===0σ20
其中, i ≠ j , i = 1 , 2 , . . . , n ; j = 1 , 2 , . . . , n i\neq j,i=1,2,...,n;j=1,2,...,n i=j,i=1,2,...,n;j=1,2,...,n
也就是说如果自变量 x i x_i xi与 x j x_j xj的相关时,最小二乘法的估计值会对自变量X中的随机误差极其敏感,会产生很大的方差。在没有实验设计就进行数据收集,很容易在自变量之间产生多重共线问题。
经验回归系数 β ^ \hat\beta β^的最小二乘估计
β ^ = ( X T X ) − 1 X T y \hat\beta = (X^TX)^{-1}X^Ty β^=(XTX)−1XTy
X ∈ R 1 × n , β ∈ R n × 1 , y ∈ R n × 1 X \in R^{1\times n},\beta \in R^{n\times 1},y \in R^{n\times 1} X∈R1×n,β∈Rn×1,y∈Rn×1
标准回归系数 β j ∗ \beta_j^* βj∗(对自变量因变量进行过标准化)和经验回归系数 β ^ j \hat\beta_j β^j(对自变量因变量没有进行过标准化)之间的关系:
β j ∗ = s t d ( X ) s t d ( y ) β ^ j , j = 1 , 2 , . . . , p \beta_j^* = \frac{std(X)}{std(y)}\hat\beta_j ,\space j = 1,2,...,p βj∗=std(y)std(X)β^j, j=1,2,...,p
有了标准回归系数之后,各个自变量之间的相对重要性就可以比较了。
下面是代码实现最小二乘方法估计回归参数:标准回归系数 β j ∗ \beta_j^* βj∗和经验回归系数 β ^ j \hat\beta_j β^j
def Beta_linear_model(X,y):
"""最小二乘方法估计线性回归方程的回归参数
输入:X,没有标准化后的(自变量+常数项,且第一列是常数项)。
y, 没有标准化后的因变量。
返回:标准回归系数和经验回归系数。
"""
# 转化成numpy数组
X = np.array(X)
y = np.array(y)
# 标准化X,y
X_std = (X - X.mean())/X.std()
y_std = (y - y.mean())/y.std()
# 计算标准回归系数
a = np.linalg.inv(np.dot(X_std.T, X_std))
b = np.dot(X_std.T, y_std)
beta_std = np.dot(a,b)
# 计算经验回归系数
beta = beta_std*y.std()/X.std()
beta[0] = (y - np.dot(X[:,1:],beta[1:])).mean()
return beta_std,beta
下面通过人工生成一组数据来看看上面代码的回归参数估计情况:
import numpy as np
nsample = 100
# 人工生成数据一组二元不共线的数据,并且带有一组常数项。
x = np.linspace(0, 10, nsample)
X = np.column_stack((x, x**2))
beta = np.array([1, 0.1, 10])
e = np.random.normal(size=nsample)
X = sm.add_constant(X)
y = np.dot(X, beta) + e
# 估计回归参数
print(Beta_linear_model(X, y))
结果是:
(array([1.25358906, 0.00597212, 0.75249024]),
array([1.24744675, 0.07934234, 9.99717462]))
第一组数组是标准回归系数,第二组是经验回归系数,比较接近设置的beta参数[1, 0.1, 10], 这里值得注意的地方,回归方程的预测值是预测结果的平均值,而不是真实结果的确切值。回归一词指的就是平均值,又称为数学期望。
下面通过statsmodels中的简单最小二乘来验证上述结果。
# 最小二乘拟合线性回归方程,y,X也没有进行标准化
model = sm.OLS(y, X)
results = model.fit()
print(results.summary())
结果见下图:
对比statsmodels中回归系数[1.2474,0.0793, 9.9972]和[1.24744675, 0.07934234, 9.99717462]一样,所以,Beta_linear_model()函数成功实现了最小二乘方法估计回归参数。
[1]何晓群,刘文卿.应用回归分析(第三版)[M].中国人民大学出版社