2012-04-12 2 views
1

У меня возникла проблема с созданием совместной функции плотности из данных. Что у меня есть размеры очередей из запаса, как два вектора сохранен как:Как создать трехмерную плотность плотности спутника MATLAB?

X = [askQueueSize bidQueueSize]; 

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

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

Как это сделать? Или у кого-то есть отличная сумка плотности , а также плотность на складе? функция на складе?

Это похоже (How to draw probability density function in MatLab?), но в 2D.

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

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

ответ

2

С помощью парня на MathWorks форуме, это великое решение, которое я закончил с:

(Данные_Х и данные_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)); 

Когда переменная шаг стремится к нулю, переменная integralOverDensityPlot идет в 1,0

Надежда это кому-то помочь!

3

Я не мог видеть простой способ сделать это. Вы можете получить отсчеты гистограммы назад от hist3 с помощью

[N C] = hist3(X); 

и идея будет нормализовать их:

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

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

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

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

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

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

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

xlim([0, 1]); 

при необходимости.

+0

Это один из способов сделать это! И это работает! – Groot

0

Существует быстрый способ, как сделать это с помощью функции hist3:

[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)))) 
Смежные вопросы