Я пытаюсь реализовать взаимный алгоритм для оценки квантилей в данных, которые генерируются методом Монте-Карло. Я хочу сделать его итеративным, потому что у меня много итераций и переменных, поэтому хранение всех точек данных и использование функции Matlab quantile потребует значительной части памяти, которая мне действительно нужна для моделирования.Итеративная оценка квантилей в Matlab
Я нашел несколько подходов, основанных на Robbin-Monro process, предоставленные
Реализация с контрольной последовательностью гр т = с/т, где с постоянной довольно прямо вперед. В цитированной работе они показывают, что c = 2 * sqrt (2 * pi) дает неплохие результаты, по крайней мере, для медианы. Но они также предлагают адаптивный подход, основанный на оценке гистограммы. К сожалению, я еще не понял, как реализовать эту адаптацию.
Я проверил implementation with a constant c для трех тестовых образцов с 10.000 точками данных. Значение c = 2 * sqrt (2 * pi) не сработало для меня, но c = 100 выглядит неплохо для тестовых образцов. Тем не менее, это удаление не очень надежное и не удалось в реальном моделировании Монте-Карло, давая результаты в широких пределах.
probabilities = [0.1, 0.4, 0.7];
controlFactor = 100;
quantile = zeros(size(probabilities));
indicator = zeros(size(probabilities));
for index = 1:length(data)
control = controlFactor/index;
indices = (data(index) >= quantile);
indicator(indices) = probabilities(indices);
indices = (data(index) < quantile);
indicator(indices) = probabilities(indices) - 1;
quantile = quantile + control * indicator;
end
Есть более надежное решение для итерационного квантиль оценки или кто-нибудь есть для реализации адаптивного подхода с малым потреблением памяти?
Некоторые потенциальные проблемы: 'индексы' представляют собой массив' 1' и '0', не уверенный, что должны делать' вероятности (индексы) '. Кроме того, я бы подумал, что вы хотите что-то вроде «quantile (index) = quantile (index-1) + control * indicator;». Наконец, я думаю, что вы не реализовали 'c/t' правильно, я бы подумал, что' t' - это время, если экземпляры между вами данных не равны 1sek. – mpaskov
Спасибо за комментарий. На мой взгляд, индекс _t_ просто означает счетчик итераций, поэтому нет времени. Переменная «квантиль» представляет собой вектор такого же размера, как и вероятности, в этом случае 1x3, содержащий оценки итеративного квантиля для «вероятностей = [0,1, 0,4, 0,7]». Последняя строка в for-loop обновляет эту оценку. Конструкция индексов/индикаторов - это моя реализация функции индикатора _I_, которая выбирает, когда использовать «вероятности» или «вероятности - 1». – JotWe