zoukankan      html  css  js  c++  java
  • 岭回归(Ridge Regression)

    一、一般线性回归遇到的问题

        在处理复杂的数据的回归问题时,普通的线性回归会遇到一些问题,主要表现在:

    • 预测精度:这里要处理好这样一对为题,即样本的数量和特征的数量
      • 时,最小二乘回归会有较小的方差
      • 时,容易产生过拟合
      • 时,最小二乘回归得不到有意义的结果
    • 模型的解释能力:如果模型中的特征之间有相互关系,这样会增加模型的复杂程度,并且对整个模型的解释能力并没有提高,这时,我们就要进行特征选择。

    以上的这些问题,主要就是表现在模型的方差和偏差问题上,这样的关系可以通过下图说明:

    (摘自:机器学习实战)

    方差指的是模型之间的差异,而偏差指的是模型预测值和数据之间的差异。我们需要找到方差和偏差的折中。

    二、岭回归的概念

        在进行特征选择时,一般有三种方式:

    • 子集选择
    • 收缩方式(Shrinkage method),又称为正则化(Regularization)。主要包括岭回归个lasso回归。
    • 维数缩减

        岭回归(Ridge Regression)是在平方误差的基础上增加正则项

    ,

    通过确定的值可以使得在方差和偏差之间达到平衡:随着的增大,模型方差减小而偏差增大。

        对求导,结果为

    令其为0,可求得的值:

    三、实验的过程

        我们去探讨一下取不同的对整个模型的影响。

    MATLAB代码

    主函数

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. %% 岭回归(Ridge Regression)  
    2.   
    3. %导入数据  
    4. data = load('abalone.txt');  
    5. [m,n] = size(data);  
    6.   
    7. dataX = data(:,1:8);%特征  
    8. dataY = data(:,9);%标签  
    9.   
    10. %标准化  
    11. yMeans = mean(dataY);  
    12. for i = 1:m  
    13.     yMat(i,:) = dataY(i,:)-yMeans;  
    14. end  
    15.   
    16. xMeans = mean(dataX);  
    17. xVars = var(dataX);  
    18. for i = 1:m  
    19.     xMat(i,:) = (dataX(i,:) - xMeans)./xVars;  
    20. end  
    21.   
    22. % 运算30次  
    23. testNum = 30;  
    24. weights = zeros(testNum, n-1);  
    25. for i = 1:testNum  
    26.     w = ridgeRegression(xMat, yMat, exp(i-10));  
    27.     weights(i,:) = w';  
    28. end  
    29.   
    30. % 画出随着参数lam  
    31. hold on  
    32. axis([-9 20 -1.0 2.5]);  
    33. xlabel log(lam);  
    34. ylabel weights;  
    35. for i = 1:n-1  
    36.     x = -9:20;  
    37.     y(1,:) = weights(:,i)';  
    38.     plot(x,y);  
    39. end  


    岭回归求回归系数的函数

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
      1. function [ w ] = ridgeRegression( x, y, lam )  
      2.     xTx = x'*x;  
      3.     [m,n] = size(xTx);  
      4.     temp = xTx + eye(m,n)*lam;  
      5.     if det(temp) == 0  
      6.         disp('This matrix is singular, cannot do inverse');  
      7.     end  
      8.     w = temp^(-1)*x'*y;  
      9. end  

    http://blog.csdn.net/google19890102/article/details/27228279

    数值计算方法的“稳定性”是指在计算过程中舍入误差是可以控制的。

    对于有些矩阵,矩阵中某个元素的一个很小的变动,会引起最后计算结果误差很大,这种矩阵称为“病态矩阵”。有些时候不正确的计算方法也会使一个正常的矩阵在运算中表现出病态。对于高斯消去法来说,如果主元(即对角线上的元素)上的元素很小,在计算时就会表现出病态的特征。

    回归分析中常用的最小二乘法是一种无偏估计。

    当X列满秩时,有

    X+表示X的广义逆(或叫伪逆)。

    当X不是列满秩,或者某些列之间的线性相关性比较大时,XTX的行列式接近于0,即XTX接近于奇异,计算(XTX)-1时误差会很大。此时传统的最小二乘法缺乏稳定性与可靠性。

    岭回归是对最小二乘回归的一种补充,它损失了无偏性,来换取高的数值稳定性,从而得到较高的计算精度。

    当XTX的行列式接近于0时,我们将其主对角元素都加上一个数k,可以使矩阵为奇异的风险大降低。于是:

         (I是单位矩阵)

    随着k的增大,B(k)中各元素bi(k)的绝对值均趋于不断变小,它们相对于正确值bi的偏差也越来越大。k趋于无穷大时,B(k)趋于0。b(k)随k的改变而变化的轨迹,就称为岭迹。实际计算中可选非常多的k值,做出一个岭迹图,看看这个图在取哪个值的时候变稳定了,那就确定k值了。

    X不满足列满秩,换句话就是说样本向量之间具有高度的相关性(如果每一列是一个向量的话)。遇到列向量相关的情形,岭回归是一种处理方法,也可以用主成分分析PCA来进行降维。

    http://www.cnblogs.com/zhangchaoyang 作者:Orisun

  • 相关阅读:
    Django各个文件中常见的模块导入
    js模板(template.js)实现页面动态渲染
    Netty 源码 Channel(一)概述
    Netty 源码 NioEventLoop(三)执行流程
    Netty 源码(一)Netty 组件简介
    Netty 源码(二)NioEventLoop 之 Channel 注册
    Java 算法(一)贪心算法
    Netty Reator(三)Reactor 模型
    Netty Reator(二)Scalable IO in Java
    Reactor 模型(一)基本并发编程模型
  • 原文地址:https://www.cnblogs.com/bnuvincent/p/6788896.html
Copyright © 2011-2022 走看看