如何在逻辑回归中避免 NaN?
How to avoid NaN in logistic regression?
function [predictY] = logisticRegressionClassify(testX, testY, w)
temp = arrayfun(@(x) x/(1+x), exp(testX * w));
[~, predictY] = max(temp, [], 2);
我是运行多class逻辑回归,从来没有得到合理的结果。然后我发现问题出现了,因为temp是用NaN和0计算的。如何修改这段代码来避免这样的问题?
小问题!看起来您使用的是正确的公式,但随后出现了数值问题。为什么?如果 x
足够大,exp(x)/exp(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)
returns NaN
因为 inf/inf 未定义。另一方面,1/inf = 0,第二个公式适用于所有情况。
回顾一下:
exp(x) ./ ( 1+ exp(x)) % <------ can give you inf/inf= NaN problems
1 ./ ( 1 + exp(-x)) % <------ works great!
function [predictY] = logisticRegressionClassify(testX, testY, w)
temp = arrayfun(@(x) x/(1+x), exp(testX * w));
[~, predictY] = max(temp, [], 2);
我是运行多class逻辑回归,从来没有得到合理的结果。然后我发现问题出现了,因为temp是用NaN和0计算的。如何修改这段代码来避免这样的问题?
小问题!看起来您使用的是正确的公式,但随后出现了数值问题。为什么?如果 x
足够大,exp(x)/exp(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)
returns NaN
因为 inf/inf 未定义。另一方面,1/inf = 0,第二个公式适用于所有情况。
回顾一下:
exp(x) ./ ( 1+ exp(x)) % <------ can give you inf/inf= NaN problems
1 ./ ( 1 + exp(-x)) % <------ works great!