在上述代码添加正则化项、对输入数据进行标准化等等。并且写成函数形式
时间: 2024-02-13 12:06:11 浏览: 28
好的,下面是对上述代码进行改进,添加了 L2 正则化项和对输入数据进行标准化的功能,并将其封装成一个函数形式:
```
function [theta, b, loss_history] = linear_regression(X, y, batch_size, lr, lr_decay, epochs, lambda)
% 对输入数据进行标准化
[m, n] = size(X);
mu = mean(X);
sigma = std(X);
X = (X - mu) ./ sigma;
% 初始化模型参数
theta = randn(n, 1);
b = randn();
% 设置损失函数的历史记录
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 + lambda * theta;
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) + lambda * sum(theta .^ 2) / 2;
loss_history(epoch) = loss;
end
end
```
在这个代码中,我们首先对输入数据进行标准化,然后初始化模型参数。我们设置了一个新的超参数 `lambda`,用于控制 L2 正则化项的强度。
在每个 epoch 中,我们首先随机打乱样本顺序,然后对于每个 mini-batch,我们计算梯度并更新参数。注意,这里我们在梯度中添加了 L2 正则化项。在更新参数之前,我们先进行学习率衰减,然后才应用梯度下降算法。最后,我们计算当前损失函数的值并将其存储在 `loss_history` 数组中。
最后,我们将整个代码封装成一个函数,并返回最终的模型参数和损失函数的历史记录。