Дискретный поверхностный интеграл с cumsum

У меня есть матрица z(x,y) Произвольный полиномиальный pdf:= zЭто абитарный PDF NxN, построенный из уникальная оценка плотности ядра (т.е. не обычный pdf и не имеет функции). Он многомерен и не может быть разделен и является дискретными данными.

Я не хочу строить матрицу NxN (F(x,y)), которая является кумулятивной функцией распределения в двух измерениях этого PDF-файла, чтобы затем я мог случайным образом выбрать F(x,y) = P(x ‹ X , у ‹ Y);

Аналитически я думаю, что CDF многомерной функции является поверхностным интегралом PDF.

То, что я пробовал, - это использовать функцию cumsum для вычисления поверхностного интеграла и протестировать это с многомерной нормалью по отношению к аналитическому решению, и, похоже, между ними есть некоторое несоответствие:

% multivariate parameters
delta = 100;
mu = [1 1];
Sigma = [0.25 .3; .3 1];
x1 = linspace(-2,4,delta); x2 = linspace(-2,4,delta);
[X1,X2] = meshgrid(x1,x2);
% Calculate Normal multivariate pdf
F = mvnpdf([X1(:) X2(:)],mu,Sigma);
F = reshape(F,length(x2),length(x1));
% My attempt at a numerical surface integral 
FN = cumsum(cumsum(F,1),2);
% Normalise the CDF
FN = FN./max(max(FN));
X = [X1(:) X2(:)];
% Analytic solution to a multivariate normal pdf
p = mvncdf(X,mu,Sigma);
p = reshape(p,delta,delta);
% Highlight the difference
dif = p - FN;
error = max(max(sqrt(dif.^2)));
% %% Plot
figure(1)
surf(x1,x2,F);
caxis([min(F(:))-.5*range(F(:)),max(F(:))]);
xlabel('x1'); ylabel('x2'); zlabel('Probability Density');
figure(2)
surf(X1,X2,FN);
xlabel('x1'); ylabel('x2');
figure(3);
surf(X1,X2,p);
xlabel('x1'); ylabel('x2');
figure(5)
surf(X1,X2,dif)
xlabel('x1'); ylabel('x2');

В частности, ошибка, по-видимому, находится в переходной области, которая является наиболее важной.

У кого-нибудь есть лучшее решение этой проблемы или я вижу, что я делаю неправильно?? Любая помощь приветствуется!

РЕДАКТИРОВАТЬ: Это желаемый результат кумулятивной интеграции. Причина, по которой эта функция представляет ценность для меня, заключается в том, что при случайном создании выборок из этой функции на закрытом интервале [0,1] более высокий взвешенный (т.е. более вероятные) значения появляются чаще, таким образом выборки сходятся к ожидаемому(ым) значению(ам) (в случае множественных пиков) это желаемый результат для таких алгоритмов, как фильтры частиц, нейронные сети и т.д. многовариантный cdf


person Chris    schedule 05.06.2014    source источник
comment
Использование trapz вместо cumsum может быть более точным: mathworks.com.au/ help/matlab/ref/trapz.html   -  person David    schedule 06.06.2014
comment
@David, как мне создать функцию CDF с помощью «trapz», насколько я знаю, «trapz» оценивает дискретный интеграл в числовой области (или объеме двумерного случая)?   -  person Chris    schedule 06.06.2014
comment
О, конечно, извините, мне это не поможет.   -  person David    schedule 06.06.2014


Ответы (2)


Сначала подумайте об одномерном случае. У вас есть функция, представленная вектором F, и вы хотите численно интегрировать ее. cumsum(F) сделает это, но использует плохую форму численного интегрирования. А именно, он рассматривает F как ступенчатую функцию. Вместо этого вы можете выполнить более точное числовое интегрирование, используя правило трапеций или правило Симпсона.

Двумерный случай ничем не отличается. Ваше использование cumsum(cumsum(F,1),2) снова рассматривает F как ступенчатую функцию, и числовые ошибки, возникающие в результате этого предположения, только ухудшаются по мере увеличения числа измерений интегрирования. Существуют двумерные аналоги правила трапеций и правила Симпсона. Поскольку здесь слишком много математики, чтобы повторять ее, взгляните сюда: http://onestopgate.com/gate-study-material/mathematics/numerical-analysis/numerical-integration/2d-trapezoidal.asp.

person Timothy Shields    schedule 06.06.2014
comment
Я просмотрел ссылку, и она кажется хорошим описанием того, как численно интегрировать в двумерном случае, я все еще не уверен, как использовать этот метод для создания функции (Функция дискретной поверхности: = Матрица NxN F (x, y )), который точно представляет поверхностный интеграл, который я могу затем выбрать случайным образом? - person Chris; 06.06.2014
comment
@Chriso Для первоначальных целей ваш подход cumsum(cumsum(F,1),2) должен работать, хотя и с неоптимальной точностью. Вы должны обновить свой вопрос изображением, которое вы получили в результате этого (чтобы были изображения как PDF, так и CDF), а затем уточнить, что вы подразумеваете под случайной выборкой. Если то, что вы пытаетесь сделать, это случайная выборка многомерного распределения Гаусса, это не способ сделать это. - person Timothy Shields; 06.06.2014
comment
Нет проблем, я обновлю вопрос с дополнительной информацией. К вашему сведению, я проверяю это с помощью многомерного гауссова, потому что он имеет точное решение, и я могу проверить точность алгоритма, но метод будет использоваться для произвольного PDF, построенного из свертки нескольких взвешенных ядер, что приводит к одному PDF произвольной формы. В этом pdf я не вижу другого способа случайной выборки, кроме как построить cdf и выборку F (x, y) = P (x ‹ X, y ‹ Y), как я указал в своем вопросе. Если вы знаете другой способ численной выборки этой функции, пожалуйста, дайте мне знать, с уважением, Крис. - person Chris; 06.06.2014
comment
О, я забыл упомянуть причину, по которой я выбираю CDF, потому что более вероятные значения выходят чаще, что и является целью. (Это часть алгоритма фильтра частиц) - person Chris; 06.06.2014
comment
@Chriso Если все, что вы делаете, это выборка, ваш текущий метод может быть уже достаточно точным. Обратите внимание, что вы, вероятно, можете использовать двухэтапный метод выборки: (1) выборочное дискретное распределение весов ядра для определения ядра (2) выборочное распределение ядра (многомерное гауссово). Я скептически отношусь к тому, что вам действительно нужно выполнять численное интегрирование. - person Timothy Shields; 06.06.2014

Вам НЕ нужно вычислять двумерный интеграл функции плотности вероятности, чтобы сделать выборку из распределения. Если вы вычисляете двумерный интеграл, вы неправильно решаете задачу.

Вот два подхода к проблеме выборки.

(1) Вы пишете, что у вас есть оценка плотности ядра. Оценка плотности ядра является частным случаем плотности смеси. Можно отобрать пробу смеси любой плотности, сначала выбрав одно ядро ​​(возможно, разного или одинакового веса, применяется та же процедура), а затем отобрав пробу из этого ядра. (Это применимо к любому количеству измерений.) Обычно ядра представляют собой некоторое относительно простое распределение, такое как распределение Гаусса, так что из него легко сделать выборку.

(2) Любая совместная плотность P(X, Y) равна P(X | Y) P(Y) (и, что эквивалентно, P(Y | X) P(X)). Поэтому вы можете семплировать из P(Y) (или P(X)) и затем из P(X | Y). Чтобы сделать выборку из P(X | Y), вам нужно будет проинтегрировать P(X, Y) вдоль линии Y = y (где y — выбранное значение Y), но (это важно) вам нужно только интегрировать по этой линии; вам не нужно интегрировать по всем значениям X и Y.

Если вы расскажете нам больше о своей проблеме, я могу помочь с деталями.

person Robert Dodier    schedule 08.06.2014