写一个MATLAB进行小批量线性回归的代码,要求:进行多元线性回归,损失函数是均方误差,绘制随每次迭代损失函数减少的曲线,mini-batch的SGD算法中一个关键参数是学习率。在实践中,有必要随着时间的推移逐渐降低学习率—学习率衰减(learning rate decay)。
时间: 2024-02-13 12:06:10 浏览: 84
好的,下面是一个实现小批量线性回归的 MATLAB 代码,使用 mini-batch 的 stochastic gradient descent(SGD)算法进行优化,同时实现了学习率衰减:
```
% 数据准备
load('data.mat');
X = data(:, 1:2);
y = data(:, 3);
m = size(X, 1);
n = size(X, 2);
% 初始化模型参数
theta = rand(n, 1);
b = rand();
% 设置超参数
batch_size = 10; % mini-batch 的大小
lr = 0.1; % 初始学习率
lr_decay = 0.1; % 学习率衰减
epochs = 50; % 迭代次数
loss_history = zeros(epochs, 1); % 损失函数的历史记录
% 进行 mini-batch SGD 迭代
for epoch = 1:epochs
% 随机打乱样本顺序
idx = randperm(m);
X = X(idx, :);
y = y(idx);
% 迭代 mini-batch
for i = 1:batch_size:m
% 计算当前 mini-batch 的梯度
X_batch = X(i:min(i+batch_size-1, m), :);
y_batch = y(i:min(i+batch_size-1, m));
grad_theta = (X_batch' * (X_batch * theta + b - y_batch)) / batch_size;
grad_b = sum(X_batch * theta + b - y_batch) / batch_size;
% 更新参数
lr = lr / (1 + lr_decay * epoch); % 学习率衰减
theta = theta - lr * grad_theta;
b = b - lr * grad_b;
end
% 计算当前损失函数的值
loss = sum((X * theta + b - y) .^ 2) / (2 * m);
loss_history(epoch) = loss;
end
% 绘制损失函数随迭代次数变化的曲线
plot(1:epochs, loss_history);
xlabel('Epochs');
ylabel('Loss');
title('Loss vs. Epochs');
```
在这个代码中,我们首先加载数据并初始化模型参数。然后,我们设置了超参数,包括 mini-batch 的大小、初始学习率、学习率衰减和迭代次数。我们还创建了一个数组 `loss_history`,用于保存每次迭代后的损失函数的值。
接下来,我们使用 for 循环进行迭代。在每个 epoch 中,我们首先随机打乱样本的顺序,然后对于每个 mini-batch,我们计算梯度并更新参数。在更新参数之前,我们先进行学习率衰减,然后才应用梯度下降算法。最后,我们计算当前损失函数的值并将其存储在 `loss_history` 数组中。
最后,我们使用 plot 函数绘制损失函数随迭代次数变化的曲线。
注意,这个代码只是一个简单的例子,实际应用中还需要进行一些优化,比如添加正则化项、对输入数据进行标准化等等。
阅读全文