如何在逻辑回归中避免NaN?

时间:2015-12-13 08:52:01

标签: matlab machine-learning logistic-regression

from django.db.models import F, Q
Hardware.objects
    .filter(relocation__subdivision=target_subdivision, relocation__relocation_date__lte=limit_date)
    .exclude(~Q(relocation__subdivision=target_subdivision), relocation__relocation_date__gt=F('relocation__relocation_date'))
    .distinct()

我正在运行多级逻辑回归,但从未得到合理的结果。然后我发现问题出现了,因为temp是用NaN和0计算的。如何修改这段代码以避免这样的问题?

1 个答案:

答案 0 :(得分:5)

微妙的问题!看起来你正在使用正确的公式,但随后它出现了数字问题的kablooie。为什么? <{1}}如果exp(x)/exp(x)足够大,则x不等于1。

解决方案是使用不同但在数学上等效的公式:

temp = arrayfun(@(x) 1/(1+x), exp(-testX * w))

您还可以放弃arrayfun来电(除非我遗漏了某些内容,否则似乎没有必要?):

temp = 1./(1+exp(-testX*w);

这些是你所写的等价公式(但没有数字问题)。在数学中,e ^ x /(1 + e ^ x)= 1 /(1 + e ^ -x)

原始版本出了什么问题?

让我们假设testX * w = 2000.然后你有exp(2000)= inf,而exp(2000)/ ( 1+ exp(2000)返回NaN因为inf / inf未定义。另一方面,1 / inf = 0,第二个公式适用于所有情况。

回顾一下:

exp(x) ./ ( 1+ exp(x))          % <------ can give you inf/inf= NaN problems
1 ./ ( 1  + exp(-x))            % <------ works great!