我在实现逻辑回归函数的一部分时,总是得到-inf的结果。我不确定为什么会这样,因为如果输出是1,那么log(1-1)就会变成-inf。
有什么想法吗?
% 根据X, Y, theta计算误差function error = empRisk(X,Y, theta) n = length(X); error = 0; for i=1: n y = Y(i,:); x = X(i,:); binLoss = classify(theta,x); part1 = y-1; part2 = log(1-binLoss);% -Inf if 1-1?? part3 = y*(log(binLoss)); error = error + ((part1*part2)-part3); end error = error*(1/n);end% 实现分类函数function value = classify(theta, x) z = dot(theta,x); result = (1/(1+exp(-z))); % 根据结果输出0或1 if result >= 0.5 value = 1; else value = 0; endend
这是empRisk应该计算的公式:
回答:
你有一个概念上的问题。在讨论经验风险最小化时通常使用的损失函数是0-1损失,这基本上是当你的分类值等于目标值时为0,否则为1(并且你对训练样本进行平均)。
如果你在讨论逻辑损失,那完全是另一回事。在这种情况下,你不希望在你的classify()
函数中使用最后的if
语句。所以你应该返回result
。
经验风险损失(0-1损失)在theta
上是非凸的,而逻辑损失在theta
上是凸的,这是人们使用它的原因之一,因为即使在大问题中,计算上也可行找到正确的theta
。对于经验风险损失则不是这样。