`numpy.log1p()` 的目的是什么?

38
我刚看到其中一个内核,不明白这段代码(Kaggle中的房屋预测数据集)第三个管道中的numpy.log1p()是做什么的。
Numpy文档中说:
- 返回:
    - 一个数组,其元素为x + 1的自然对数值
    - 其中x属于输入数组的所有元素。
在查找原始和转换后的相同特征数组的偏斜度时,找到带有添加的对数的目的是什么?它实际上是做什么的?

1
由于零的对数会产生错误... - William
我们从不给log赋值为零,因为feat_trial中有数据。顺便问一下,取log的意义是什么? - Sabah
1
好的,我明白了。日志用于响应向大值的偏斜;即出现一些点比数据的大部分要大得多的情况。但是为什么在x上加1呢?当它甚至不为空且其中有数据时? - Sabah
log1p 对于求和对数概率(概率的常见表示方式)也非常有用。更多详情请参见 https://en.wikipedia.org/wiki/Log_probability。 - user118967
4个回答

71

NumPy文档提供了一些提示

对于实值输入,即使在浮点精度下 1 + x == 1log1p也是准确的。

因此,例如让我们添加一个微小的非零数字和 1.0。舍入误差使它成为 1.0

>>> 1e-100 == 0.0
False
>>> 1e-100 + 1.0 == 1.0
True

如果我们尝试对那个不正确的总和取log,我们会得到一个不正确的结果(与WolframAlpha相比):

>>> np.log(1e-100 + 1)
0.0

但是如果我们使用log1p(),就可以得到正确的结果

>>> np.log1p(1e-100)
1e-100

同样的原则适用于 exp1m()logaddexp():它们在小的 x 值上更准确。

谢谢,这仅适用于x的小值吗?因为我们输入到np.log1p()中的'feat_trial'有很大的值。 - Sabah
它们的精度预计对于所有数字都很好(尽管所有浮点数在大值时都会失去精度) - Nils Werner

11

https://docs.scipy.org/doc/numpy/reference/generated/numpy.log1p.html

如果x在0...+Inf范围内,则它永远不会导致错误(因为我们知道log(0)会导致错误)。

enter image description here

并不总是最佳选择,因为正如您所看到的,在x = 0之前您将失去一个重要的曲线,这是对数函数中最好的事情之一。


1
我不明白这是log1p有用的原因(而不是只使用log(1 + x))。如果我们假设x在[0; +inf]中,则避免log(0)错误不会成为log1p(x)存在的原因,因为log(1 + p)永远不会引发该错误。 - user118967

1
当你的输入值非常小的时候,使用np.log1pnp.expm1进行计算,根据this link的解释,你将获得比np.lognp.exp更准确的结果。请注意,保留HTML标签。

0

它也用于规范化分布。 一些分布是对数正态分布,这个函数将有助于规范化您正在处理的数据。

data["Log1pSalary"] = np.log1p(data["SalaryNormalized"]).astype("float32")

 plt.figure(figsize=[8, 4])
 plt.subplot(1, 2, 1)
 plt.hist(data["SalaryNormalized"], bins=20)

 plt.subplot(1, 2, 2)
 plt.hist(data["Log1pSalary"], bins=20)

 plt.show()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接