xxx*_*222 2 matlab machine-learning logistic-regression
function [predictY] = logisticRegressionClassify(testX, testY, w)
temp = arrayfun(@(x) x/(1+x), exp(testX * w));
[~, predictY] = max(temp, [], 2);
Run Code Online (Sandbox Code Playgroud)
我正在运行多类逻辑回归,从来没有得到合理的结果.然后我发现问题出现,因为temp是用NaN和0计算的.如何修改这段代码以避免这样的问题?
微妙的问题!看起来你正在使用正确的公式,但随后它出现了数字问题的kablooie.为什么?exp(x)/exp(x)如果x足够大,则不等于1 .
解决方案是使用不同但数学上等效的公式:
temp = arrayfun(@(x) 1/(1+x), exp(-testX * w))
Run Code Online (Sandbox Code Playgroud)
您也可以放弃arrayfun通话(除非我遗漏了什么,否则似乎没有必要?):
temp = 1./(1+exp(-testX*w);
Run Code Online (Sandbox Code Playgroud)
这些是与你所写的相同的公式(但没有数字问题).在数学中,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!
Run Code Online (Sandbox Code Playgroud)