function [beta, b, loss_history] = linear_regression(X, y, batch_size, lr, lr_decay, epochs, lambda) %输入参数: %X:训练数据的特征矩阵,大小为 m x n,其中 m 是样本数,n 是特征数。 %y:训练数据的目标值,大小为 m x 1。 %batch_size:mini-batch 的大小。 %lr:学习率。 %lr_decay:学习率衰减系数。 %epochs:迭代次数。 %lambda:正则项系数。 %输出参数: %beta:学习到的模型参数,大小为 n x 1。 %b:学习到的模型偏差,标量。 %loss_history:损失函数的历史记录,大小为 epochs x 1。 % 对输入数据进行标准化 [m, n] = size(X); mu = mean(X); sigma = std(X); X = (X - mu) ./ sigma; % 初始化模型参数 beta = 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 * beta + b - y_batch)) / batch_size + lambda * beta; grad_b = sum(X_batch * beta + b - y_batch) / batch_size; % 更新参数 lr = lr / (1 + lr_decay * epoch); % 学习率衰减 beta = beta - lr * grad_theta; b = b - lr * grad_b; end % 计算当前损失函数的值 loss = sum((X * beta + b - y) .^ 2) / (2 * m) + lambda * sum(beta .^ 2) / 2; loss_history(epoch) = loss; end % 绘制损失函数随迭代次数变化的曲线 plot(1:epochs, loss_history); xlabel('Epochs'); ylabel('Loss'); title('Loss vs. Epochs') end将此代码中标准化还原
时间: 2024-01-25 12:04:54 浏览: 153
代码中的标准化还原如下所示:
```matlab
X = X .* sigma + mu;
```
将此代码添加到函数中,使其能够在训练完成后将标准化后的数据还原为原始数据。
阅读全文