一、线性回归算法简介
1. 基本概念
-
目标:通过线性模型拟合自变量(特征)与因变量(标签)之间的关系。
-
数学模型:
其中:
-
yy:预测值(因变量)
-
xixi:特征(自变量)
-
w0w0:截距项(偏置)
-
w1,w2,…,wnw1,w2,…,wn:回归系数(权重)
-
ϵϵ:误差项
-
2. 损失函数
-
均方误差(MSE):
-
m:样本数量
-
y(i):真实值
-
y^(i):预测值
-
3. 参数求解
-
最小二乘法:通过矩阵运算直接求解最优权重:
-
梯度下降:迭代优化权重以最小化损失函数:
-
α:学习率
-
二、Python代码示例
1. 使用NumPy手动实现线性回归
import numpy as np import matplotlib.pyplot as plt # 生成示例数据 np.random.seed(42) X = 2 * np.random.rand(100, 1) # 特征:100个样本,1个特征 y = 4 + 3 * X + np.random.randn(100, 1) # 标签:真实关系为 y=4+3x+噪声 # 添加偏置项(w0) X_b = np.c_[np.ones((100, 1)), X] # 最小二乘法求解权重 w = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) print("权重(最小二乘法):", w) # 输出示例:[4.215], [2.770] # 预测 X_new = np.array([[0], [2]]) X_new_b = np.c_[np.ones((2, 1)), X_new] y_predict = X_new_b.dot(w) # 可视化 plt.scatter(X, y, alpha=0.6) plt.plot(X_new, y_predict, "r-", linewidth=2, label="预测线") plt.xlabel("X") plt.ylabel("y") plt.legend() plt.show()
2. 使用Scikit-learn实现
from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # 创建模型 model = LinearRegression() # 训练模型(无需手动添加偏置项) model.fit(X, y) # 输出参数 print("截距(w0):", model.intercept_) # 示例:[4.215] print("权重(w1):", model.coef_) # 示例:[2.770] # 预测 y_pred = model.predict(X) # 评估 mse = mean_squared_error(y, y_pred) print("均方误差(MSE):", mse) # 示例:0.89
3. 梯度下降手动实现
# 定义梯度下降函数 def gradient_descent(X, y, learning_rate=0.1, n_iters=1000): m = X.shape[0] w = np.random.randn(2, 1) # 随机初始化权重 for _ in range(n_iters): gradients = 2/m * X.T.dot(X.dot(w) - y) w -= learning_rate * gradients return w # 运行梯度下降 w_gd = gradient_descent(X_b, y, learning_rate=0.1, n_iters=1000) print("权重(梯度下降):", w_gd) # 输出应与最小二乘法接近
三、关键知识点
1. 应用场景
-
房价预测(面积 vs 价格)
-
销量预测(广告投入 vs 销售额)
-
趋势分析(时间序列中的线性趋势)
2. 注意事项
-
特征缩放:若特征量纲差异大,需标准化(如使用
StandardScaler
)。 -
过拟合:线性回归不易过拟合,但特征过多时可考虑正则化(如岭回归)。
-
假设检验:通过R²分数、p值评估模型显著性。
3. 模型评估指标
-
均方误差(MSE):越小越好。
-
R²决定系数:越接近1表示模型解释力越强。
四、扩展:多项式回归
当数据关系非线性时,可通过添加多项式特征实现非线性拟合:
from sklearn.preprocessing import PolynomialFeatures # 生成非线性数据 X = 6 * np.random.rand(100, 1) - 3 y = 0.5 * X**2 + X + 2 + np.random.randn(100, 1) # 添加二次项 poly_features = PolynomialFeatures(degree=2, include_bias=False) X_poly = poly_features.fit_transform(X) # 训练模型 model = LinearRegression() model.fit(X_poly, y) # 预测并可视化 X_test = np.linspace(-3, 3, 100).reshape(-1, 1) X_test_poly = poly_features.transform(X_test) y_test = model.predict(X_test_poly) plt.scatter(X, y, alpha=0.6) plt.plot(X_test, y_test, "r-", label="多项式回归") plt.show()