代码和word版笔记下载地址:
http://download.csdn.net/detail/misscoder/9381035
一:模型引入
当我们需要对某输入变量x进行预测时,若使用线性回归对问题进行建模,算法流程是这样的:
首先:使用最小二乘法或者极大似然法,基于梯度下降或正规方程法求解模型参数theta,确定模型;
最后:返回输入变量的预测值y=θ^T x
然而当线性建模并不能很好地描述问题时,我们便不能再使用这种方式来对变量x进行预测了。举个简单例子,对于y=exp(x)的实际问题,若以y=θ^T x进行线性建模则就显得不够明智了。但是局部线性还是OK的,即不管整体上或者说整个变量空间上,输出与输入满足哪种模型,但我们始终可以认为在局部变量空间上,输出与输入是满足线性模型的,这就是局部拟合的思想,所以在这节课中他介绍了局部加权线性回归方法,这是一种非常流行的算法。
二:算法核心思想
局部线性拟合。如果我们需要对x进行预测,那我们考虑x邻域范围内的训练样本,基于这一训练样本子集进行线性建模(而常规线性回归是基于所有训练样本进行线性建模,这就是LMR和LR的区别之处),然后对x进行线性预测。
三:算法数学核心思想
成本函数J(theta)只考虑或者只考虑x邻域内的训练样本,类似于DSP和DIP中加窗处理,这里在x处使用高斯函数对训练样本预测误差(的平方)进行加窗,以此构造局部线性拟合成本函数
四:算法步骤
(1):使用正规方程法求解使成本函数J(theta)值最小的参数theta
(2):返回输入变量的预测值y=θ^T x
五:MATLAB实现代码
1、算法实现函数
% Function: 基于正规方程法的最小二乘法进行局部加权线性回归建模并对指定输入x进行预测
% Author:
% Create Time:2015/12/26
% Parameter:
% tx--训练样本输入
% ty--训练样本输出
% t --bandwidth,加权函数的波形控制参数
% x --输入变量
% Steps:
% 1:构建样本输入矩阵、输出向量、权重矩阵W等
% 2:正规方程法求解参数theta并对指定输入x进行预测
function [y,theta ] = laLWR(tX,tY,t,x)
%% 1:构建样本输入矩阵、输出向量、权重矩阵W等
[m,n] = size(tX);%m--样本数,n--特征数
tX0 = ones(m,1);
X = [tX0 tX];
Y = tY;
W = zeros(m,m);
for i = 1:1:m
W(i,i) = weight_LWR(X(i,:),[1 x],t);
end
%% 2:正规方程法求解参数theta
mytheta = pinv(X'*W*X)*X'*W*Y;
y = [1 x]*mytheta;
if nargout ==2
theta = mytheta;
end
end
function w = weight_LWR(xi,x,t)
% Function: 求解局部加权线性回归建模过程中权重,xi与x可为任意行向量
w = exp(-(xi-x)*(xi-x)'/(2*t^2));
end
2、测试函数。
实验结果如图2,图中包含训练样本数据点,线性模型以训练样本中x为输入变量进行预测的曲线以及不同波形参数下局部线性回归的预测曲线。实验结果表明,应根据实际情况合理设置波形参数,否则会出现欠拟合问题,本文参数设置方式下,使用t<=0.3建模比较合理
% Function: 测试基于正规方程法的最小二乘法进行局部加权线性回归建模函数theta = laLWR(tx,ty,t)
% Create Time:2015/12/26
% % Parameter:
clc;
clear all;
close all;
% 1 构造样本矩阵和参数矩阵框架
m = 50;
n = 1;
X = zeros(m,n);
Y = zeros(m,1);
theta = zeros(n+1,1);
% 2 完成样本矩阵和参数矩阵构建
for i=1:1:m
x1 = randi([-2 22],1,1);%r = randi([iMin,iMax],m,n)
%x1 = 10*randn(1);
X(i,:) = x1;
Y(i) = 20*exp(-((x1-2)^2)/2);
end
% 3 建模并预测x
x = 3 ;
t = 0.3;
[predict_x,h_theta]=laLWR(X,Y,t,x);
y_x = 20*exp(-x(1)^2/2);
% 4 作图反映建模结果
% 4_1 描述训练样本
C = sortrows([X,Y]);%排序以方便后续绘图
figure; hold on;
plot(C(:,1),C(:,2),'rx','linewidth',7);
% 4_2 使用线性回归模型预测各个样本
pm = size(C,1);%预测变量的个数
pC = zeros(pm,1);%存储各个变量的预测值
for ip = 1:1:pm
pC(ip) = laNormalEquations(X,Y,C(ip,1));
end
plot(C(:,1),pC,'Color',[0.4 0.5 0.6],'linewidth',2);
% 4_3 使用局部线性回归模型预测各个样本,并对模型波形参数进行探讨
t_vector = [0.1 0.3 0.6 1 3 5];%模型波形参数
colors=['g';'b';'c';'m';'y';'k'];
for it = 1:1:size(t_vector,2)%最外层控制波形参数的更新
t = t_vector(it);
pix = zeros(pm,1);
for ix = 1:1:pm;%第二层对样本中的每一个输入变量进行预测
x = C(ix,1);
pix(ix)=laLWR(X,Y,t,x);
end
plot(C(:,1),pix,colors(it),'linewidth',2 );
end
legend('训练样本','线性模型','LWR t=.1','LWR r=.3','LWR r=.8,','LWR r=2','LWR r=5');