简单易学的机器学习算法——lasso

来源:互联网 发布:端游 客户端 编程语言 编辑:程序博客网 时间:2024/04/29 19:04

本文转自:http://blog.csdn.net/google19890102/article/details/41412631

一、lasso

   前面已经叙述了基本的线性回归,局部加权线性回归,以及岭回归。其中,局部加权线性回归做的工作就是进行了特征的选择,选择的策略是进行局部的约束;岭回归是采用的正则化的方法进行特征的选择,使用的是。而lasso采用的则是,即lasso是在平方误差的基础上增加

对于这样的一种优化问题,其实是很难求解的,因为这样的优化问题不再是一个凸优化问题。为了求解这样的问题,一些近似的优化算法被采用。或者可以采用一些简单的方法来近似这样的优化过程。

二、前向逐步回归

   前向逐步回归算法可以得到与lasso差不多的效果,但是前向逐步回归更加简单。这是一种贪心算法,在每一步尽量减少误差。

(前向逐步回归流程)

三、实验

1、Matlab实现

主程序

[plain] view plaincopy
  1. clear all;  
  2. clc;  
  3. %% 导入数据  
  4. data = load('abalone.txt');  
  5. x = data(:,1:8);  
  6. y = data(:,9);  
  7. %% 处理数据  
  8. yMean = mean(y);  
  9. yDeal = y-yMean;  
  10. xMean = mean(x);  
  11. xVar = var(x,1);  
  12. [m,n] = size(x);  
  13. xDeal = zeros(m,n);  
  14. for i = 1:m  
  15.     for j = 1:n  
  16.         xDeal(i,j) = (x(i,j)-xMean(j))/xVar(j);  
  17.     end  
  18. end  
  19.   
  20. %% 训练  
  21. runtime  = 5000;%迭代的步数  
  22. eps = 0.001;%调整步长  
  23. wResult = stageWise(xDeal, yDeal, eps, runtime);  
  24.   
  25. %% 根据wResult画出收敛曲线  
  26. hold on   
  27. xAxis = 1:runtime;  
  28. for i = 1:n  
  29.     plot(xAxis, wResult(:,i));  
  30. end  


前向逐步回归函数

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. function [ wResult ] = stageWise( x, y, eps, runtime)  
  2.     [m,n] = size(x);%数据集的大小  
  3.     wResult = zeros(runtime, n);%最终的结果  
  4.     w = zeros(n,1);  
  5.     wMax = zeros(n,1);  
  6.     for i = 1:runtime  
  7.         ws = w'%输出每一次计算出来的权重  
  8.         lowestError = inf;%定义最小值  
  9.         for j = 1:n  
  10.             for sign = -1:2:1  
  11.                 wTest = w;%初始化  
  12.                 wTest(j) = wTest(j)+eps*sign;%只改变一维变量  
  13.                 yTest = x*wTest;  
  14.                 %求误差  
  15.                 rssE = rssError(y, yTest);  
  16.                 if rssE < lowestError%如果好,就替换  
  17.                     lowestError = rssE;  
  18.                     wMax = wTest;  
  19.                 end  
  20.             end  
  21.         end  
  22.         w = wMax;  
  23.         wResult(i,:) = w;  
  24.     end  
  25. end  


误差函数

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. %% rssError函数主要是利用均方误差  
  2. function [ error ] = rssError( y, yTest )  
  3.     yDis = y-yTest;%误差  
  4.     [m,n] = size(yDis);  
  5.     %求平方  
  6.     for i = 1:m  
  7.         yDis(i) = yDis(i)^2;  
  8.     end  
  9.     error = sum(yDis);%求列和  
  10. end  


2、收敛曲线


0 0