matlab实现随机梯度下降法
时间: 2023-10-16 18:24:42 浏览: 195
随机梯度下降(Stochastic Gradient Descent,SGD)是一种常用的优化算法,尤其在深度学习中被广泛应用。下面介绍如何用 MATLAB 实现 SGD。
假设我们需要最小化一个损失函数 $J(\theta)$,其中 $\theta$ 是模型参数。SGD 的更新公式如下:
$$\theta_{i+1} = \theta_{i} - \alpha \nabla J(\theta_{i}, x_{i}, y_{i})$$
其中 $\alpha$ 是学习率,$\nabla J(\theta_{i}, x_{i}, y_{i})$ 是对参数 $\theta_{i}$ 在样本 $(x_{i},y_{i})$ 上的梯度。每次更新时,随机选择一个样本 $(x_{i},y_{i})$,用它来计算梯度并更新参数。
下面是一个简单的 SGD 实现代码:
```matlab
function [theta, J_history] = sgd(X, y, theta, alpha, num_iters)
% X: 训练样本,每行表示一个样本
% y: 目标变量,每行对应一个样本
% theta: 初始参数
% alpha: 学习率
% num_iters: 迭代次数
% theta: 训练后的参数
% J_history: 每次迭代后的损失函数值
m = length(y);
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
% 随机选择一个样本
i = randi(m);
% 计算梯度并更新参数
theta = theta - alpha * grad(X(i,:), y(i,:), theta);
% 计算损失函数值
J_history(iter) = loss(X, y, theta);
end
end
function g = grad(x, y, theta)
% 计算梯度
g = (x * theta - y) * x';
end
function J = loss(X, y, theta)
% 计算损失函数值
m = length(y);
J = sum((X * theta - y).^2) / (2 * m);
end
```
其中 `X` 和 `y` 分别表示训练样本和目标变量,每行表示一个样本,`theta` 是初始参数,`alpha` 是学习率,`num_iters` 是迭代次数。`sgd` 函数使用 `for` 循环进行迭代,每次随机选择一个样本,计算梯度并更新参数,同时记录损失函数值。`grad` 函数计算梯度,`loss` 函数计算损失函数值。
可以使用以下代码进行测试:
```matlab
% 生成数据
m = 1000;
n = 2;
X = [ones(m,1), rand(m,n-1)];
theta_true = [1;2];
y = X * theta_true + randn(m,1);
% 初始化参数
theta = zeros(n,1);
% 运行 SGD
alpha = 0.01;
num_iters = 1000;
[theta, J_history] = sgd(X, y, theta, alpha, num_iters);
% 绘制损失函数值随迭代次数的变化
plot(J_history);
xlabel('Iterations');
ylabel('Loss');
```
该代码生成一个二维数据集,并在其中加入噪声。然后运行 SGD 进行训练,并绘制损失函数值随迭代次数的变化。