【问题标题】:How to avoid NaN in logistic regression?如何在逻辑回归中避免 NaN?
【发布时间】:2016-03-18 21:29:07
【问题描述】:
function [predictY] = logisticRegressionClassify(testX, testY, w)
    temp = arrayfun(@(x) x/(1+x), exp(testX * w));
    [~, predictY] = max(temp, [], 2);

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

【问题讨论】:

  • 我想问题出在数组testX * w 上,因为其他一切看起来都不错。
  • 变量 x 的预期取值范围是多少?
  • @BudoZindovic exp 总是积极的。用 arrayfun 编写它的方式有点奇怪,但对我来说看起来不错。
  • @MatthewGunn 你是对的,但 arrayfun 的第一部分是 x/(1+x) 所以我指的是这部分。
  • @brainkz 问题是 exp(x) / exp(x) 不会是 1 如果 x 足够大

标签: matlab machine-learning logistic-regression


【解决方案1】:

微妙的问题!似乎您使用的是正确的公式,但随后出现了数字问题。为什么?如果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) 返回 NaN,因为 inf/inf 是未定义的。另一方面,1/inf = 0,第二个公式适用于所有情况。

回顾一下:

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

【讨论】:

    猜你喜欢
    • 2019-01-24
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2021-02-16
    • 2020-10-30
    • 2020-08-12
    相关资源
    最近更新 更多