Machine learning 如何在八倍频中从Andrew Ng赋值写出代价函数公式?
我的实现(见下文)给出了标量值3.18,这不是正确答案。该值应为0.693。我的代码与等式的偏差在哪里 以下是在倍频程中运行成本函数方法的数据的求解说明:Machine learning 如何在八倍频中从Andrew Ng赋值写出代价函数公式?,machine-learning,octave,logistic-regression,gradient-descent,Machine Learning,Octave,Logistic Regression,Gradient Descent,我的实现(见下文)给出了标量值3.18,这不是正确答案。该值应为0.693。我的代码与等式的偏差在哪里 以下是在倍频程中运行成本函数方法的数据的求解说明: data = load('ex2data1.txt'); X = data(:, [1, 2]); y = data(:, 3); [m, n] = size(X); X = [ones(m, 1) X]; initial_theta = zeros(n + 1, 1); [cost, grad] = costFunction(initial
data = load('ex2data1.txt');
X = data(:, [1, 2]); y = data(:, 3);
[m, n] = size(X);
X = [ones(m, 1) X];
initial_theta = zeros(n + 1, 1);
[cost, grad] = costFunction(initial_theta, X, y);
这里是ex2data
上的链接,在这个包中有数据:
成本函数的公式为
以下是我正在使用的代码:
function [J, grad] = costFunction(theta, X, y)
m = length(y); % number of training examples
% You need to return the following variables correctly
J = 0; %#ok<NASGU>
grad = zeros(size(theta)); %#ok<NASGU>
hx = sigmoid(X * theta)';
m = length(X);
J = sum(-y' * log(hx) - (1 - y')*log(1 - hx)) / m;
grad = X' * (hx - y) / m;
end
您的
sigmoid
功能不正确。传入的数据类型是向量,但您正在使用的操作正在执行矩阵除法。这需要以元素为基础
function g = sigmoid(z)
g = 1.0 ./ (1.0 + exp(-z));
end
通过执行1/A
,其中A
是一个表达式,您实际上是在计算A
的逆,因为逆只存在于平方矩阵中,这将计算伪逆,这绝对不是您想要的
您可以在使用dot产品时保持大部分costFunction
代码不变。我会去掉和
,因为这意味着点积。我将用注释标记我的更改:
function [J, grad] = costFunction(theta, X, y)
m = length(y); % number of training examples
% You need to return the following variables correctly
%J = 0; %#ok<NASGU> <-- Don't need to declare this as you'll create the variables later
%grad = zeros(size(theta)); %#ok<NASGU>
hx = sigmoid(X * theta); % <-- Remove transpose
m = length(X);
J = (-y' * log(hx) - (1 - y')*log(1 - hx)) / m; % <-- Remove sum
grad = X' * (hx - y) / m;
end
function[J,grad]=costFunction(θ,X,y)
m=长度(y);%培训示例的数量
%您需要正确返回以下变量
%J=0;%#好的这是sigmoid函数的代码,我认为您在以下方面犯了错误:
function g = sigmoid(z)
g = zeros(size(z));
temp=1+exp(-1.*z);
g=1./temp;
end
function [J, grad] = costFunction(theta, X, y)
m = length(y);
J = 0;
grad = zeros(size(theta));
h=X*theta;
xtemp=sigmoid(h);
temp1=(-y'*log(xtemp));
temp2=(1-y)'*log(1-xtemp);
J=1/m*sum(temp1-temp2);
grad=1/m*(X'*(xtemp-y));
end
我认为应该是(1-y)'如temp2=(1-y)所示请也提供你的sigmoid
函数。@rayryeng当然。你使用的是矩阵乘法(*
),但你的方程中没有这些函数。试着改用元素乘法(*
)。它是(1-y)
还是(1-y')
并不重要。关键是标量减法。您好,先生,谢谢您的回答,我的sigmoid函数缺少您定义为1的标量乘法。/代价函数的其余部分是正确的。您好,先生,谢谢您的回答,我的sigmoid函数缺少你定义为1的标量乘法。/代价函数的其余部分是正确的。当你问我关于S形函数的时候,我知道了,是的,我没有检查。再次非常感谢您,先生…我已经被困在这几天了。我还有另一个问题,为什么您说删除金额?在公式中,我们有所有迭代的总和吗?@irfan点积已经在为您计算这些项的总和。您不是对迭代进行求和,而是对训练示例的数量进行求和。迭代在该函数之外完成。要求两个向量的和,其中每个项相乘在一起,这就是点积的定义。基本真值向量和假设的和,它们的项相乘,已经由你所做的点积完成了。哦,绝对是的。。。我已经运行了迭代,是的,先生,它给出了相同的结果。非常感谢,先生。。
function g = sigmoid(z)
g = zeros(size(z));
temp=1+exp(-1.*z);
g=1./temp;
end
function [J, grad] = costFunction(theta, X, y)
m = length(y);
J = 0;
grad = zeros(size(theta));
h=X*theta;
xtemp=sigmoid(h);
temp1=(-y'*log(xtemp));
temp2=(1-y)'*log(1-xtemp);
J=1/m*sum(temp1-temp2);
grad=1/m*(X'*(xtemp-y));
end