matlab中实现en回归,Linear Regression & Ridge Regression的matlab实现

本文介绍了线性回归和岭回归的基本原理,包括最小化残差平方和的方法以及使用梯度下降法求解。通过矩阵运算简化问题,并探讨了过拟合与正则化的概念。给出了线性回归和岭回归的MATLAB实现,以及针对有噪声数据的处理。实验结果显示,线性回归在训练集和测试集上的错误率分别为3.7%和4.7%。
摘要由CSDN通过智能技术生成

背景与原理:

给定一些离散点,利用线性回归过程获取多项式逼近拟合回归曲线。

Polynomial Curve Fitting

0818b9ca8b590ca3270a3433284dd417.png

其中

0818b9ca8b590ca3270a3433284dd417.png

a是需要求的位置系数。

于是根据mean-squared error,我们需要最小化

0818b9ca8b590ca3270a3433284dd417.png

即minimize

0818b9ca8b590ca3270a3433284dd417.png

其中RSS意为Residual sum of squares.

我们为方便起见,将参数与变量归整化为矩阵形式

0818b9ca8b590ca3270a3433284dd417.png

需要做的就是求Js(a)的最小值。

根据梯度下降法,我们有

0818b9ca8b590ca3270a3433284dd417.png

取deltaJs = 0,则有

0818b9ca8b590ca3270a3433284dd417.png

此处XX'根据矩阵相乘秩<=秩(X) and 秩(X'),当样本数大于特征数时,(XX')非奇异。

以上方法会有overfitting的问题,为了增加过拟合的penalty,加上一个累积参数

0818b9ca8b590ca3270a3433284dd417.png

于是有

0818b9ca8b590ca3270a3433284dd417.png

此时系数矩阵a为

0818b9ca8b590ca3270a3433284dd417.png

应用:

利用该方法获得线性分类器。

实现代码:

Linear Regression:

function w = linear_regression(X, y)

%LINEAR_REGRESSION Linear Regression.

%

% INPUT: X: training sample features, P-by-N matrix.

% y: training sample labels, 1-by-N row vector.

%

% OUTPUT: w: learned perceptron parameters, (P+1)-by-1 column vector.

%

% YOUR CODE HERE

[P, N] = size(X);

X = [ones(1,N);X];

a = inv(X*X')*X*y';

w = a;

end

Ridge Regression:

function w = ridge(X, y, lambda)

%RIDGE Ridge Regression.

%

% INPUT: X: training sample features, P-by-N matrix.

% y: training sample labels, 1-by-N row vector.

% lambda: regularization parameter.

%

% OUTPUT: w: learned parameters, (P+1)-by-1 column vector.

%

% YOUR CODE HERE

[P, N] = size(X);

X = [ones(1,N);X];

a = inv(X*X'+lambda*eye(P+1))*X*y';

w = a;

end

顶层调用模块:

%% Part1: Linear Regression

nRep = 1000; % number of replicates

nTrain = 100; % number of training data

nTest = 1000;

total_iter = 0;

enTrain = 0; % error number of train set

enTest = 0; % error number of test set

E_train = 0; % error rate of train set

E_test = 0; % error rate of test set

for i = 1:nRep

% [X, y, w_f] = mkdata(nTrain);

% w_g = linear_regression(X, y);

% Compute training, testing error

[X, y, w_f] = mkdata(nTrain+nTest);

X_train = X( : , 1:nTrain );

y_train = y( 1 , 1:nTrain ); % true label

X_test = X( : , (nTrain+1):(nTrain+nTest) );

y_test = y( 1 , (nTrain+1):(nTrain+nTest) ); % true label

w_g = linear_regression(X_train, y_train);

[error_rate_train,error_rate_test] = error_rate(w_g, X_train, ...

X_test, y_train, ...

y_test, nTrain, nTest);

E_train = E_train + error_rate_train;

E_test = E_test + error_rate_test;

end

E_train = E_train / nRep;

E_test = E_test / nRep;

fprintf('E_train is %f, E_test is %f.\n', E_train, E_test);

plotdata(X_train, y_train, w_f, w_g, 'Linear Regression_train');

plotdata(X_test, y_test, w_f, w_g, 'Linear Regression_test');

%fprintf('E_train is %f, E_test is %f.\n', E_train, E_test);

%plotdata(X, y, w_f, w_g, 'Linear Regression');

%% Part2: Linear Regression with noisy data

nRep = 1000; % number of replicates

nTrain = 100; % number of training data

nTest = 1000;

total_iter = 0;

enTrain = 0; % error number of train set

enTest = 0; % error number of test set

E_train = 0; % error rate of train set

E_test = 0; % error rate of test set

% for i = 1:nRep

% [X, y, w_f] = mkdata(nTrain, 'noisy');

% w_g = linear_regression(X, y);

% % Compute training, testing error

% end

for i = 1:nRep

% [X, y, w_f] = mkdata(nTrain);

% w_g = linear_regression(X, y);

% Compute training, testing error

[X, y, w_f] = mkdata(nTrain+nTest, 'noisy');

X_train = X( : , 1:nTrain );

y_train = y( 1 , 1:nTrain ); % true label

X_test = X( : , (nTrain+1):(nTrain+nTest) );

y_test = y( 1 , (nTrain+1):(nTrain+nTest) ); % true label

w_g = linear_regression(X_train, y_train);

[error_rate_train,error_rate_test] = error_rate(w_g, X_train, ...

X_test, y_train, ...

y_test, nTrain, nTest);

E_train = E_train + error_rate_train;

E_test = E_test + error_rate_test;

end

E_train = E_train / nRep;

E_test = E_test / nRep;

fprintf('E_train is %f, E_test is %f.\n', E_train, E_test);

plotdata(X_train, y_train, w_f, w_g, 'Linear Regression_train');

plotdata(X_test, y_test, w_f, w_g, 'Linear Regression_test');

%fprintf('E_train is %f, E_test is %f.\n', E_train, E_test);

% plotdata(X, y, w_f, w_g, 'Linear Regression: noisy');

数据生成模块:

function [X, y, w] = mkdata(N, noisy)

%MKDATA Generate data set.

%

% INPUT: N: number of samples.

% noisy: if or not add noise to y.

%

% OUTPUT: X: sample features, P-by-N matrix.

% y: sample labels, 1-by-N row vector.

% w: target function parameters, (P+1)-by-1 column vector.

%

range = [-1, 1];

dim = 2;

X = rand(dim, N)*(range(2)-range(1)) + range(1);

while true

Xsample = [ones(1, dim); rand(dim, dim)*(range(2)-range(1)) + range(1)];

w = null(Xsample', 'r');

y = sign(w'*[ones(1, N); X]);

if all(y)

break;

end

end

if nargin == 2

if noisy == 'noisy'

idx = randsample(N,N/10);

y(idx) = -y(idx);

end

end

end

绘图模块:

function plotdata(X, y, wf, wg, desc)

%PLOTDATA Plot data set.

%

% INPUT: X: sample features, P-by-N matrix.

% y: sample labels, 1-by-N row vector.

% wf: true target function parameters, (P+1)-by-1 column vector.

% wg: learnt target function parameters, (P+1)-by-1 column vector.

% desc: title of figure.

%

figure;

if size(X, 1) ~= 2

disp('WTF');

return;

end

plot(X(1, y == 1), X(2, y == 1), 'o', 'MarkerFaceColor', 'r', ...

'MarkerSize', 10);

hold on;

plot(X(1, y == -1), X(2, y == -1), 'o', 'MarkerFaceColor', 'g', ...

'MarkerSize', 10);

hold on;

f = ezplot(@(x) (-wf(2)/wf(3))*x-wf(1)/wf(3), [-1 1 -1 1]);

set(f, 'Color', 'b', 'LineWidth', 2, 'LineStyle', '-');

hold on;

g = ezplot(@(x) (-wg(2)/wg(3))*x-wg(1)/wg(3), [-1 1 -1 1]);

set(g, 'Color', 'b', 'LineWidth', 2, 'LineStyle', '--');

title(desc);

hold off;

end

Linear Regression结果:训练集错误率3.7%,测试集错误率4.7%

0818b9ca8b590ca3270a3433284dd417.png

带噪声的训练、测试结果:

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值