为什么python的lambda函数无法从发行版中重新采样?

时间:2019-06-11 16:30:34

标签: python numpy

Python的lambda函数在应用于数组时不会从分布中重新采样;例如使用时:

f1 = lambda x: -3 + 0.75*x + numpy.random.randn()

正确的方法是使用map(),从而将lambda函数“映射”到数组上。

但是,可以很容易地将lambda函数应用于数组。 我问这是怎么工作的,但是该功能没有重新采样。

MVP:

import numpy
numpy.random.seed(1)

f1 = lambda x: -3 + 0.75*x + numpy.random.randn()  # dummy with random part
f2 = lambda x: -3 + 0.75*x  # dummy w/o random part 

# dummy data
x = numpy.arange(10)

f1(x) - f2(x)
>> array([1.62434536, 1.62434536, 1.62434536, 1.62434536, 1.62434536,
1.62434536, 1.62434536, 1.62434536, 1.62434536, 1.62434536])

numpy.var(f1(x) - f2(x))  # almost 0

因此,我希望方差会更大,接近1。该示例证明了lambda函数只是在第一个元素上采样,然后不再更改随机部分。

感谢您的解释!

3 个答案:

答案 0 :(得分:2)

问题在于您如何定义lambda函数f1

f1 = lambda x: -3 + 0.75*x + numpy.random.randn()

此处numpy.random.rand()返回一个标量。因此,您有了-3 + 0.75 * x(向量)+ numpy.random.randn()(标量)-结果是广播标量以匹配x的形状-这意味着将相同的标量值添加到每个标量向量的成员。

所以f1(x)是向每个元素添加的向量和一些随机数, f2(x)是减去随机相加的某个向量。

如果减去它们,您将获得一个仅广播了随机部分的向量。

要解决此问题,您应该生成一个randn()形状与x

相同的形状
f1 = lambda x: -3 + 0.75*x + numpy.random.randn(*x.shape)

结果:

f1(x) - f2(x) = [ 1.62434536 -0.61175641 -0.52817175 -1.07296862  0.86540763 -2.3015387
  1.74481176 -0.7612069   0.3190391  -0.24937038]
var() = 0.9982804180510148

randn() docs

答案 1 :(得分:1)

您的函数f1仅运行一次randn函数,并广播到整个阵列。如果您想为每个元素使用不同的随机数,则将其大小设置为x

f1 = lambda x: -3 + 0.75*x + numpy.random.randn(x.size) 

有了

numpy.var(f1(x) - f2(x))  # almost 0

大约是1

答案 2 :(得分:0)

您将标量添加到数组,这意味着将相同的元素添加到数组中的每个元素。

考虑

>>> a = np.array([1, 2, 3, 4])
>>> a + 1
array([2, 3, 4, 5])