回归的目的是预测数值型的目标值,其中最简单的方法是线性回归,线性回归意味着可以将输入项分别乘以一些常量,再将结果加起来得到输出。但是,线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有最小均方误差的无偏估计。如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。
其中的一个方法是局部加权线性回归(Locally Weighted Linear Regression,LWLR)。在该算法中,我们给待预测点附近的每一个点赋予一定的权重,然后在这个子集上基于最小均方误差来进行普通的回归。与kNN一样,这种算法每次预测均需事先选取出对应的数据子集。该算法解出回归系数w的形式如下:
其中,w是一个矩阵,用来给每个数据点赋予权重。
LWLR使用“核”(与支持向量机中的核类似)来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:
这样就构建了一个只含对角元素的权重矩阵w,并且点x与x(i)越近,w(i,i)将会越大。上述公式包含一个需要用户指定的参数k,它决定了对附近的点赋予多大的权重,这也是使用LWLR时唯一需要考虑的参数,参数k与权重的关系如下图所示:
使用局部加权线性回归进行数据拟合,用MATLAB代码如下:
clear ;
close all;
% x = [1:50].';
% y = [4554 3014 2171 1891 1593 1532 1416 1326 1297 1266 ...
% 1248 1052 951 936 918 797 743 665 662 652 ...
% 629 609 596 590 582 547 486 471 462 435 ...
% 424 403 400 386 386 384 384 383 370 365 ...
% 360 358 354 347 320 319 318 311 307 290 ].';
load('data');
len=90;
y=data(:,8);
y=y(1:len,1);
x=1:len;
x=x.';
m = length(y); % store the number of training examples
x = [ ones(m,1) x]; % Add a column of ones to x
n = size(x,2); % number of features
theta_vec = inv(x'*x)*x'*y;
tau = [ 1 10 25 ];
y_est = zeros(length(tau),length(x));
for kk = 1:length(tau)
for ii = 1:length(x);
w_ii = exp(-(x(ii,2) - x(:,2)).^2./(2*tau(kk)^2));
W = diag(w_ii);
theta_vec = inv(x'*W*x)*x'*W*y;
y_est(kk, ii) = x(ii,:)*theta_vec;
end
end
figure;
plot(x(:,2),y,'ks-'); hold on
plot(x(:,2),y_est(1,:),'bp-');
% plot(x(:,2),y_est(2,:),'rx-');
% plot(x(:,2),y_est(3,:),'go-');
legend('measured', 'predicted, tau=1', 'predicted, tau=10','predicted, tau=25');
grid on;
xlabel('Page index, x');
ylabel('Page views, y');
title('Measured and predicted page views with weighted least squares');
效果如图所示:
用局部加权线性回归进行数据预测,结果如图所示: