2015-08-14 3 views
2

У меня есть набор данных, которые я хотел аппроксимировать с помощью случайной выборки в непараметрической форме, например:Использование бен подсчитывает в качестве весов для выбора случайных чисел

eventl= 
4 
5 
6 
8 
10 
11 
12 
24 
32 

Для того, чтобы достичь этого, я изначально бен вверх данные до определенного значения:

binsize = 5; 
nbins = 20; 
[bincounts,ind] = histc(eventl,1:binsize:binsize*nbins); 

Затем заселить матрицу со всеми возможными числами, охватываемым закромах которых приближение можно выбрать:

sizes = transpose(1:binsize*nbins); 

Использовать счетчик бункеров в качестве весов для выбора, т.е. bincount (1-5) = 2, таким образом, вес для выбора 1,2,3,4 или 5 = 2, тогда как (16-20) = 0, так 16,17 , 18, 19 или 20 не может быть выбран, я просто взять bincounts и тиражировать их по размеру бен:

w = repelem(bincounts,binsize); 

Чтобы затем выполнить выбор взвешенного номера, я использую:

[~,R] = histc(rand(1,1),cumsum([0;w(:)./sum(w)])); 
R = sizes(R); 

Для некоторых почему этот подход не может аппроксимировать данные. Это было мое понимание того, что было достаточной глубины выборки, то Binned версия R будет идентична Binned версии eventl однако есть существенные различия и часто данные находятся в бункерах, чей вес был 0.

Может кто-нибудь предложить лучший метод сделать это или указать на ошибку?

+0

Я не совсем понимая ваше объяснение того, как вы выбираете веса: говорят ваши данные [5 5 6 6 6 7 8]. Теперь вы делаете bin # 1, содержащий [5 6] и bin # 2, содержащий [7 8]. Вы хотите, как выходы 1 и 2, в 2,5 раза больше, чем 1 в 2? Вы хотите 5,6,7,8 с весами [2,3,1,1], соответственно? – Jonas

+0

Если данные были [5 5 6 6 6 7 8] в бункерах 1-5 (count = 2) и 6-10 (count = 5), выбор 1,2,3,4 или 5 происходит при частота в 2,5 раза ниже, чем выбор 6,7,8,9 или 10. Счетчик дисков описывает частоту, с которой можно выбрать любое количество в этом диапазоне бинов. – AnnaSchumann

+0

Это означало бы, что 6 следует выбирать с равной частотой, равной 8, верно, хотя исходные данные contais 3x равны числу 6? – Jonas

ответ

2

Для лучшего метода, я предлагаю randsample:

values = [1 2 3 4 5 6 7 8]; %# values from which you want to pick 
numberOfElements = 1000; %# how many values you want to pick 
weights = [2 2 2 2 2 1 1 1]; %# weights given to the values (1-5 are twice as likely as 6-8) 

sample = randsample(values, numberOfElements, true, weights); 

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

enter image description here

+0

Спасибо за ваш ответ. Моя основная проблема заключается в генерации весов и их выравнивании с бункерами, а не изменении частоты. Мой подход каким-то образом генерирует значения в ячейках, значения которых должны быть 0 и, следовательно, никогда не выбираться. – AnnaSchumann

+0

Этот метод работает хорошо и дает почти идентичный результат. Не знаю, почему мой оригинальный метод не делает! – AnnaSchumann

Смежные вопросы