[转载]简单易学的机器学习算法-线性回归

一、线性回归的概念

    对连续型数据做出预测属于回归问题。举个简单的例子:例如我们在知道房屋面积(HouseArea)和卧室的数量(Bedrooms)的情况下要求房屋的价格(Price)。通过一组数据,我们得到了这样的关系:
这样的关系就叫做线性回归方程,其中为回归系数。当我们知道房屋面积以及卧室数量时,就可以求出房屋的价格。当然还有一类是非线性回归。

二、基本线性回归

    线性回归的目标是要求出线性回归方程,即求出线性回归方程中的回归系数。我们可以使用平方误差来求线性回归系数。平方误差可以表示为:
可以使用矩阵表示。对求导,得到。于是令其为0,即得到的估计

三、基本线性回归实验

原始的数据
最佳拟合直线
 
MATLAB代码
主函数
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. %% load Data  
  2. A = load('ex0.txt');  
  3.   
  4. X = A(:,1:2);%读取x  
  5. Y = A(:,3);  
  6.   
  7. ws = standRegres(X,Y);  
  8.   
  9. %% plot the regression function  
  10. x = 0:1;  
  11. y = ws(1,:)+ws(2,:)*x;  
  12. hold on  
  13. xlabel x;  
  14. ylabel y;  
  15. plot(X(:,2),Y(:,1),'.');  
  16. plot(x,y);  
  17. hold off  

求权重的过程
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. function [ ws ] = standRegres( X, Y )  
  2.     [m,n] = size(X);  
  3.     ws = zeros(m,1);  
  4.     XTX = X'*X;  
  5.     if det(XTX) == 0  
  6.         disp('This matrix is singular, cannot do inverse');  
  7.     end  
  8.     ws = XTX^(-1) *(X'*Y);  
  9. end  

四、局部加权线性回归

    在线性回归中会出现欠拟合的情况,有些方法可以用来解决这样的问题。局部加权线性回归(LWLR)就是这样的一种方法。局部加权线性回归采用的是给预测点附近的每个点赋予一定的权重,此时的回归系数可以表示为
为给每个点的权重。
    LWLR使用核函数来对附近的点赋予更高的权重,常用的有高斯核,对应的权重为
这样的权重矩阵只含对角元素。

五、局部加权线性回归实验

    对上组数据做同样的处理:
MATLAB代码
主函数
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. %% load Data  
  2. A = load('ex0.txt');  
  3.   
  4. X = A(:,1:2);  
  5. Y = A(:,3);  
  6.   
  7. [SX,index] = sort(X);%得到排序和索引  
  8. %yHat = lwlrTest(SX, X, Y, 1);  
  9. %yHat = lwlrTest(SX, X, Y, 0.01);  
  10. %yHat = lwlrTest(SX, X, Y, 0.003);  
  11.   
  12.   
  13. hold on  
  14. xlabel x;  
  15. ylabel y;  
  16. plot(X(:,2),Y(:,1),'.');  
  17. plot(SX(:,2),yHat(:,:));  
  18. hold off  

LWLR
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. function [ output ] = lwlr( testPoint, X, Y, k )  
  2.     [m,n] = size(X);%得到数据集的大小  
  3.     weight = zeros(m,m);  
  4.     for i = 1:m  
  5.         diff = testPoint - X(i,:);  
  6.         weight(i,i) = exp(diff * diff'./(-2*k^2));  
  7.     end  
  8.     XTX = X'*(weight * X);  
  9.     if det(XTX) == 0  
  10.         disp('his matrix is singular, cannot do inverse');  
  11.     end  
  12.     ws = XTX^(-1) * (X' * (weight * Y));  
  13.     output = testPoint * ws;  
  14. end  

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. function [ y ] = lwlrTest( test, X, Y, k )  
  2.     [m,n] = size(X);  
  3.     y = zeros(m,1);  
  4.     for i = 1:m  
  5.         y(i,:) = lwlr(test(i,:), X, Y, k);  
  6.     end  
  7. end  

时是欠拟合,当时是过拟合,选择合适的很重要。
 
 

六、基本线性回归模型的抽象

    在基本的线性回归中(可见简单易学的机器学习算法——线性回归(1)),对于一个线性回归为题,我们得到一个线性方程组:

在上一篇中我们是构建平方误差函数使得误差函数取得最小值得方法求得回归系数。换种思考,对于这样的一个线性方程组的求解我们有其他的方式,这里我们提到了广义逆。

七、广义逆

    1、广义逆的概念

        广义逆的形式很多,并且广义逆有很好的性质。在众多的广义逆中,有一种称为Moore-Penrose广义逆,其要求比较严格,这里就不再具体说明。对于一个方阵,如果这个矩阵的行列式,则矩阵的逆存在,即对于满秩矩阵,其逆矩阵存在。如果矩阵不是方阵,此时并没有逆的概念,但是我们可以求矩阵的Moore-Penrose广义逆

    2、Moore-Penrose广义逆的性质

        定理:Moore-Penrose广义逆存在而且唯一。

    3、Moore-Penrose广义逆的求法

        可以通过奇异值分解SVD的方式求解广义逆,具体如下:

 

  • 奇异值分解:,其中为对角阵
  • 计算广义逆

这里,假设,则

八、线性回归的求解

    对于上面的线性方程组,利用Moore-Penrose广义逆,我们可以求得回归系数为:

九、实验

    我们同样采用简单易学的机器学习算法——线性回归(1)中的实验数据,我们得到以下的实验结果:

原始数据

最佳拟合直线

MATLAB实验源码

主函数

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. %% load Data  
  2. A = load('ex0.txt');  
  3.   
  4. X = A(:,1:2);%读取x  
  5. Y = A(:,3);  
  6.   
  7. ws = pinvRegres(X,Y);  
  8.   
  9. %% plot the regression function  
  10. x = 0:1;  
  11. y = ws(1,:)+ws(2,:)*x;  
  12. hold on  
  13. xlabel x;  
  14. ylabel y;  
  15. plot(X(:,2),Y(:,1),'.');  
  16. plot(x,y);  
  17. hold off  

求线性回归系数

 

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. function [ ws ] = pinvRegres( X, Y )  
  2.     [m,n] = size(X);  
  3.     ws = zeros(m,1);  
  4.     ws = pinv(X)*Y;  
  5. end  

原文链接是:http://blog.csdn.net/google19890102/article/details/26074827

posted on 2014-06-26 10:49  khunwang  阅读(257)  评论(0编辑  收藏  举报

导航