2d-массив эффективного размера выборки с использованием arviz и pymc3 mcmc

Я пытаюсь получить эффективный размер выборки для цепочки 2D mcmc, используя pymc3 и arviz.

import pymc3 as pm3
!pip install arviz 
import arviz as az

ess = az.ess(samples)

Приведенный выше код работает для 1D, но не для 2D, и я вижу, что az.convert_to_dataset может помочь, но я не могу понять, как его использовать?

Образцы будут представлять собой массив N x 2, и он должен просто давать одно число в качестве вывода.

Спасибо!


person Lizardinablizzard    schedule 16.07.2020    source источник
comment
Он должен дать одно число: вы уверены? ESS зависит от параметра. ESS может (сильно) отличаться для разных параметров модели в одной и той же цепочке образцов MCMC.   -  person Limey    schedule 17.07.2020
comment
Ах, хорошо, поэтому я хочу одно число для каждого параметра, и я могу сделать рабочий 1D ess для соответствующей части массива образцов - туз, спасибо!   -  person Lizardinablizzard    schedule 20.07.2020
comment
@Lizardinablizzard, предполагая, что у вас есть N отрисовки из 2 параметров, вы можете добавить измерение с [None, ...] или с np.expand_dims, чтобы соответствовать соглашению, которое я объяснил ниже.   -  person OriolAbril    schedule 21.07.2020
comment
Кроме того, косвенный вопрос: используете ли вы PyMC3 для создания образцов? Если да, то пробовали ли вы arviz.from_pymc3?   -  person OriolAbril    schedule 21.07.2020
comment
Я написал свой собственный сэмплер mcmc, а затем я получаю принятые 2D-точки выборки в виде выходных данных размера N x 2, так что, может быть, мне нужно увеличить размеры?   -  person Lizardinablizzard    schedule 22.07.2020
comment
Я написал свой собственный сэмплер mcmc, а затем я получаю принятые 2D-точки выборки в виде выходных данных размера N x 2, так что, может быть, мне нужно увеличить размеры?   -  person Lizardinablizzard    schedule 22.07.2020
comment
Я обновил ответ информацией из этого комментария, надеюсь, он прояснит ситуацию :)   -  person OriolAbril    schedule 22.07.2020


Ответы (1)


При работе с массивами ArviZ использует следующие правила формы:

  • Массив 1d представляет отрисовки одной цепочки скалярной переменной: (draw,)
  • Массив 2d представляет собой отрисовку нескольких цепочек скалярной переменной: (chain, draw)
  • Массив 3d+ представляет собой отрисовку нескольких цепочек многомерных переменных: (chain, draw, *shape)

Я не уверен, почему у вас не работает вариант 2d, я подозреваю, что это может быть связано с тем, что у вас недостаточно ничьих для расчета ess.

Чтобы убедиться, что ваши измерения правильно интерпретируются, я бы рекомендовал выполнить idata = az.convert_to_inference_data(ary), а затем проверьте idata.posterior, чтобы увидеть размеры сгенерированного объекта. Затем вы можете вызвать az.ess(idata), чтобы получить эффективный размер выборки.


EDIT: если я правильно понял ваши комментарии, вы создаете массив с формой (draw=N, parameter_dim=2), так как вы выбираете только одну цепочку. Поскольку это двумерный массив, он будет интерпретироваться как содержащий N цепочек и 2 отрисовок, что должно вывести предупреждение о наличии большего количества цепочек, чем отрисовок. Вы можете изменить массив в соответствии с соглашением ArviZ с помощью:

idata = az.convert_to_inference_data(np.expand_dims(samples, 0))
# or what is the same (we just choose the name of the variable)
idata = az.from_dict({"position": np.expand_dims(samples, 0)})

который сгенерирует массив (1, N, 2), размеры которого будут понятны ArviZ. Я уже добавил преобразование в InferenceData, так как наличие InferenceData позволит вам вызывать любую функцию ArviZ, не заботясь больше о размерах.


Если бы ваш массив был (2, N), добавление транспонирования перед расширением оси должно решить проблему:

idata = az.convert_to_inference_data(np.expand_dims(samples.T, 0))
person OriolAbril    schedule 18.07.2020
comment
Спасибо @oriolabril, поэтому я думаю, что мне нужно было транспонировать мои образцы, чтобы преобразовать их в формат (цепочка, отрисовка), иначе я получаю NaN. Но теперь я получаю ответ 2,61, когда я запустил цепочку MCMC с разумными значениями 10000 образцов, поэтому я ожидаю чего-то большего, например 4000? Я вижу, когда я рисую это, было разумное исследование пространства параметров. Когда я печатаю idata.posterior, он говорит, что цепочка равна 0, 1, ничья равна 0, ......, 9999, а x - это значения выборки? - person Lizardinablizzard; 22.07.2020
comment
вы пробуете две цепи? Или вы сэмплируете 1 цепочку с 2 параметрами? Трудно догадаться, что происходит без минимального примера, возможно, вам поможет объяснение того, как вы сгенерировали образцы, ArviZ интегрируется с большинством библиотек Python PPL (см. arviz-devs.github.io/arviz/notebooks/InferenceDataCookbook.html), поэтому преобразование данных в формат, понятный ArviZ, является ключевой частью процесс - person OriolAbril; 22.07.2020
comment
Если бы вы были в ситуации с 1 цепочкой и 2 параметрами, но загрузка в ArviZ сгенерировала 2 цепочки и 1 параметр, неудивительно, что вы получите 2.6 в качестве ESS, вы бы рассматривали 2 параметра как один и тот же объект, распределение которого, скорее всего, будет быть мультимодальным. ArviZ по умолчанию реализует алгоритм из arxiv.org/pdf/1903.08008.pdf, который, как указано в внизу страницы 4: Для мультимодальных распределений с четко разделенными модами корректировка с разделением ̂R приводит к оценке ESS, которая близка к количеству найденных различных мод - person OriolAbril; 22.07.2020
comment
Я думаю, что это 1 цепочка из 2 параметров. В моем алгоритме mcmc я начинаю с 2D-координаты, а затем обхожу ее, если перемещение принято, координаты сохраняются в цепочке N x 2 до тех пор, пока не будут приняты N перемещений. Я пытаюсь что-то вроде az.ess(az.convert_to_inference_data(np.transpose(samples))), но теперь я понимаю, почему это будет близко к 2, хотя я не знаю, как это исправить, я проверю кулинарную книгу, спасибо! - person Lizardinablizzard; 22.07.2020
comment
Отлично, спасибо @oriolabril! Теперь я получаю два разных числа из ~ 400, но я думаю, что на самом деле стремлюсь к одному числу, потому что измерения коррелируют? Я не думаю, что было бы правильно просто добавить их. Я предполагаю, что я беру некоторое евклидово расстояние в 2D-пространстве между точками выборки, чтобы сделать массив выборок фактически 1D, или есть лучшие методы? Редактировать: ах, я думаю, мне нужно прочитать статью arxiv, спасибо! - person Lizardinablizzard; 24.07.2020
comment
На самом деле вы стремитесь к 2 значениям, каждый параметр будет иметь свою оценку, независимо от того, насколько они коррелированы. Более того, даже при коррелированных параметрах эти две эсс могут быть сколь угодно разными. - person OriolAbril; 24.07.2020