2012-04-12 4 views
1

J'ai un problème avec la création d'une fonction de densité conjointe à partir de données. Ce que j'est la taille de la file d'attente d'un stock que deux vecteurs enregistrés en tant que:Comment créer un diagramme de densité de joints 3D MATLAB?

X = [askQueueSize bidQueueSize]; 

J'utilise alors la hist3 fonction pour créer un histogramme 3D. Voici ce que je reçois: http://dl.dropbox.com/u/709705/hist-plot.png

Ce que je veux c'est que l'axe Z soit normalisé de sorte qu'il passe de [0 1].

Comment faire cela? Ou est-ce que quelqu'un a une bonne joint densité matlab fonction sur le stock?

Ceci est similaire (How to draw probability density function in MatLab?) mais en 2D. Ce que je veux est 3D avec x:ask queue, y:bid queue, z:probability.

J'apprécierais grandement que quelqu'un puisse m'aider avec ça, parce que j'ai frappé un mur ici.

Répondre

2

Avec l'aide d'un gars au forum MathWorks, c'est la grande solution j'ai fini avec:

(données_x et données_y sont des valeurs, que vous voulez calculer à 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 

Cette m'a donné l'intrigue de densité conjointe en 3D.Ce qui peut être vérifié en calculant l'intégrale sur la surface avec:

integralOverDensityPlot = sum(trapz(pdf_normalize)); 

Lorsque la variable étape passe à zéro, la variable integralOverDensityPlot va à 1,0

Hope this quelqu'un d'aide!

3

Je ne pouvais pas voir un moyen simple de le faire. Vous pouvez obtenir les comptes de l'histogramme retour de hist3 en utilisant

[N C] = hist3(X); 

et l'idée serait de les normaliser avec:

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

mais je ne peux pas trouver un moyen agréable de les rétrodéfinir à un histogramme après (vous pouvez utiliser bar3(N), mais je pense que les étiquettes des axes devront être définies manuellement).

La solution que j'ai fini par implique de modifier le code de hist3. Si vous avez accès à cela (edit hist3) alors cela peut fonctionner pour vous, mais je ne suis pas vraiment sûr de la situation juridique (vous avez besoin d'une licence pour la boîte à outils statistiques, si vous copiez hist3 et modifiez vous-même pas légal).

Quoi qu'il en soit, j'ai trouvé l'endroit où les données sont en cours de préparation pour un graphique surf. Il y a 3 matrices correspondant à x, y et z. Juste avant que le contenu de la matrice z ait été calculé (ligne 256), j'ai inséré:

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

qui normalise la matrice de comptage.

Enfin, une fois l'histogramme est tracé, vous pouvez définir les limites d'axe avec:

xlim([0, 1]); 

si nécessaire.

+0

C'est une façon de le faire! Et il fonctionne! – Groot

0

Il est un moyen rapide comment faire avec la fonction 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))); 

Si vous « intégrez » cela vous obtiendrez 1.

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