逻辑回归的MLE对数似然函数导致除以零错误

我想计算逻辑回归模型的对数似然函数。

def sigma(x):    return 1 / (1 + np.exp(-x))def logll(y, X, w):    """"    Parameters    y : ndarray of shape (N,)        Binary labels (either 0 or 1).    X : ndarray of shape (N,D)        Design matrix.    w : ndarray of shape (D,)        Weight vector.    """    p = sigma(X @ w)    y_1 = y @ np.log(p)    y_0 = (1 - y) @ (1 - np.log(1 - p))    return y_1 + y_0logll(y, Xz, np.linspace(-5,5,D))

应用这个函数会导致以下结果:

/opt/conda/lib/python3.6/site-packages/ipykernel_launcher.py:16: RuntimeWarning: divide by zero encountered in log  app.launch_new_instance()

我期望y_0是一个负浮点数。我如何避免这个错误?代码中是否存在某个错误?

编辑1

X @ w 统计数据:Max: 550.775133944Min: -141.972597608Sigma(max): 1.0 => 在y_0中抛出错误,在np.log(1 - 1.0)中Sigma(min): 2.19828642169e-62

编辑2

我还可以访问这个logsigma函数,它在对数空间中计算sigma:

def logsigma (x):   return np.vectorize(np.log)(sigma(x))

不幸的是,我找不到重写y_0的方法。以下是我的方法,但显然不正确。

def l(y, X, w):    y_1 = np.dot(y, logsigma(X @ w))    y_0 = (1 - y) @ (1 - np.log(1 - logsigma(X @ w)))    return y_1 + y_0

回答:

首先,我认为你在对数似然公式中犯了一个错误:它应该是y_0y_1的简单求和,而不是指数的求和:

log-likelihood

除以零的错误可能是由X @ w中的大负值(我指的是绝对值很大)引起的,例如,在我的机器上sigma(-800)正好是0.0,因此对其取对数会导致"RuntimeWarning: divide by zero encountered in log"

确保你用接近零的小值初始化你的网络,并且在几次反向传播迭代后没有出现梯度爆炸。

顺便说一下,这是我用于交叉熵损失的代码,它也适用于多类问题:

def softmax_loss(x, y):  """  - x: Input data, of shape (N, C) where x[i, j] is the score for the jth class    for the ith input.  - y: Vector of labels, of shape (N,) where y[i] is the label for x[i] and    0 <= y[i] < C  """  probs = np.exp(x - np.max(x, axis=1, keepdims=True))  probs /= np.sum(probs, axis=1, keepdims=True)  N = x.shape[0]  return -np.sum(np.log(probs[np.arange(N), y])) / N

更新:当其他方法都无效时,还有一个数值技巧(在评论中讨论):计算log(p+epsilon)log(1-p+epsilon),其中epsilon是一个小的正值。这样可以确保不会发生log(0.0)的情况。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注