zoukankan      html  css  js  c++  java
  • MATLAB实现多元线性回归预测

    一、简单的多元线性回归:

    data.txt

    1,230.1,37.8,69.2,22.1
    2,44.5,39.3,45.1,10.4
    3,17.2,45.9,69.3,9.3
    4,151.5,41.3,58.5,18.5
    5,180.8,10.8,58.4,12.9
    6,8.7,48.9,75,7.2
    7,57.5,32.8,23.5,11.8
    8,120.2,19.6,11.6,13.2
    9,8.6,2.1,1,4.8
    10,199.8,2.6,21.2,10.6
    11,66.1,5.8,24.2,8.6
    12,214.7,24,4,17.4
    13,23.8,35.1,65.9,9.2
    14,97.5,7.6,7.2,9.7
    15,204.1,32.9,46,19
    16,195.4,47.7,52.9,22.4
    17,67.8,36.6,114,12.5
    18,281.4,39.6,55.8,24.4
    19,69.2,20.5,18.3,11.3
    20,147.3,23.9,19.1,14.6
    21,218.4,27.7,53.4,18
    22,237.4,5.1,23.5,12.5
    23,13.2,15.9,49.6,5.6
    24,228.3,16.9,26.2,15.5
    25,62.3,12.6,18.3,9.7
    26,262.9,3.5,19.5,12
    27,142.9,29.3,12.6,15
    28,240.1,16.7,22.9,15.9
    29,248.8,27.1,22.9,18.9
    30,70.6,16,40.8,10.5
    31,292.9,28.3,43.2,21.4
    32,112.9,17.4,38.6,11.9
    33,97.2,1.5,30,9.6
    34,265.6,20,0.3,17.4
    35,95.7,1.4,7.4,9.5
    36,290.7,4.1,8.5,12.8
    37,266.9,43.8,5,25.4
    38,74.7,49.4,45.7,14.7
    39,43.1,26.7,35.1,10.1
    40,228,37.7,32,21.5
    41,202.5,22.3,31.6,16.6
    42,177,33.4,38.7,17.1
    43,293.6,27.7,1.8,20.7
    44,206.9,8.4,26.4,12.9
    45,25.1,25.7,43.3,8.5
    46,175.1,22.5,31.5,14.9
    47,89.7,9.9,35.7,10.6
    48,239.9,41.5,18.5,23.2
    49,227.2,15.8,49.9,14.8
    50,66.9,11.7,36.8,9.7
    51,199.8,3.1,34.6,11.4
    52,100.4,9.6,3.6,10.7
    53,216.4,41.7,39.6,22.6
    54,182.6,46.2,58.7,21.2
    55,262.7,28.8,15.9,20.2
    56,198.9,49.4,60,23.7
    57,7.3,28.1,41.4,5.5
    58,136.2,19.2,16.6,13.2
    59,210.8,49.6,37.7,23.8
    60,210.7,29.5,9.3,18.4
    61,53.5,2,21.4,8.1
    62,261.3,42.7,54.7,24.2
    63,239.3,15.5,27.3,15.7
    64,102.7,29.6,8.4,14
    65,131.1,42.8,28.9,18
    66,69,9.3,0.9,9.3
    67,31.5,24.6,2.2,9.5
    68,139.3,14.5,10.2,13.4
    69,237.4,27.5,11,18.9
    70,216.8,43.9,27.2,22.3
    71,199.1,30.6,38.7,18.3
    72,109.8,14.3,31.7,12.4
    73,26.8,33,19.3,8.8
    74,129.4,5.7,31.3,11
    75,213.4,24.6,13.1,17
    76,16.9,43.7,89.4,8.7
    77,27.5,1.6,20.7,6.9
    78,120.5,28.5,14.2,14.2
    79,5.4,29.9,9.4,5.3
    80,116,7.7,23.1,11
    81,76.4,26.7,22.3,11.8
    82,239.8,4.1,36.9,12.3
    83,75.3,20.3,32.5,11.3
    84,68.4,44.5,35.6,13.6
    85,213.5,43,33.8,21.7
    86,193.2,18.4,65.7,15.2
    87,76.3,27.5,16,12
    88,110.7,40.6,63.2,16
    89,88.3,25.5,73.4,12.9
    90,109.8,47.8,51.4,16.7
    91,134.3,4.9,9.3,11.2
    92,28.6,1.5,33,7.3
    93,217.7,33.5,59,19.4
    94,250.9,36.5,72.3,22.2
    95,107.4,14,10.9,11.5
    96,163.3,31.6,52.9,16.9
    97,197.6,3.5,5.9,11.7
    98,184.9,21,22,15.5
    99,289.7,42.3,51.2,25.4
    100,135.2,41.7,45.9,17.2
    101,222.4,4.3,49.8,11.7
    102,296.4,36.3,100.9,23.8
    103,280.2,10.1,21.4,14.8
    104,187.9,17.2,17.9,14.7
    105,238.2,34.3,5.3,20.7
    106,137.9,46.4,59,19.2
    107,25,11,29.7,7.2
    108,90.4,0.3,23.2,8.7
    109,13.1,0.4,25.6,5.3
    110,255.4,26.9,5.5,19.8
    111,225.8,8.2,56.5,13.4
    112,241.7,38,23.2,21.8
    113,175.7,15.4,2.4,14.1
    114,209.6,20.6,10.7,15.9
    115,78.2,46.8,34.5,14.6
    116,75.1,35,52.7,12.6
    117,139.2,14.3,25.6,12.2
    118,76.4,0.8,14.8,9.4
    119,125.7,36.9,79.2,15.9
    120,19.4,16,22.3,6.6
    121,141.3,26.8,46.2,15.5
    122,18.8,21.7,50.4,7
    123,224,2.4,15.6,11.6
    124,123.1,34.6,12.4,15.2
    125,229.5,32.3,74.2,19.7
    126,87.2,11.8,25.9,10.6
    127,7.8,38.9,50.6,6.6
    128,80.2,0,9.2,8.8
    129,220.3,49,3.2,24.7
    130,59.6,12,43.1,9.7
    131,0.7,39.6,8.7,1.6
    132,265.2,2.9,43,12.7
    133,8.4,27.2,2.1,5.7
    134,219.8,33.5,45.1,19.6
    135,36.9,38.6,65.6,10.8
    136,48.3,47,8.5,11.6
    137,25.6,39,9.3,9.5
    138,273.7,28.9,59.7,20.8
    139,43,25.9,20.5,9.6
    140,184.9,43.9,1.7,20.7
    141,73.4,17,12.9,10.9
    142,193.7,35.4,75.6,19.2
    143,220.5,33.2,37.9,20.1
    144,104.6,5.7,34.4,10.4
    145,96.2,14.8,38.9,11.4
    146,140.3,1.9,9,10.3
    147,240.1,7.3,8.7,13.2
    148,243.2,49,44.3,25.4
    149,38,40.3,11.9,10.9
    150,44.7,25.8,20.6,10.1
    151,280.7,13.9,37,16.1
    152,121,8.4,48.7,11.6
    153,197.6,23.3,14.2,16.6
    154,171.3,39.7,37.7,19
    155,187.8,21.1,9.5,15.6
    156,4.1,11.6,5.7,3.2
    157,93.9,43.5,50.5,15.3
    158,149.8,1.3,24.3,10.1
    159,11.7,36.9,45.2,7.3
    160,131.7,18.4,34.6,12.9
    161,172.5,18.1,30.7,14.4
    162,85.7,35.8,49.3,13.3
    163,188.4,18.1,25.6,14.9
    164,163.5,36.8,7.4,18
    165,117.2,14.7,5.4,11.9
    166,234.5,3.4,84.8,11.9
    167,17.9,37.6,21.6,8
    168,206.8,5.2,19.4,12.2
    169,215.4,23.6,57.6,17.1
    170,284.3,10.6,6.4,15
    171,50,11.6,18.4,8.4
    172,164.5,20.9,47.4,14.5
    173,19.6,20.1,17,7.6
    174,168.4,7.1,12.8,11.7
    175,222.4,3.4,13.1,11.5
    176,276.9,48.9,41.8,27
    177,248.4,30.2,20.3,20.2
    178,170.2,7.8,35.2,11.7
    179,276.7,2.3,23.7,11.8
    180,165.6,10,17.6,12.6
    181,156.6,2.6,8.3,10.5
    182,218.5,5.4,27.4,12.2
    183,56.2,5.7,29.7,8.7
    184,287.6,43,71.8,26.2
    185,253.8,21.3,30,17.6
    186,205,45.1,19.6,22.6
    187,139.5,2.1,26.6,10.3
    188,191.1,28.7,18.2,17.3
    189,286,13.9,3.7,15.9
    190,18.7,12.1,23.4,6.7
    191,39.5,41.1,5.8,10.8
    192,75.5,10.8,6,9.9
    193,17.2,4.1,31.6,5.9
    194,166.8,42,3.6,19.6
    195,149.7,35.6,6,17.3
    196,38.2,3.7,13.8,7.6
    197,94.2,4.9,8.1,9.7
    198,177,9.3,6.4,12.8
    199,283.6,42,66.2,25.5
    200,232.1,8.6,8.7,13.4

    回归代码:

    % A=importdata('data.txt',' ',200);%????????A.data
    
    a = load('data.txt');
    x1=a(:,[2]) ;
    x2=a(:,[3]) ;
    x3=a(:,[4]) ;
    y=a(:,[5]);
    
    X=[ones(length(y),1), x1,x2,x3];
    
    
    [b,bint,r,rint,stats]=regress(y,X);
    b;bint;stats;
    rcoplot(r,rint)
    
    
    tx=[230.1,37.8,69.2];
    b2=[b(2),b(3),b(4)];
    ty=b(1)+b2*tx';
    ty;

    简单的得到一个变换的公式

    y=b(1)+b(2)*x1+b(3)*x2+b(3)*x3;

    二、ridge regression岭回归

      其实就是在回归前对数据进行预处理,去掉一些偏差数据的影响。

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

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

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

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

    (摘自:机器学习实战)

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

    2、岭回归的概念

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

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

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

    ,

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

        对求导,结果为

    令其为0,可求得的值:

    3、实验的过程

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

    MATLAB代码

    function [ w ] = ridgeRegression( x, y, lam )  
        xTx = x'*x;  
        [m,n] = size(xTx);  
        temp = xTx + eye(m,n)*lam;  
        if det(temp) == 0  
            disp('This matrix is singular, cannot do inverse');  
        end  
        w = temp^(-1)*x'*y;  
    end 
    %% ???(Ridge Regression)  
     clc; 
    %????  
    data = load('data.txt');  
    [m,n] = size(data);  
      
      
    dataX = data(:,2:4);%??  
    dataY = data(:,5);%??  
      
    %???  
    yMeans = mean(dataY);  
    for i = 1:m  
        yMat(i,:) = dataY(i,:)-yMeans;  
    end  
      
    xMeans = mean(dataX);  
    xVars = var(dataX);  
    for i = 1:m  
        xMat(i,:) = (dataX(i,:) - xMeans)./xVars;  
    end  
      
    % ??30?  
    testNum = 30;  
    weights = zeros(testNum, n-2);  
    for i = 1:testNum  
        w = ridgeRegression(xMat, yMat, exp(i-10));  
        weights(i,:) = w';  
    end  
      
    % ??????lam  
    hold on  
    axis([-9 20 -1.0 2.5]);  
    xlabel log(lam);  
    ylabel weights;  
    for i = 1:n-2  
        x = -9:20;  
        y(1,:) = weights(:,i)';  
        plot(x,y);  
    end  

     plot出来的图像显示,k=5的时候,出现了拟合,因此取k=5时的w值,

    % resualt output ,i=5

     w = ridgeRegression(xMat, yMat, exp(5-10));  

    三、另外一个岭回归比较好的例子

    function [b,bint,r,rint,stats] = ridge1(Y,X,k) 
    [n,p] = size(X);
    mx = mean (X);
    my = mean (Y); 
    stdx = std(X);
    stdy=std(Y);
    idx = find(abs(stdx) < sqrt(eps));
    MX = mx(ones(n,1),:);
    STDX = stdx(ones(n,1),:);
    Z = (X - MX) ./ STDX;Y=(Y-my)./stdy;
    pseudo = sqrt(k*(n-1)) * eye(p);
    Zplus = [Z;pseudo];
    Yplus = [Y;zeros(p,1)];
    [b,bint,r,rint,stats] = regress(Yplus,Zplus);
    end
    x=[71.35 22.90 3.76 1158.18 12.20 55.87;
        67.92 34048 17.11 1494.38 19.82 56.60; 
        79.38 24.91 33.60 691.56 16.17 92.78;
        87.97 10.18 0.73 923.04 12.15 24.66;
        59.03 7.71 3.58 696.92 13.50 61.81; 
        55.23 22.94 1.34 1083.84 10.76 49.79; 
        58.30 12.78 5.25 1180.36 9.58 57.02;
        67.43 9.59 2.92 797.72 16.82 38.29; 
        76.63 15.12 2.55 919.49 17.79 32.07];
    y=[28.46;27.76;26.02;33.29;40.84;44.50;28.09;46.24; 45.21];
    x'*x;
    count=0;
    kvec=0.1:0.1:1;
    for k=0.1:0.1:1
        count=count+1;
        [b,bint,r,rint,stats]=ridge1(y,x,k);
        bb(:,count)=b;
        stats1(count,:)=stats; 
    end
    bb',stats1 
    plot(kvec',bb),xlabel('k'),ylabel('b','FontName','Symbo l')

    从运行结果及图1可见,k≥0.7时每个变量相应

    的岭回归系数变化较为稳定,因而可选k=0.7,建立 岭回归方程

    y=-0.219 5x1-0.120 2x2-0.237 8x3- 0.244 6x4+0.203 6x5-0.249 4x6 

  • 相关阅读:
    uni_app 跳转到外部html5 的页面 (web-view) 的一些使用
    vue初学备份(动态切换class类)
    MySQL数据库基本操作
    蛋疼的JavaScript(二)this
    Java中的String,StringBuffer和StringBuilder
    LintCode_1 单例模式
    [转载]C语言EOF是什么?
    Python中的枚举
    对BOM的总结
    python类相关总结(持续更新)
  • 原文地址:https://www.cnblogs.com/Anita9002/p/7699550.html
Copyright © 2011-2022 走看看