2016-10-27 18 views
0

Я пытаюсь реализовать взаимный алгоритм для оценки квантилей в данных, которые генерируются методом Монте-Карло. Я хочу сделать его итеративным, потому что у меня много итераций и переменных, поэтому хранение всех точек данных и использование функции Matlab quantile потребует значительной части памяти, которая мне действительно нужна для моделирования.Итеративная оценка квантилей в Matlab

Я нашел несколько подходов, основанных на Robbin-Monro process, предоставленные

Formula

Реализация с контрольной последовательностью гр т = с/т, где с постоянной довольно прямо вперед. В цитированной работе они показывают, что 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 

Есть более надежное решение для итерационного квантиль оценки или кто-нибудь есть для реализации адаптивного подхода с малым потреблением памяти?

+0

Некоторые потенциальные проблемы: 'индексы' представляют собой массив' 1' и '0', не уверенный, что должны делать' вероятности (индексы) '. Кроме того, я бы подумал, что вы хотите что-то вроде «quantile (index) = quantile (index-1) + control * indicator;». Наконец, я думаю, что вы не реализовали 'c/t' правильно, я бы подумал, что' t' - это время, если экземпляры между вами данных не равны 1sek. – mpaskov

+0

Спасибо за комментарий. На мой взгляд, индекс _t_ просто означает счетчик итераций, поэтому нет времени. Переменная «квантиль» представляет собой вектор такого же размера, как и вероятности, в этом случае 1x3, содержащий оценки итеративного квантиля для «вероятностей = [0,1, 0,4, 0,7]». Последняя строка в for-loop обновляет эту оценку. Конструкция индексов/индикаторов - это моя реализация функции индикатора _I_, которая выбирает, когда использовать «вероятности» или «вероятности - 1». – JotWe

ответ

0

После того, как некоторые из адаптивных итеративных подходов, которые я нашел в литературе, без особого успеха (не уверен, если бы все было правильно), я придумал решение, которое дает хорошие результаты для моих тестовых образцов, а также для фактическое Монте-Карло-симуляция.

Я буфера подмножества результатов моделирования, вычисляю квантованные образцы и в среднем по всем квантовым количествам подмножества в конце. Это, кажется, работает достаточно хорошо и без настройки многих параметров. Единственный параметр - размер буфера, который в моем случае равен 100.

Результаты сходятся довольно быстро, и увеличение размера выборки не улучшает результаты. Кажется, что существует небольшое, но постоянное смещение, которое предположительно является усредненной ошибкой квантов квантов подмножества. И это недостаток моего решения. Выбирая размер буфера, можно зафиксировать достижимую точность. Увеличение размера буфера уменьшает это смещение. В конце концов, похоже, это компромисс между памятью и точностью.

% Generate data 
rng('default'); 
data = sqrt(0.5) * randn(10000, 1) + 5 * rand(10000, 1) + 10; 

% Set parameters 
probabilities = 0.2; 

% Compute reference sample quantiles 
quantileEstimation1 = quantile(data, probabilities); 

% Estimate quantiles with computing the mean over a number of subset 
% sample quantiles 
subsetSize = 100; 
quantileSum = 0; 
for index = 1:length(data)/subsetSize; 

    quantileSum = quantileSum + quantile(data(((index - 1) * subsetSize + 1):(index * subsetSize)), probabilities); 

end 
quantileEstimation2 = quantileSum/(length(data)/subsetSize); 

% Estimate quantiles with iterative computation 
quantileEstimation3 = zeros(size(probabilities)); 
indicator = zeros(size(probabilities)); 
controlFactor = 2 * sqrt(2 * pi); 
for index = 1:length(data) 

    control = controlFactor/index; 
    indices = (data(index) >= quantileEstimation3); 
    indicator(indices) = probabilities(indices); 
    indices = (data(index) < quantileEstimation3); 
    indicator(indices) = probabilities(indices) - 1; 
    quantileEstimation3 = quantileEstimation3 + control * indicator; 

end 

fprintf('Reference result: %f\nSubset result: %f\nIterative result: %f\n\n', quantileEstimation1, quantileEstimation2, quantileEstimation3); 
+0

Я только что нашел [этот пост] (http://stats.stackexchange.com/questions/171784/estimation-of-quantile-given-quantiles-of-subset) поверх Cross Validated. Кажется, это связано. – JotWe

+0

Имеет смысл, что 'quantileEstimation3' будет сходиться быстро или насыщаться, так как коэффициент управления' control' быстро падает, поэтому новые изменения адаптируются все медленнее. – mpaskov

+0

Да, но даже адаптация контрольного фактора, который я нашел и попытался, не улучшил результаты для меня. – JotWe