Почему лямбда-функция Python не выполняет повторную выборку из дистрибутива? - PullRequest
0 голосов
/ 11 июня 2019

Лямбда-функция Python не выполняет повторную выборку из распределения при применении к массиву; например при использовании:

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

Правильным способом было бы использовать map () и тем самым «отобразить» лямбда-функцию в массиве.

Однако можно легко применить лямбда-функцию к массиву. Я спрашиваю, как это работает, но функция не выполняет повторную выборку.

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. Пример является доказательством того, что лямбда-функция просто выполняет выборку по первому элементу, а затем больше не изменяет случайную часть.

Спасибо за ваше объяснение !!

Ответы [ 3 ]

2 голосов
/ 11 июня 2019

Проблема в том, как вы определили лямбда-функцию 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 () документы

1 голос
/ 11 июня 2019

Ваша функция f1 запускает функцию randn один раз и транслирует весь массив. Если вам нужны разные случайные числа для каждого элемента, задайте для него размер, равный x:

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

С этим

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

будет около 1

0 голосов
/ 11 июня 2019

Вы добавляете скаляр к массиву, что означает, что один и тот же элемент добавляется к каждому элементу в массиве.

Рассмотрим

>>> a = np.array([1, 2, 3, 4])
>>> a + 1
array([2, 3, 4, 5])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...