You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Coursera吴恩达ML课程Octave编写逻辑回归代价函数报错求排查

吴恩达机器学习第三周逻辑回归作业报错排查

问题描述

在Coursera平台学习吴恩达的机器学习课程,完成第三周使用Octave实现逻辑回归代价函数的作业时出现报错,推测问题原因为矩阵乘法运算有误。

原代码片段

主运行代码

data = load('ex2data1.txt');
X = data(:, [1, 2]); y = data(:, 3);
[m, n] = size(X);

% Add intercept term to x and X_test
X = [ones(m, 1) X];

% Initialize fitting parameters
initial_theta = zeros(n + 1, 1);

% Compute and display initial cost and gradient
[cost, grad] = costFunction(initial_theta, X, y);

自定义costFunction函数

function [J, grad] = costFunction(theta, X, y)
    
% Initialize some useful values
m = length(y); % number of training examples

J = 0;
grad = zeros(size(theta));

%calculate hofX --> sigmoid theta'*X
hfX=sigmoid(theta'*X');

%cost --> bring '-' outside
J=-(1/m)*(y'*(log(hfX))')+(1-y)'*(log(1-hfX))';

%gradiant
fifth=(hfX-y)';
grad=(1/m)*(X'*fifth);
 
end

自定义sigmoid函数

function g = sigmoid(z)
%SIGMOID Compute sigmoid function
   
g = zeros(size(z));
      
g = (1./(1+e.^(-1*z)));
   
end

错误点及修正方案

  • 代价函数运算逻辑错误:原代码中负号仅作用于第一项求和结果,第二项未被负号包裹,完全不符合逻辑回归代价函数的公式定义。需要将两个求和项放在同一个括号内,统一乘以-1/m。
  • sigmoid函数兼容性问题:Octave中不能直接调用e作为自然常数,需要使用内置exp()函数计算自然指数,否则会触发未定义变量报错。
  • 冗余转置易引发维度错误:hfX的计算可以简化为X * theta,无需两次转置,得到的m×1向量和y维度完全匹配,后续计算无需反复调整维度,可降低矩阵运算出错概率。

修正后代码示例

修正后的costFunction函数

function [J, grad] = costFunction(theta, X, y)
m = length(y);
hfX = sigmoid(X * theta);
% 修正代价函数计算逻辑
J = -1/m * sum( y .* log(hfX) + (1 - y) .* log(1 - hfX) );
% 梯度计算简化
grad = 1/m * X' * (hfX - y);
end

修正后的sigmoid函数

function g = sigmoid(z)
g = 1 ./ (1 + exp(-z));
end

内容的提问来源于stack exchange,提问作者KevsAI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:54:03