当前位置: 首页 > news >正文

【监督学习】岭回归算法步骤及matlab实现

岭回归算法

    • 岭回归算法
      • 1.算法步骤
      • 2.MATLAB 实现
      • 参考资料

岭回归算法

岭回归是一种用于解决线性回归中多重共线性问题的正则化方法。它通过在损失函数中加入 L2 正则化项(即权重的平方和),限制模型参数的大小,从而避免过拟合并提高模型的泛化能力。岭回归的损失函数为: J ( w ) = ∥ y − X w ∥ 2 2 + α ∥ w ∥ 2 2 J(\mathbf{w}) = \|\mathbf{y} - \mathbf{X}\mathbf{w}\|_2^2 + \alpha \|\mathbf{w}\|_2^2 J(w)=yXw22+αw22其中:

  • y \mathbf{y} y 是目标变量( n × 1 n × 1 n×1 向量);
  • X \mathbf{X} X 是特征矩阵( n × p n × p n×p 矩阵);
  • w \mathbf{w} w 是权重向量( p × 1 p×1 p×1 向量);
  • α \alpha α 是正则化参数(控制正则化强度)。

特点

  • L2正则化:通过在损失函数中加入权重参数的平方和(L2范数)作为惩罚项,控制模型复杂度;
  • 参数压缩:所有特征的权重会被均匀压缩,但不会完全为零,保留所有特征;
  • 处理多重共线性:通过正则化稳定参数估计,降低高共线性特征导致的方差;
  • 解析解存在:通过矩阵运算直接求解权重,公式为 w = ( X T X + α I ) − 1 X T y \mathbf{w} = (\mathbf{X}^T \mathbf{X} + \alpha \mathbf{I})^{-1} \mathbf{X}^T \mathbf{y} w=(XTX+αI)1XTy
  • 需标准化数据:正则化项对特征尺度敏感,需提前标准化特征以保证公平惩罚。

优势

  • 解决多重共线性:当特征高度相关时,普通线性回归的参数估计方差大,而岭回归通过正则化降低方差,提升稳定性;
  • 防止过拟合:正则化项限制模型复杂度,减少对噪声数据的敏感度,增强泛化能力;
  • 数值稳定性:加入 α I \alpha \mathbf{I} αI 确保矩阵可逆,即使原始 X T X \mathbf{X}^T \mathbf{X} XTX 是奇异矩阵(如特征数大于样本数);
  • 全局最优解:解析解直接通过矩阵运算获得,无需依赖迭代优化算法;
  • 贝叶斯解释:可视为贝叶斯线性回归的特例,权重服从高斯先验分布,正则化参数 α \alpha α 对应先验精度。

劣势

  • 无法特征选择:L2 正则化仅压缩权重但不将其置零,所有特征均保留,无法自动剔除无关特征(需结合其他方法筛选特征);
  • 依赖正则化参数 α \alpha α α \alpha α 需通过交叉验证或网格搜索调优,增加计算成本;选择不当可能导致欠拟合( α \alpha α 过大)或过拟合( α \alpha α 过小);
  • 对无关特征敏感:若数据中存在大量无关特征,正则化可能无法有效抑制其影响,模型性能可能劣于 Lasso 或弹性网络;
  • 计算复杂度:矩阵求逆的复杂度为 O ( p 3 ) O(p^3) O(p3) p p p 为特征数),特征维度极高时计算成本显著增加;
  • 假设线性关系:与普通线性回归一样,岭回归假设特征与目标变量间存在线性关系,对非线性关系建模能力有限。
指标岭回归 (Ridge)Lasso 回归
正则化类型L2 范数L1 范数
参数特性压缩权重,非稀疏解稀疏解(部分权重为零)
特征选择
多重共线性处理优秀一般
计算复杂度较高(需矩阵求逆)较低(可迭代优化)
适用场景高共线性数据高维数据且需特征选择

1.算法步骤

开始
数据准备
数据标准化
添加偏置项
初始化正则化参数 alpha
计算岭回归权重
模型预测
模型评估
是否选择最优 alpha?
交叉验证选择 alpha
使用最优 alpha 重新训练
输出当前模型
结束
  1. 数据准备

    • 目标:准备用于训练和测试的数据集。
    • 输入
      • 特征矩阵 X \mathbf{X} X n × p n×p n×p n n n 为样本数, p p p 为特征数)。
      • 目标变量 y y y n × 1 n×1 n×1)。
    • 输出:原始数据集 X \mathbf{X} X y y y
  2. 数据标准化

    • 目标:将特征和目标变量标准化,消除量纲影响。
    • 步骤
      • 对特征矩阵 X \mathbf{X} X 的每一列进行标准化: X i j = X i j − μ j σ j \mathbf{X}_{ij} = \frac{X_{ij} - \mu_j}{\sigma_j} Xij=σjXijμj其中 μ j \mu_j μj σ j \sigma_j σj 分别是第 j j j 列的均值和标准差。
      • 对目标变量 y y y 进行标准化: y i = y i − μ y σ y y_i = \frac{y_i - \mu_y}{\sigma_y} yi=σyyiμy
    • 输出:标准化后的 X \mathbf{X} X y y y
  3. 添加偏置项

    • 目标:在特征矩阵中添加一列全 1 的偏置项,用于拟合截距。
    • 步骤
      • X \mathbf{X} X 扩展为 [ 1 , X ] [\mathbf{1},\mathbf{X}] [1,X],其中 1 \mathbf{1} 1 n × 1 n×1 n×1 的全 1 列。
    • 输出:扩展后的特征矩阵 X ( n × ( p + 1 ) ) \mathbf{X} (n×(p+1)) X(n×(p+1))
  4. 初始化正则化参数 alpha

    • 目标:设置正则化参数 α α α 的初始值。
    • 步骤
      • 选择一个初始值(如 α = 1 α=1 α=1)。
      • 如果需要选择最优 α α α,可以定义一组候选值(如 logspace(-3, 3, 100))。
    • 输出:初始或候选的 α α α 值。
  5. 计算岭回归权重

    • 目标:通过解析解计算岭回归的权重向量 w \mathbf{w} w
    • 步骤
      • 计算岭回归的解析解: w = ( X T X + α I ) − 1 X T y \mathbf{w} = (\mathbf{X}^T \mathbf{X} + \alpha \mathbf{I})^{-1} \mathbf{X}^T \mathbf{y} w=(XTX+αI)1XTy其中 I \mathbf{I} I 是单位矩阵(注意不对偏置项正则化)。
    • 输出:权重向量 w ( ( p + 1 ) × 1 ) \mathbf{w}((p+1)×1) w((p+1)×1)
  6. 模型预测

    • 目标:使用训练好的权重对数据进行预测。
    • 步骤
      • 计算预测值: y ^ = X w \hat{y} = \mathbf{X} \mathbf{w} y^=Xw
    • 输出:预测值 y ^ \hat{y} y^​。
  7. 模型评估

    • 目标:评估模型的性能。
    • 步骤
      • 计算均方误差(MSE): MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2
      • 计算决定系数( R 2 R^2 R2): R 2 = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 R^2 = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{n} (y_i - \bar{y})^2} R2=1i=1n(yiyˉ)2i=1n(yiy^i)2
    • 输出:MSE 和 R 2 R^2 R2
  8. 是否选择最优 alpha

    • 目标:决定是否需要通过交叉验证选择最优的正则化参数 α α α
    • 步骤
      • 如果数据量较大或需要更精确的模型,选择“是”。
      • 如果仅需快速训练模型,选择“否”。
    • 输出:决策结果。
  9. 交叉验证选择 alpha

    • 目标:通过交叉验证选择最优的正则化参数 α α α
    • 步骤
      • 将数据集分为 k k k 折(如 k = 5 k=5 k=5)。
      • 对每个候选 α α α,计算 k k k 折交叉验证的平均 MSE。
      • 选择使 MSE 最小的 α α α
    • 输出:最优的 α α α
  10. 使用最优 alpha 重新训练

    • 目标:使用最优 α α α 重新训练模型。
    • 步骤
      • 使用最优 α α α 计算权重 w \mathbf{w} w
    • 输出:最终模型权重 w \mathbf{w} w
  11. 输出最终模型

    • 目标:保存或输出训练好的模型。
    • 步骤
      • 保存权重 w \mathbf{w} w 和最优 α α α
      • 输出模型性能(MSE 和 R 2 R^2 R2)。
    • 输出:最终模型及其性能。

2.MATLAB 实现

岭回归算法matlab实现结果①
岭回归算法matlab实现结果②
岭回归算法matlab实现结果③

%% 岭回归算法实现
clc; clear; close all;

%% 1. 数据准备
rng(42); % 固定随机种子
n = 100; % 样本数量
p = 10;  % 特征数量

% 生成特征矩阵 X(含多重共线性)
X = randn(n, p);
X(:, 3) = X(:, 1) + 0.5 * randn(n, 1); % 第3列与第1列高度相关
X(:, 5) = X(:, 2) - 0.3 * randn(n, 1); % 第5列与第2列高度相关

% 生成目标变量 y(线性关系 + 噪声)
true_weights = [3; -2; 1; 1.5; 0; 0; 3; 0; 0; 0]; % 真实权重(部分为0)
y = X * true_weights + randn(n, 1) * 2; % 添加噪声

% 标准化数据
X = zscore(X); % 标准化特征
y = zscore(y); % 标准化目标变量

% 添加偏置项
X = [ones(n, 1), X]; % 添加全1列

%% 2. 岭回归实现
alpha = 1; % 正则化参数
I = eye(p + 1); % 单位矩阵(注意维度)
I(1, 1) = 0;   % 不对偏置项正则化

% 计算岭回归权重
w = (X' * X + alpha * I) \ (X' * y);

% 提取权重(去掉偏置项)
weights = w(2:end);

%% 3. 模型评估
y_pred = X * w; % 预测值
mse = mean((y - y_pred).^2); % 均方误差
r2 = 1 - sum((y - y_pred).^2) / sum((y - mean(y)).^2); % 决定系数

fprintf('均方误差 (MSE): %.4f\n', mse);
fprintf('决定系数 (R²): %.4f\n', r2);

%% 4. 可视化结果
figure;

% 真实权重 vs 岭回归权重
subplot(1, 2, 1);
bar([true_weights, weights]);
legend('真实权重', '岭回归权重');
xlabel('特征索引');
ylabel('权重值');
title('权重对比');

% 预测值 vs 真实值
subplot(1, 2, 2);
scatter(y, y_pred, 'filled');
hold on;
plot([min(y), max(y)], [min(y), max(y)], 'r--', 'LineWidth', 2);
xlabel('真实值');
ylabel('预测值');
title('预测值 vs 真实值');
grid on;

%% 5. 正则化参数选择(交叉验证)
alphas = logspace(-3, 3, 100); % 正则化参数范围
mse_cv = zeros(size(alphas));

% 5折交叉验证
k = 5;
cv = cvpartition(n, 'KFold', k);

for i = 1:length(alphas)
    alpha = alphas(i);
    mse_fold = zeros(k, 1);
    
    for fold = 1:k
        % 划分训练集和验证集
        train_idx = cv.training(fold);
        test_idx = cv.test(fold);
        X_train = X(train_idx, :);
        y_train = y(train_idx);
        X_test = X(test_idx, :);
        y_test = y(test_idx);
        
        % 训练岭回归模型
        w_cv = (X_train' * X_train + alpha * I) \ (X_train' * y_train);
        y_pred_cv = X_test * w_cv;
        
        % 计算验证集MSE
        mse_fold(fold) = mean((y_test - y_pred_cv).^2);
    end
    
    % 平均MSE
    mse_cv(i) = mean(mse_fold);
end

% 选择最优 alpha
[best_mse, best_idx] = min(mse_cv);
best_alpha = alphas(best_idx);

fprintf('最优正则化参数 alpha: %.4f\n', best_alpha);
fprintf('交叉验证最小 MSE: %.4f\n', best_mse);

% 可视化交叉验证结果
figure;
semilogx(alphas, mse_cv, 'LineWidth', 2);
xline(best_alpha, 'r--', '最优 alpha', 'LineWidth', 1.5);
xlabel('正则化参数 alpha');
ylabel('交叉验证 MSE');
title('正则化参数选择');
grid on;

参考资料

[1] 岭回归|说人话的统计学_哔哩哔哩_bilibili
[2] 回归分析-岭回归_哔哩哔哩_bilibili

相关文章:

  • 网络编程---多客户端服务器
  • LCS算法(文本相似度计算)
  • springmvc 框架学习
  • 国思RDIF低代码快速开发框架 v6.2版本发布
  • 【Qt】Qt + Modbus 服务端学习笔记
  • 论数据结构
  • 基于单片机控制的电动汽车双闭环调速系统(论文+源码)
  • PowerShell 美化 增强教程
  • go语言中空结构体
  • [代码规范]1_良好的命名规范能减轻工作负担
  • golang+redis 实现分布式限流
  • 蓝桥杯 握手问题
  • 【C#高阶编程】—单例模式详解
  • MySQL性能优化,sql优化有哪些,数据库如何优化设计(二)
  • 【软件工程】08_结构化设计方法
  • Bash 脚本基础
  • numpy学习笔记15:模拟100次随机游走,观察平均行为
  • 数据处理专题(二)
  • vue2 el-table跨分页多选以及多选回显
  • Springboot的MultipartFile,获取不到inputStream
  • 黄宾虹诞辰160周年|一次宾翁精品的大集结
  • 王沪宁主持召开全国政协主席会议
  • 总书记考察的上海“模速空间”,是一个怎样的空间?
  • 当初没有珍惜巴特勒的热火,被横扫出局后才追悔莫及
  • 美财长称关税战升级的责任在中方,外交部:关税战、贸易战没有赢家
  • 国家发改委回应美加征关税:典型的单边主义霸凌做法