用matlab编一段小批量梯度下降法程序绘制数据和拟合曲线(带图像,输入特征和输出目标任意)
时间: 2024-05-14 19:17:13 浏览: 98
好的,下面是一份用 MATLAB 编写的小批量梯度下降法程序,可以用来拟合一条曲线,并绘制数据和拟合曲线的图像。
```matlab
% 输入特征 X 和输出目标 y
X = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]';
y = [2, 4, 5, 7, 8, 10, 11, 13, 14, 16]';
% 设置学习率和迭代次数
alpha = 0.01;
num_iters = 1000;
% 初始化参数和损失函数
theta = zeros(2, 1);
J_history = zeros(num_iters, 1);
% 添加偏置项,即 x0 = 1
X = [ones(length(X), 1), X];
% 开始训练
for iter = 1:num_iters
% 随机选择一个小批量样本
batch_size = 3;
indices = randperm(length(X), batch_size);
X_batch = X(indices, :);
y_batch = y(indices);
% 计算梯度和损失函数
h = X_batch * theta;
theta = theta - alpha * (X_batch' * (h - y_batch)) / batch_size;
J_history(iter) = 1 / (2 * batch_size) * sum((h - y_batch).^2);
end
% 输出最终的参数和损失函数
fprintf('theta: %f %f\n', theta(1), theta(2));
fprintf('final cost: %f\n', J_history(num_iters));
% 绘制数据和拟合曲线
plot(X(:, 2), y, 'rx', 'MarkerSize', 10);
hold on;
plot(X(:, 2), X * theta, 'b-', 'LineWidth', 2);
legend('Training data', 'Linear regression');
xlabel('x');
ylabel('y');
```
在这个程序中,我们使用了一个简单的数据集,其中输入特征 X 是 1 到 10 的数字,输出目标 y 是对应的数字加上一个随机噪声。我们的目标是拟合一条直线来近似这些数据点。
程序首先设置了学习率和迭代次数,然后初始化了参数和损失函数。接着,我们为输入特征 X 添加了偏置项,即 x0 = 1,以便在计算中可以方便地使用向量化运算。
在训练过程中,我们使用了小批量梯度下降法,即每次随机选择一个小批量样本来计算梯度和损失函数。这样可以加速训练过程,并且可以避免陷入局部最优解。
最后,程序输出了训练得到的参数和损失函数,并绘制了数据和拟合曲线的图像。您可以根据自己的需要修改输入特征和输出目标,以及调整学习率和迭代次数来得到更好的结果。
阅读全文