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
相关产品推荐
相关产品推荐

