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函数只是在第一个元素上采样,然后不再更改随机部分。
感谢您的解释!
答案 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
答案 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])