首先,我们需要了解什么是正规方程。
接下来是代码展示,在Jupyter Notebook上实现。
#生成随机数据
import numpy as np # 导入numpy库 用于生成随机数据
X = 2 * np.random.rand(100, 1) # X 是一个 100 行 1 列的矩阵,取值范围在 0 到 2 之间
y = 4 + 3 * X + np.random.randn(100, 1) # y 是根据线性方程 y = 4 + 3X 加上一些噪声生成的
下面代码的 theta_best 是求解正规方程得来,方程式的每一部分也是一一对应。
#线性回归模型的最小二乘法求解过程
X_b = np.c_[np.ones((100, 1)), X]
# np.ones((100, 1)生成一个 100 行 1 列的全是 1 的矩阵
# np.c_[]用于按列拼接数组,在这里,它将一个全是 1 的矩阵和原来的 X 矩阵拼接在一起。
# X_b:生成的矩阵,它的形状是 (100, 2),第一列全是 1,第二列是原来的 X 值。
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
# X_b.T 是矩阵 X_b 的转置。 dot是 NumPy库中的一个函数,用于执行矩阵乘法。
# np.linalg.inv()函数用于计算矩阵 X_b.T.dot(X_b) 的逆矩阵。
>>> theta_best
# 求解正规方程,得到 theta_best,它是一个 2x1 的矩阵,包含了最佳拟合直线的参数。
#正规方程(Normal Equation)是一种用于求解线性回归模型参数的闭式解(closed-form solution)方法。它直接计算出线性回归模型的最优参数,而不需要使用迭代方法如梯度下降。
这里,我们就可以得到两个值。 不难看出我们期待的是θ0=4,θ1=3,而得到的是θ0=4.215,θ1=2.755。非常接近,但噪声的存在使其不可能完全还原为原本的函数。
#绘制线性回归模型的预测结果与实际数据点
import matplotlib.pyplot as plt # 导入 matplotlib.pyplot库,并将其命名为plt,用于绘图
plt.plot(X_new, y_predict, "r-") # 绘制预测的回归直线,并指定线的样式为红色实线。
plt.plot(X, y, "b.") # 绘制原始数据点,指定点的样式为蓝色圆点
plt.axis([0, 2, 0, 15]) # 设置图表的坐标轴范围,确保图表的x轴范围为0到2,y轴范围为0到15
plt.show() # 显示图表。
绘制模型的预测结果如图所示:
除此之外,还可以使用Scikit-Learn执行线性回归。
# 使用Scikit-Learn执行线性回归
>>> from sklearn.linear_model import LinearRegression
# LinearRegression是一个用于执行线性回归的类
>>> lin_reg = LinearRegression()
# 创建一个 LinearRegression 类的实例,命名为 lin_reg。这个实例将用于拟合数据和进行预测
>>> lin_reg.fit(X, y)
# 使用 fit 方法拟合线性回归模型。X 是输入特征矩阵。y 是目标值向量。
# 拟合过程会计算出最佳拟合直线的参数(截距和斜率)
>>> lin_reg.intercept_, lin_reg.coef_
#获取模型的截距(intercept)和斜率(coefficients)
>>> lin_reg.predict(X_new)
# 使用拟合好的线性回归模型对新的数据X_new进行预测。