Интеграция функции с использованием неравномерной меры (python/scipy)

Я хотел бы интегрировать функцию в python и указать плотность вероятности (меру), используемую для выборки значений. Если это не очевидно, интегрирование f(x)dx в [a,b] неявно использует равномерную плотность вероятности по [a,b], и я хотел бы использовать свою собственную плотность вероятности (например, экспоненциальную).

Я могу сделать это сам, используя np.random.*, но тогда

  • Мне не хватает оптимизаций, доступных в scipy.integrate.quad. Или, может быть, все эти оптимизации предполагают равномерную плотность?
  • Мне нужно самому сделать оценку ошибки, что не тривиально. Или, может быть, это так? Может быть, ошибка - это просто дисперсия sum(f(x))/n?

Любые идеи?


person Uri Cohen    schedule 03.09.2012    source источник
comment
Можно ли представить интеграл от f(x) d(mu) (где mu — мера) как интеграл от f(x)g(x) dx для некоторой функции плотности g?   -  person unutbu    schedule 03.09.2012
comment
да, я могу предположить, что либо у меня явно есть g, либо что я могу сделать выборку x в соответствии с g. Я вижу, куда ты клонишь :)   -  person Uri Cohen    schedule 03.09.2012


Ответы (3)


Как сказал unutbu, если у вас есть функция плотности, вы можете просто интегрировать продукт своей функции с pdf, используя scipy.integrate.quad.

Для дистрибутива, доступного в scipy.stats, мы также можем просто использовать функцию ожидания.

Например

>>> from scipy import stats

>>> f = lambda x: x**2

>>> stats.norm.expect(f, loc=0, scale=1)
1.0000000000000011

>>> stats.norm.expect(f, loc=0, scale=np.sqrt(2))
1.9999999999999996

scipy.integrate.quad также имеет некоторые предопределенные весовые функции, хотя они не нормализованы как функции плотности вероятности.

Ошибка аппроксимации зависит от настроек вызова integrate.quad.

person Josef    schedule 03.09.2012

Для краткости было предложено 3 способа вычисления ожидаемого значения f(x) при вероятности p(x):

  • Предполагая, что p задано в закрытой форме, используйте scipy.integrate.quad для оценки f(x)p(x)
  • Предполагая, что p можно взять из выборки, выберите N значений x=P(N), затем оцените ожидаемое значение с помощью np.mean(f(X)) и ошибку с помощью np.std(f(X))/np.sqrt(N).
  • Предполагая, что p доступен в stats.norm, используйте stats.norm.expect(f)
  • Предполагая, что у нас есть CDF(x) распределения, а не p(x), вычислите H=Inverse[CDF], а затем проинтегрируйте f(H(x)), используя scipy.integrate.quad.
person Uri Cohen    schedule 04.09.2012

Другой возможностью было бы интегрировать x -> f (H (x)), где H - это инверсия кумулятивного распределения вашего распределения вероятностей.

[Это происходит из-за замены переменной: замена y=CDF(x) и замечание, что p(x)=CDF'(x) дает изменение dy=p(x)dx и, таким образом, int{f(x)p(x) )dx}==int{f(x)dy}==int{f(H(y))dy с H обратным CDF.]

person dmuir    schedule 05.09.2012