Вопрос по matlab – Как создать 3D плотностный плоттер MATLAB?

1

У меня проблема с созданием функции плотности соединения из данных. То, что у меня есть, это размеры очереди из запаса, поскольку два вектора сохранены как:

<code>X = [askQueueSize bidQueueSize];
</code>

Затем я использую функцию hist3 для создания трехмерной гистограммы. Вот что я получаю: http://dl.dropbox.com/u/709705/hist-plot.png

Я хочу, чтобы ось Z была нормализована так, чтобы она шла из [0 1].

Как я могу это сделать? Или у кого-то есть отличныйjoint density matlab функция на складе?

Это похоже (Как нарисовать функцию плотности вероятности в MatLab?) но в 2D.

То, что я хочу, это 3D сx:ask queue, y:bid queue, z:probability.

Буду очень признателен, если кто-нибудь сможет мне помочь с этим, потому что я врезался в стену здесь.

Ваш Ответ

3   ответа
3

ы гистограммы от исторических данных, используя

[N C] = hist3(X);

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

N = N / sum(N(:));

но я не могу найти хороший способ вывести их обратно на гистограмму (вы можете использоватьbar3(N), но я думаю, что метки осей нужно будет установить вручную).

Решение, которое я выбрал, включает в себя изменение кодаhist3, Если у вас есть доступ к этому (edit hist3) тогда это может сработать для вас, но я не совсем уверен, какова юридическая ситуация (вам нужна лицензия для набора инструментов статистики, если вы копируете history3 и изменяете ее самостоятельно, это, вероятно, не разрешено законом).

Во всяком случае, я нашел место, где данные готовятся дляsurf сюжет. Есть 3 матрицы, соответствующие x, y и z. Непосредственно перед тем, как было вычислено содержимое z-матрицы (строка 256), я вставил:

n = n / sum(n(:));

который нормализует матрицу счета.

Наконец, после построения гистограммы вы можете установить пределы оси с помощью:

xlim([0, 1]);

если необходимо.

Error: User Rate Limit Exceeded Groot
2

это отличное решение, которое я выбрал:

(data_x и data_y - это значения, которые вы хотите вычислить в Hist3)

x = min_x:step:max_x; % axis x, which you want to see
y = min_y:step:max_y; % axis y, which you want to see

[X,Y] = meshgrid(x,y); *%important for "surf" - makes defined grid*

pdf = hist3([data_x , data_y],{x y}); %standard hist3 (calculated for yours axis)
pdf_normalize = (pdf'./length(data_x)); %normalization means devide it by length of 
                                         %data_x (or data_y)
figure()
surf(X,Y,pdf_normalize) % plot distribution

Это дало мне общий график плотности в 3D. Что можно проверить, рассчитав интеграл по поверхности с помощью:

integralOverDensityPlot = sum(trapz(pdf_normalize));

Когда переменнаяstep обнуляет переменнуюintegralOverDensityPlot идет до 1,0

Надеюсь, это поможет кому-то!

0

[bins centers] = hist3(X); % X should be matrix with two columns
c_1 = centers{1};
c_2 = centers{2};
pdf = bins / (sum(sum(bins))*(c_1(2)-c_1(1)) * (c_2(2)-c_2(1)));

Если вы "интегрируете" это вы получите 1.

sum(sum(pdf * (c_1(2)-c_1(1)) * (c_2(2)-c_2(1))))

Похожие вопросы