问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

41 线性回归(下):如何使用最小二乘法进行效果验证?

创作时间:
2025-04-07 06:26:02
作者:
@小白创作中心

41 线性回归(下):如何使用最小二乘法进行效果验证?

引用
1
来源
1.
https://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80%E8%AF%BE/41%20%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%EF%BC%88%E4%B8%8B%EF%BC%89%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95%E8%BF%9B%E8%A1%8C%E6%95%88%E6%9E%9C%E9%AA%8C%E8%AF%81%EF%BC%9F.md

线性回归是机器学习中一个非常重要的算法,而最小二乘法是求解线性回归参数的核心方法。本文将通过具体的数学推导和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,以判断数据是否适合使用线性模型。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号