随机梯度下降matlab代码
时间: 2023-06-26 08:02:28 浏览: 273
SGD随机梯度下降Matlab代码
### 回答1:
随机梯度下降是机器学习中常用的一种优化算法,它具有较快的收敛速度和低内存消耗等优点。下面给出一份Matlab代码实现:
function [theta, J_history] = stochastic_gradient_descent(X, y, theta, alpha, num_iters)
m = length(y);
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
for i = 1:m
h = X(i,:) * theta;
J_history(iter) = J_history(iter) + (h - y(i))^2;
for j = 1:size(X,2)
theta(j) = theta(j) - alpha * (h - y(i)) * X(i,j);
end
end
J_history(iter) = J_history(iter) / (2*m);
end
end
该函数有以下五个输入参数:
1)X:样本数据(输入变量)
2)y:样本数据(输出变量)
3)theta:参数向量
4)alpha:学习速率(步长)
5)num_iters:迭代次数
在函数主体中,通过for循环依次遍历每一个样本,计算每个样本的损失,并更新参数向量theta。最后,将每一次迭代的损失存储在J_history中。
使用该函数进行随机梯度下降时,只需要将样本输入矩阵X和输出向量y传递给函数即可。在函数返回时,输出参数theta即为优化得到的最佳参数向量,输出J_history即为每一次迭代的损失值。
需要注意的是,由于随机梯度下降是一种随机算法,每次迭代的结果可能都会有所不同。因此,在实际应用中,通常需要多次运行该函数,并将最终结果取平均值以提高模型的稳定性。
### 回答2:
随机梯度下降(Stochastic Gradient Descent, SGD)是一种常用的优化算法,特别适合用于大规模数据集和高维模型的训练。以下是一份基于MATLAB实现的SGD代码:
function [theta, J_history] = sgd(X, y, alpha, num_iters)
% X: m x n的样本矩阵, m为样本数,n为特征数
% y: m x 1的标签向量
% alpha: 学习率
% num_iters: 迭代次数
% 初始化theta
theta = zeros(size(X, 2), 1);
% 记录每次迭代的代价函数值
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
% 随机选择一个样本
i = randi(size(X, 1));
% 求解梯度,注意这里只用了一个样本
gradient = X(i, :)' * (X(i, :) * theta - y(i));
% 更新theta
theta = theta - alpha * gradient;
% 计算代价函数值
J_history(iter) = compute_cost(X, y, theta);
end
end
function J = compute_cost(X, y, theta)
% 计算代价函数,这里使用的是均方误差
m = length(y);
J = 0;
J = sum((X * theta - y).^2) / (2 * m);
end
这段代码实现了随机梯度下降,其中函数sgd执行迭代次数num_iters次,每次从样本中随机选取一个样本进行梯度计算和更新theta。compute_cost函数用于计算代价函数,这里使用的是均方误差。使用这个代码可以对数据进行线性回归等任务的优化。
### 回答3:
随机梯度下降是一种常见的优化算法,通常用于机器学习和深度学习中的参数优化。Matlab提供了一个非常便捷的实现方式。
首先,我们需要定义损失函数和梯度函数。对于一个线性回归模型,定义损失函数为:
```matlab
function J = loss(X, y, w)
% X:训练集
% y:目标输出
% w:参数向量
% w = [w0, w1, ..., wn]
m = length(y); % 样本数量
h = X*w; % 预测输出
J = (1/(2*m)) * sum((h-y).^2); % 均方误差
end
```
接下来,我们需要定义梯度函数。对于线性回归而言,梯度函数为:
```matlab
function grad = gradient(X, y, w)
% X:训练集
% y:目标输出
% w:参数向量
% w = [w0, w1, ..., wn]
m = length(y); % 样本数量
h = X*w; % 预测输出
grad = (1/m)*X'*(h-y); % 梯度
end
```
接着,我们可以开始使用随机梯度下降算法:
```matlab
% 初始化参数
w = randn(size(X, 2), 1);
alpha = 0.01; % 学习率
max_iter = 1000; % 最大迭代次数
for i = 1:max_iter
% 随机选择一个样本
idx = randi(size(X,1));
x = X(idx,:);
y_i = y(idx,:);
% 计算梯度
grad = gradient(x, y_i, w);
% 更新参数
w = w - alpha*grad;
% 计算损失
J = loss(X, y, w);
fprintf('迭代次数:%d,训练误差:%f\n', i, J);
end
```
在每次迭代中,随机选择一个样本来计算梯度并更新参数。这种随机性有助于避免算法陷入局部最优解,同时减少计算时间。整个算法的收敛速度并不是很快,但是在较大的数据集上表现良好。
阅读全文