Pregunta sobre matlab, histogram, probability, plot – ¿Cómo crear un diagrama de densidad conjunta 3D MATLAB?

1

Estoy teniendo un problema con la creación de una función de densidad conjunta a partir de datos. Lo que tengo son los tamaños de cola de un stock como dos vectores guardados como:

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

Luego uso la función hist3 para crear un histograma 3D. Esto es lo que obtengo:http://dl.dropbox.com/u/709705/hist-plot.png

Lo que quiero es tener el eje Z normalizado para que pase de [0 1].

¿Cómo puedo hacer eso? O alguien tiene un grandensidad articular matlab funciona en stock?

Esto es similar (¿Cómo dibujar la función de densidad de probabilidad en MatLab?) pero en 2D.

Lo que quiero es 3D conx:ask queue, y:bid queue, z:probability.

Apreciaría mucho si alguien pudiera ayudarme con esto, porque he golpeado un muro aquí.

Tu respuesta

3   la respuesta
3

No pude ver una forma simple de hacer esto. Puede obtener las cuentas del histograma de hist3 usando

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

Y la idea sería normalizarlos con:

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

pero no puedo encontrar una buena manera de trazarlos de nuevo en un histograma después (puede usarbar3(N), pero creo que las etiquetas de los ejes deberán ser configuradas manualmente).

La solución con la que terminé involucra la modificación del código dehist3. Si tienes acceso a esteedit hist3) entonces esto puede funcionar para usted, pero no estoy realmente seguro de cuál es la situación legal (necesita una licencia para el cuadro de herramientas de estadísticas, si copia hist3 y lo modifica usted mismo, es probable que esto no sea legal).

De todos modos, encontré el lugar donde se están preparando los datos para unasurf trama. Hay 3 matrices correspondientes a x, y, y z. Justo antes de calcular los contenidos de la matriz z (línea 256), inserté:

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

Lo que normaliza la matriz de conteo.

Finalmente, una vez que se traza el histograma, puede establecer los límites de los ejes con:

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

si necesario.

¡Esa es una forma de hacerlo! ¡Y funciona! Groot
0

Hay una forma rápida de hacer esto con la función hist3:

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

Si "integras" esto obtendrás 1.

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

Con la ayuda de un chico en el foro de mathworks, esta es la gran solución que terminé con:

(data_x y data_y son valores, que desea calcular en 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>

Esto me dio el gráfico de densidad conjunta en 3D. Lo cual se puede verificar calculando la integral sobre la superficie con:

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

Cuando la variablepaso va a cero la variableintegralOverDensityPlot va a 1.0

Espero que esto ayude a alguien!

Preguntas relacionadas