41 线性回归(下):如何使用最小二乘法进行效果验证?
41 线性回归(下):如何使用最小二乘法进行效果验证?
线性回归是机器学习中一个非常重要的算法,而最小二乘法是求解线性回归参数的核心方法。本文将通过具体的数学推导和Python代码实现,详细介绍如何使用最小二乘法进行线性回归效果验证。
基于最小二乘法的求解
假设有3条数据记录,每条记录包含2个自变量和1个因变量。假设这些变量之间存在线性关系,可以用以下线性方程表示:
$$
b_1·0+b_2·1=1.5 \
b_1·1-b_2·1=-0.5 \
b_1·2+b_2·8=14
$$
我们的目标是求解系数$b_1$和$b_2$,以便根据新的自变量值预测因变量值。由于实际数据集构成的方程组通常没有精确解,因此需要使用最小二乘法。根据最小二乘法的结论,系数矩阵$B$可以通过以下公式计算:
$$
B=(X'X)^{-1}X'Y
$$
首先计算矩阵$(X'X)^{-1}$。逆矩阵的求法是将系数矩阵$X$和单位矩阵$I$并列,然后对左侧矩阵进行高斯消元和回代,将左侧矩阵变为单位矩阵,右侧矩阵即为$X^{-1}$。
给定$X'X$矩阵后,可以按照上述方法求解$(X'X)^{-1}$。求得$(X'X)^{-1}$后,即可计算矩阵$B$:
最终求得系数矩阵为$[1, 1.5]$,即$b_1 = 1$,$b_2 = 1.5$。这是精确解,高斯消元法也能得到相同结果。
接下来,修改$y$值,使方程组没有精确解:
$$
b_1·0+b_2·1=1.4 \
b_1·1-b_2·1=-0.48 \
b_1·2+b_2·8=13.2
$$
使用最小二乘法求解,得到$b_1 = 0.938$,$b_2 = 1.415$。为了验证这个近似解的效果,计算预测值与观测值的误差:
通过比较随机修改系数后的误差,可以发现最小二乘法求得的系数确实使误差最小。
Python代码实现
使用Python numpy库实现最小二乘法:
from numpy import *
x = mat([[0,1],[1,-1],[2,8]])
y = mat([[1.4],[-0.48],[13.2]])
# 分别求出矩阵X'、X'X、(X'X)的逆
# 注意,这里的I表示逆矩阵而不是单位矩阵
print("X矩阵的转置X':\n", x.transpose())
print("\nX'点乘X:\n", x.transpose().dot(x))
print("\nX'X矩阵的逆\n", (x.transpose().dot(x)).I)
print("\nX'X矩阵的逆点乘X'\n", (x.transpose().dot(x)).I.dot(x.transpose()))
print("\n系数矩阵B:\n", (x.transpose().dot(x)).I.dot(x.transpose()).dot(y))
对比sklearn库中的线性回归结果:
import pandas as pd
from sklearn.linear_model import LinearRegression
df = pd.read_csv("/Users/shenhuang/Data/test.csv")
df_features = df.drop(['y'], axis=1) #Dataframe中除了最后一列,其余列都是特征,或者说自变量
df_targets = df['y'] #Dataframe最后一列是目标变量,或者说因变量
print(df_features, df_targets)
regression = LinearRegression().fit(df_features, df_targets) #使用特征和目标数据,拟合线性回归模型
print(regression.score(df_features, df_targets)) #拟合程度的好坏
print(regression.intercept_)
print(regression.coef_) #各个特征所对应的系数
其中,test.csv文件内容如下:
x_1,x_2,y
0,1,1.4
1,-1,-0.48
2,8,13.2
为了考虑截距项,需要修改方程组和矩阵$X$:
$$
b_0+b_1·0+b_2·1=1.4 \
b_0+b_1·1-b_2·1=-0.48 \
b_0+b_1·2+b_2·8=13.2
$$
修改后的矩阵$X$:
from numpy import *
x = mat([[1,0,1],[1,1,-1],[1,2,8]])
y = mat([[1.4],[-0.48],[13.2]])
print("\n系数矩阵B:\n", (x.transpose().dot(x)).I.dot(x.transpose()).dot(y))
得到结果:
系数矩阵B:
[[-0.01454545]
[ 0.94909091]
[ 1.41454545]]
这与sklearn库的结果一致。
总结
本文通过具体案例详细介绍了最小二乘法的计算过程,并通过Python代码进行了验证。最小二乘法不仅可以用于线性回归,还可以用于非线性回归,其核心思想是使误差最小。在实际应用中,需要关注决定系数R2,以判断数据是否适合使用线性模型。