Octave梯度下降正常但无法保存代价函数输出J_history问题求助
Octave梯度下降J_history无法保存问题排查
核心原因
你的gradientDescent和computeCost函数内部逻辑本身没有错误,J_history的初始化、逐轮代价值填充的代码都能正常运行,看不到这个变量的根本原因是主程序调用函数时没有接收第二个返回值。
Octave/MATLAB对多返回值函数的处理规则是:
- 只有调用时赋值号左侧明确列出的返回变量,才会被存入当前工作区
- 未被列出的返回值会在函数运行结束后直接丢弃,全程不会抛出任何报错
你当前的调用语句为:
theta = gradientDescent(X, y, theta, alpha, iterations);
这行代码仅接收了第一个返回值theta,函数内部生成的J_history没有被接收,自然不会出现在工作区里,看起来就像没有初始化、没有填充值一样。
隐性代码问题
你的主程序还存在变量定义顺序颠倒的隐患,正常运行应该抛出错误,你没碰到报错是因为工作区残留了之前运行留下的同名m变量:
% 错误顺序:这行用到m的时候,m还没被定义 X = [ones(m, 1), data(:,1)]; y = data(:, 2); m = length(y); % m的定义在使用之后
如果残留的m值和当前数据集的样本量不一致,会导致特征矩阵构造错误,后续梯度下降计算结果完全失真。
修正后代码
调整主程序的变量定义顺序,调用函数时声明接收两个返回值即可,两个子函数不需要做任何修改:
data = load('ex1data1.txt'); % 加载包含单特征、单标签的两列数据集 y = data(:, 2); % 先取出标签向量 m = length(y); % 计算样本总量 X = [ones(m, 1), data(:,1)]; % 构造带截距项的特征矩阵 theta = zeros(2, 1); % 初始化参数向量为[0;0] iterations = 1500; % 设置梯度下降迭代次数 alpha = 0.01; % 设置学习率 % 调用函数时同时接收参数优化结果和代价历史 [theta, J_history] = gradientDescent(X, y, theta, alpha, iterations);
修正后运行,你就能在工作区看到完整填充的J_history向量,可直接用于绘制代价下降曲线验证收敛性。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

