Итак, я пытался распространить один матричный элемент, который был сгенерирован с помощью poissrnd, на другой с использованием какой-то большей (более широкой?) функции вероятности (например, 100 различных возможностей с разными весами), чтобы построить их обе и посмотреть, будут ли колебания после распространения пошел вниз. Увидев, что это работает неправильно (колебания стали больше), я попытался определить, что я сделал неправильно, на очень простом примере. После очень долгого тестирования я до сих пор не могу понять, что не так. Пример выглядит следующим образом:
- Я генерирую вектор с помощью poissrnd и вектор для распространения (заполненный нулями в начале)
- Каждый элемент из вектора Пуасса говорит мне, сколько чисел (0,1 от значения элемента) нужно сгенерировать из возможных вариантов: [1,2,3] с соответствующими весами [0,2,0,5,0,2]
- Я распространяю то, что я получил, на свой другой вектор на 3 элемента: соответствующий (k-й), один до соответствующего и один после соответствующего (так, например, если k = 3, элементы должны быть распределены следующим образом: большинство должно перейти в 3-й элемент другого вектора, а остальные должны перейти во 2-й и 1-й элементы)
- Постройте как 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')
Колебания все еще больше, и я не могу определить, что не так... Неверен ли в этой ситуации метод генерации взвешенных чисел? Потому что не кажется. То, как я накапливаю данные из первого вектора, тоже кажется прекрасным. Есть ли другой способ сделать это (чтобы затем оптимизировать его для использования «больших» вероятностных функций)?
Извините за мой ужасный английский.
[РЕДАКТИРОВАТЬ]:
Вот простая картинка, чтобы показать, что я имел в виду (надеюсь, понятно)
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