一、lasso
前面已经叙述了基本的线性回归,局部加权线性回归,以及岭回归。其中,局部加权线性回归做的工作就是进行了特征的选择,选择的策略是进行局部的约束;岭回归是采用的正则化的方法进行特征的选择,使用的是
。而lasso采用的则是
,即lasso是在平方误差的基础上增加
:
,
对于这样的一种优化问题,其实是很难求解的,因为这样的优化问题不再是一个凸优化问题。为了求解这样的问题,一些近似的优化算法被采用。或者可以采用一些简单的方法来近似这样的优化过程。
二、前向逐步回归
前向逐步回归算法可以得到与lasso差不多的效果,但是前向逐步回归更加简单。这是一种贪心算法,在每一步尽量减少误差。
(前向逐步回归流程)
三、实验
1、Matlab实现
主程序
代码语言:javascript复制clear all;
clc;
%% 导入数据
data = load('abalone.txt');
x = data(:,1:8);
y = data(:,9);
%% 处理数据
yMean = mean(y);
yDeal = y-yMean;
xMean = mean(x);
xVar = var(x,1);
[m,n] = size(x);
xDeal = zeros(m,n);
for i = 1:m
for j = 1:n
xDeal(i,j) = (x(i,j)-xMean(j))/xVar(j);
end
end
%% 训练
runtime = 5000;%迭代的步数
eps = 0.001;%调整步长
wResult = stageWise(xDeal, yDeal, eps, runtime);
%% 根据wResult画出收敛曲线
hold on
xAxis = 1:runtime;
for i = 1:n
plot(xAxis, wResult(:,i));
end
前向逐步回归函数
代码语言:javascript复制function [ wResult ] = stageWise( x, y, eps, runtime)
[m,n] = size(x);%数据集的大小
wResult = zeros(runtime, n);%最终的结果
w = zeros(n,1);
wMax = zeros(n,1);
for i = 1:runtime
ws = w'%输出每一次计算出来的权重
lowestError = inf;%定义最小值
for j = 1:n
for sign = -1:2:1
wTest = w;%初始化
wTest(j) = wTest(j) eps*sign;%只改变一维变量
yTest = x*wTest;
%求误差
rssE = rssError(y, yTest);
if rssE < lowestError%如果好,就替换
lowestError = rssE;
wMax = wTest;
end
end
end
w = wMax;
wResult(i,:) = w;
end
end
误差函数
代码语言:javascript复制%% rssError函数主要是利用均方误差
function [ error ] = rssError( y, yTest )
yDis = y-yTest;%误差
[m,n] = size(yDis);
%求平方
for i = 1:m
yDis(i) = yDis(i)^2;
end
error = sum(yDis);%求列和
end