梯度下降(Gradient Descent)是一种常用的优化算法,用于寻找函数的局部最小值。在机器学习领域,它常被用来优化模型的参数,比如线性回归、逻辑回归以及神经网络等模型的权重和偏置。
以下是一个简单的MATLAB实现梯度下降算法的示例,该示例将用于优化一个简单的二次函数 f(x)=ax2+bx+c 的最小值点。为了简化问题,我们假设 a=1,b=0,c=1,即函数为 f(x)=x2+1,其最小值点为 x=0。
function [x_min, f_min, iter] = gradientDescent(start_x, learning_rate, max_iter, tol) | |
% GRADIENTDESCENT 实现梯度下降算法来找到函数 f(x) = x^2 + 1 的最小值 | |
% 输入: | |
% start_x - 初始猜测值 | |
% learning_rate - 学习率 | |
% max_iter - 最大迭代次数 | |
% tol - 收敛容忍度 | |
% | |
% 输出: | |
% x_min - 最小值点 | |
% f_min - 最小值 | |
% iter - 迭代次数 | |
% 初始化 | |
x = start_x; | |
iter = 0; | |
% 梯度下降循环 | |
while iter < max_iter | |
% 计算当前x的梯度(导数) | |
grad = 2 * x; % 对于 f(x) = x^2 + 1,其导数为 2x | |
% 更新x值 | |
x_new = x - learning_rate * grad; | |
% 检查收敛性 | |
if abs(x_new - x) < tol | |
break; | |
end | |
% 更新x | |
x = x_new; | |
% 迭代计数 | |
iter = iter + 1; | |
end | |
% 计算最小值 | |
f_min = x^2 + 1; | |
x_min = x; | |
end |
要使用这个函数,可以像下面这样调用它:
start_x = 10; % 初始猜测值 | |
learning_rate = 0.1; % 学习率 | |
max_iter = 1000; % 最大迭代次数 | |
tol = 1e-6; % 收敛容忍度 | |
[x_min, f_min, iter] = gradientDescent(start_x, learning_rate, max_iter, tol); | |
fprintf('最小值点 x = %f\n', x_min); | |
fprintf('最小值 f(x) = %f\n', f_min); | |
fprintf('迭代次数 = %d\n', iter); |
这段代码将输出函数 f(x)=x2+1 的最小值点 x = 0
(或其非常接近的值,取决于学习率和容忍度),最小值 f(x) = 1
,以及达到收敛所需的迭代次数。注意,实际应用中函数的梯度和形式会有所不同,需要根据具体情况进行调整。