什么是线性回归?
线性回归是一种统计学和机器学习中常用的算法,用于建立一个自变量(输入变量)和因变量(输出变量)之间的线性关系模型。它的目标是通过寻找最佳拟合直线来预测或解释数据。线性回归可以应用于各种问题领域,如经济学、金融学、医学等。
基本假设
线性回归有以下基本假设:
1. 线性性:自变量和因变量之间存在一个线性关系。
2. 独立性:自变量之间相互独立,即不存在多重共线性。
3. 齐次性方差:残差在各自变量的取值上具有相同的方差。
4. 正态性:残差服从正态分布。
算法原理
线性回归的目标是找到一条直线,使得所有数据点到该直线的距离之和最小化。这个距离可以用残差的平方和来衡量,称为最小二乘法。通过最小二乘法,可以得到线性回归的参数估计。
公式推导
假设我们有m个样本,每个样本有n个自变量,表示为 X = [x1, x2, …, xn]^T (n维列向量)。对于每个样本,对应的因变量表示为 y,表示为 y = [y1, y2, …, ym]^T (m维列向量)。
我们的目标是找到一个权重向量 W = [w0, w1, …, wn]^T,使得预测值 y_hat 和实际值 y 的平方差最小。其中,预测值 y_hat 表示为 y_hat = XW。
使用最小二乘法,我们的目标是最小化损失函数 J(W),定义为:
$$J(W) = \frac{1}{2m} \sum_{i=1}^{m}(y_i – y_i^{hat})^2$$
为了最小化损失函数 J(W),我们需要对 W 求导,并将导数置为零,得到 W 的最佳估计值。
我们首先定义 X 的扩展矩阵 X’,其中包含一列用于表示截距。X’ 的维度为 m 行 (样本数),n+1 列 (自变量数+1),定义为:
$$X’ = [1, X]$$
其中的1表示截距,为了计算的方便。
我们的目标是找到 W’ = [w0, w1, …, wn],使得预测值 y_hat 和实际值 y 的平方差最小。其中,预测值 y_hat 表示为 y_hat = X’W’。
将 J(W) 对 W’ 求导并置零,可以得到最佳估计值 W’ 的闭式解 (closed-form solution),表示为:
$$W’ = (X’^T X’)^{-1} X’^T y$$
使用这个最佳估计值 W’,我们可以对新的样本进行预测。
计算步骤
- 准备数据集:准备包含自变量和因变量的数据集。
- 特征缩放:对自变量进行特征缩放,以防止某些变量的值过大对回归结果产生过大的影响。
- 扩展矩阵:将自变量矩阵 X 扩展为 X’,添加一列全为1的列。
- 计算最佳估计值:计算最佳估计值 W’ = (X’^T X’)^{-1} X’^T y。
- 预测:使用最佳估计值进行预测,计算预测值 y_hat = X’W’。
- 模型评估:评估模型的性能,可以使用均方差 (mean squared error) 等指标进行评估。
Python代码示例
下面是一个使用 Python 进行线性回归的示例,使用虚拟数据集生成样本并进行回归分析。
import numpy as np
import matplotlib.pyplot as plt
# 生成虚拟数据集
np.random.seed(0)
m = 100 # 样本数
X = np.linspace(0, 10, m).reshape(m, 1)
y = 2*X + np.random.randn(m, 1)
# 特征缩放
X_mean = np.mean(X)
X_std = np.std(X)
X_scaled = (X - X_mean) / X_std
# 扩展矩阵
X_extended = np.concatenate((np.ones((m, 1)), X_scaled), axis=1)
# 最佳估计值
W = np.linalg.inv(X_extended.T.dot(X_extended)).dot(X_extended.T).dot(y)
# 预测
y_hat = X_extended.dot(W)
# 绘制数据和拟合直线
plt.scatter(X, y, label='Data')
plt.plot(X, y_hat, color='red', label='Linear Regression')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.show()
代码细节解释
- 生成虚拟数据集:使用
np.linspace
生成 m 个样本点,表示为X
。然后,根据线性关系y = 2*X + 噪声
生成对应的因变量y
。这里的噪声使用np.random.randn
生成服从正态分布的随机数。 - 特征缩放:计算自变量
X
的均值和标准差,并进行特征缩放操作,得到X_scaled
。 - 扩展矩阵:使用
np.concatenate
将一列全为1的列添加到X_scaled
头部,得到X_extended
。 - 最佳估计值:使用
np.linalg.inv
计算X_extended
的逆矩阵,然后使用矩阵相乘的方式计算最佳估计值W
。 - 预测:使用
X_extended
和最佳估计值W
计算预测值y_hat
。 - 绘图:使用
plt.scatter
绘制原始数据点,使用plt.plot
绘制拟合直线,使用plt.xlabel
和plt.ylabel
设置坐标轴标签,使用plt.legend
显示图例,并使用plt.show
显示图形。
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/824205/
转载文章受原作者版权保护。转载请注明原作者出处!