逻辑回归代价函数

3
function [J, grad] = costFunction(theta, X, y)
data = load('ex2data1.txt');

y = data(:, 3);

theta = [1;1;2];
m = length(y); 
one = ones(m,1);
X1 = data(:, [1, 2]);
X =  [one X1];

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

J= 1/m *((sum(-y*log(sigmoid(X*theta)))) - (sum(1-y * log(1 - sigmoid(X*theta)))));

for i = 1:m 
grad = (1/m) * sum (sigmoid(X*theta) - y')*X;
end

end

我希望知道我是否正确实现了成本函数和梯度下降,虽然我得到了NaN的答案,但是theta(1)总是必须为0吗?我在这里将其设置为1。grad需要多少次迭代才能与矩阵的长度相等?


你在J语言中漏掉了一个括号,1-y 应该改为 (1-y)。此外,你的代码没有使用计算出的梯度更新 theta。最后,迭代次数是一个超参数,没有一个神奇的值,为了调试,请将其设置为一个大值(比如1000)。 - lejlot
我要更新theta,应该这样写吗? theta = theta - (alpha * grad); - user3593450
是的,这是一次典型的梯度更新。 - lejlot
1个回答

2
function [J, grad] = costFunction(theta, X, y)

m = length(y);

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

sig = 1./(1 + (exp(-(X * theta))));
J = ((-y' * log(sig)) - ((1 - y)' * log(1 - sig)))/m;
grad = ((sig - y)' * X)/m;

end

其中

sig = 1./(1 + (exp(-(X * theta))));

是逻辑回归假设的矩阵表示,定义如下:

enter image description here

其中函数g是sigmoid函数。sigmoid函数定义为:

enter image description here

J = ((-y' * log(sig)) - ((1 - y)' * log(1 - sig)))/m;

是逻辑回归中代价函数的矩阵表示:

enter image description here

grad = ((sig - y)' * X)/m;

是代价函数梯度的矩阵表示,它是一个与θ相同长度的向量,其中第j个元素(对于j=0,1,...,n)定义如下:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接