Pergunta sobre probability, plot, matlab, histogram – Como criar um lote de densidade conjunta 3D MATLAB?

1

Eu estou tendo um problema com a criação de uma função de densidade conjunta de dados. O que eu tenho são tamanhos de fila de um estoque como dois vetores salvos como:

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

Eu então uso a função hist3 para criar um histograma 3D. Isso é o que eu recebo:http://dl.dropbox.com/u/709705/hist-plot.png

O que eu quero é ter o eixo Z normalizado para que ele saia de [0 1].

Como faço isso? Ou alguém tem um ótimomatlab de densidade conjunta função em estoque?

Isso é semelhante (Como desenhar a função de densidade de probabilidade no MatLab?) mas em 2D.

O que eu quero é 3D comx:ask queue, y:bid queue, z:probability.

Ficaria muito grato se alguém pudesse me ajudar com isso, porque eu bati em uma parede aqui.

Sua resposta

3   a resposta
3

r as contagens de histograma de hist3 usando

<code>[N C] = hist3(X);
</code>

e a ideia seria normalizá-los com:

<code>N = N / sum(N(:));
</code>

mas não consigo encontrar uma boa maneira de plotá-los de volta para um histograma depois (você pode usarbar3(N), mas acho que os rótulos dos eixos precisarão ser definidos manualmente).

A solução que acabei envolve modificar o código dehist3. Se você tiver acesso a isso (edit hist3Então isso pode funcionar para você, mas não tenho certeza de qual é a situação legal (você precisa de uma licença para a caixa de ferramentas de estatísticas, se você copiar hist3 e modificá-la você mesmo, isso provavelmente não é legal).

Enfim, encontrei o lugar onde os dados estão sendo preparados para umsurf enredo. Existem 3 matrizes correspondentes a x, y e z. Pouco antes de o conteúdo da matriz z ser calculado (linha 256), inseri:

<code>n = n / sum(n(:));
</code>

que normaliza a matriz de contagem.

Finalmente, uma vez que o histograma é plotado, você pode definir os limites do eixo com:

<code>xlim([0, 1]);
</code>

se necessário.

Essa é uma maneira de fazer isso! E isso funciona! Groot
2

esta é a grande solução que acabei com:

(data_x e data_y são valores, que você deseja calcular em hist3)

<code>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
</code>

Isso me deu o gráfico de densidade conjunta em 3D. Que pode ser verificado calculando a integral sobre a superfície com:

<code>integralOverDensityPlot = sum(trapz(pdf_normalize));
</code>

Quando a variáveldegrau vai para zero a variávelintegralOverDensityPlot vai para 1,0

Espero que isso ajude alguém!

0

<code>[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)));
</code>

Se você "integrar", você terá 1.

<code>sum(sum(pdf * (c_1(2)-c_1(1)) * (c_2(2)-c_2(1))))
</code>

Perguntas relacionadas