Распространение одних матричных элементов на другие с помощью взвешенных случайных чисел MATLAB

Итак, я пытался распространить один матричный элемент, который был сгенерирован с помощью poissrnd, на другой с использованием какой-то большей (более широкой?) функции вероятности (например, 100 различных возможностей с разными весами), чтобы построить их обе и посмотреть, будут ли колебания после распространения пошел вниз. Увидев, что это работает неправильно (колебания стали больше), я попытался определить, что я сделал неправильно, на очень простом примере. После очень долгого тестирования я до сих пор не могу понять, что не так. Пример выглядит следующим образом:

  1. Я генерирую вектор с помощью poissrnd и вектор для распространения (заполненный нулями в начале)
  2. Каждый элемент из вектора Пуасса говорит мне, сколько чисел (0,1 от значения элемента) нужно сгенерировать из возможных вариантов: [1,2,3] с соответствующими весами [0,2,0,5,0,2]
  3. Я распространяю то, что я получил, на свой другой вектор на 3 элемента: соответствующий (k-й), один до соответствующего и один после соответствующего (так, например, если k = 3, элементы должны быть распределены следующим образом: большинство должно перейти в 3-й элемент другого вектора, а остальные должны перейти во 2-й и 1-й элементы)
  4. Постройте как 0,1 * вектор Пуасса, так и вектор после распределения, чтобы сравнить, уменьшились ли колебания

Способ, которым я генерирую взвешенные числа, взят из этой темы: Взвешенные случайные числа в MATLAB

и это код, который я использую:

clear all
clc

eta=0.1;
N=200;
fot=10000000;
ix=linspace(-100,100,N);
mn =poissrnd(fot/N, 1, N);
dataw=zeros(1,N);
a=1:3;
w=[.25,.5,.25];

for k=1:N

   [~,R] = histc(rand(1,eta*mn(1,k)),cumsum([0;w(:)./sum(w)]));
   R = a(R);
   przydz=histc(R,a);
   if (k>1) && (k<N)
           dataw(1,k)=dataw(1,k)+przydz(1,2);
           dataw(1,k-1)=dataw(1,k-1)+przydz(1,1);
           dataw(1,k+1)=dataw(1,k+1)+przydz(1,3);
   elseif k==1
           dataw(1,k)=dataw(1,k)+przydz(1,2);
           dataw(1,N)=dataw(1,N)+przydz(1,1);
           dataw(1,k+1)=dataw(1,k+1)+przydz(1,3);
   else
           dataw(1,k)=dataw(1,k)+przydz(1,2);
           dataw(1,k-1)=dataw(1,k-1)+przydz(1,1);
           dataw(1,1)=dataw(1,1)+przydz(1,3);

   end


end


plot(ix,eta*mn,'g',ix,dataw,'r')

Колебания все еще больше, и я не могу определить, что не так... Неверен ли в этой ситуации метод генерации взвешенных чисел? Потому что не кажется. То, как я накапливаю данные из первого вектора, тоже кажется прекрасным. Есть ли другой способ сделать это (чтобы затем оптимизировать его для использования «больших» вероятностных функций)?

Извините за мой ужасный английский.

[РЕДАКТИРОВАТЬ]:

Вот простая картинка, чтобы показать, что я имел в виду (надеюсь, понятно)


person Warner    schedule 21.01.2015    source источник
comment
Я не понимаю, что вы подразумеваете под распространением вектора. Можете ли вы привести простой пример этой операции?   -  person Dave Kielpinski    schedule 21.01.2015
comment
так, например, если mn(1,4)=100, то dataw(1,3)=dataw(1,3)+0,25*mn(1,4), dataw(1,4)=dataw(1,4)+ 0,5*mn(1,4) и данныеw(1,5)=dataw(1,5)+0,25*mn(1,4). Затем он берет mn(1,5) и «распространяет» его на dataw(1,4), dataw(1,5) и dataw(1,6). Затем требуется mn(1,6) и так далее.   -  person Warner    schedule 21.01.2015
comment
добавил простую картинку, которая, надеюсь, поможет описать, что я пытаюсь сделать   -  person Warner    schedule 21.01.2015
comment
Так что операция распространения — это то, что я бы назвал сверткой. Проверьте функцию conv. Я думаю, что в строке [~,R] = histc(rand(1,eta*mn(1,k)),cumsum([0;w(:)./sum(w)])); тоже есть какая-то странность. Обычно rand вызывается с целочисленными аргументами, определяющими размер выходной матрицы, но здесь вы вызываете ее с помощью eta*mn(1,k), что выглядит как случайное действительное число, связанное с вашим распределением Пуассона. Можем ли мы разделить эти две проблемы?   -  person Dave Kielpinski    schedule 21.01.2015
comment
Я не могу использовать функцию conv. Речь идет о симуляции определенного процесса таким образом (ну не с размазыванием его на 3 элемента, это просто для выявления того, что не так в скрипте). О странностях, о которых вы упомянули изначально, это выглядит так: mnr=rand(1,mn(1,k)); eta_fot = длина (найти (mnr‹ = eta)); [~,R] = histc(rand(1,eta_fot),cumsum([0;w(:)./sum(w)])); Я закомментировал это, чтобы не усложнять мое описание   -  person Warner    schedule 21.01.2015
comment
Итак, вопрос в основном о распространении? Я не понимаю, почему это не эквивалентно свертке. Здесь было бы хорошо разделить вопросы.   -  person Dave Kielpinski    schedule 22.01.2015


Ответы (1)


Как насчет того, чтобы попробовать отрицательное биномиальное распределение? Его часто используют как гипердисперсный аналог распределения Пуассона. Дополнительные ссылки можно найти в этой статье, а также некоторый аппарат в дополнение.

person Dima Lituiev    schedule 21.01.2015
comment
В конечном счете, вместо того, чтобы использовать этот пример трехэлементного «разброса», я должен заменить свой вектор вероятности w на, например, обрезанную гауссоиду. Так что метод не должен меняться. Итак, в конце концов, мне нужно сохранить метод, который я сейчас использую, и изменить строки, которые делают скрипт ошибочным. Однако отладка резиновой утки у меня не работает. Вроде бы все хорошо, но сюжет говорит о другом. Тем не менее, спасибо за некоторые идеи. - person Warner; 22.01.2015
comment
@DimaLituiev - Чтобы проголосовать, нужно 15 репутации. У ОП еще не так много представителей, поэтому вам придется жить без голосов. - person rayryeng; 12.02.2015