48 votes

Comment normaliser un histogramme dans MATLAB ?

Comment normaliser un histogramme de telle sorte que l'aire sous la fonction de densité de probabilité soit égale à 1 ?

123voto

r.m. Points 25280

Ma réponse à cette question est la même que dans une réponse à votre question précédente . Pour une fonction de densité de probabilité, l'intégrale sur l'espace entier est 1 . En divisant par la somme, on obtient pas vous donner la densité correcte. Pour obtenir la bonne densité, vous devez diviser par la surface. Pour illustrer mon propos, essayez l'exemple suivant.

[f, x] = hist(randn(10000, 1), 50); % Create histogram from a normal distribution.
g = 1 / sqrt(2 * pi) * exp(-0.5 * x .^ 2); % pdf of the normal distribution

% METHOD 1: DIVIDE BY SUM
figure(1)
bar(x, f / sum(f)); hold on
plot(x, g, 'r'); hold off

% METHOD 2: DIVIDE BY AREA
figure(2)
bar(x, f / trapz(x, f)); hold on
plot(x, g, 'r'); hold off

Vous pouvez voir par vous-même quelle méthode correspond à la bonne réponse (courbe rouge).

enter image description here

Une autre méthode (plus simple que la méthode 2) pour normaliser l'histogramme consiste à diviser par sum(f * dx) qui exprime l'intégrale de la fonction de densité de probabilité, c'est-à-dire

% METHOD 3: DIVIDE BY AREA USING sum()
figure(3)
dx = diff(x(1:2))
bar(x, f / sum(f * dx)); hold on
plot(x, g, 'r'); hold off

2 votes

La somme des "Diviser par le chiffre de la surface" n'est pas égale à 1. Je vois au moins 10 points de diagramme en bâtons supérieurs à 0,3. 0.3*10 = 3.0 Une solution plus simple ne serait-elle pas de diviser f par le nombre d'échantillons ? Dans ce cas, 10000.

9 votes

@Rich Les barres sont plus fines que 1, donc votre calcul est faux. Considérez le triangle situé sous la courbe de (-2,0) à (0, 0.4) et (2, 0) pour estimer l'aire. Ce triangle a une aire de 0,5*4*0,4 = 0,8 < 1,0

2 votes

Pour obtenir une somme égale à 1, il faut multiplier la nouvelle somme de bacs par la largeur du bac.

11voto

Simon Points 8717

hist peut non seulement tracer un histogramme mais aussi vous renvoyer le nombre d'éléments dans chaque case, vous pouvez donc obtenir ce nombre, le normaliser en divisant chaque case par le total et tracer le résultat en utilisant bar . Exemple :

Y = rand(10,1);
C = hist(Y);
C = C ./ sum(C);
bar(C)

ou si vous voulez une phrase toute faite :

bar(hist(Y) ./ sum(hist(Y)))

Documentation :

Edit : Cette solution répond à la question Comment faire en sorte que la somme de tous les bacs soit égale à 1 ? . Cette approximation n'est valable que si la taille de votre bin est petite par rapport à la variance de vos données. La somme utilisée ici correspond à une simple formule de quadrature, des formules plus complexes peuvent être utilisées comme trapz comme proposé par R. M.

5voto

Moppi Points 51
[f,x]=hist(data)

La surface de chaque barre individuelle est égale à la hauteur*largeur. Puisque MATLAB choisira des points équidistants pour les barres, la largeur est donc de :

delta_x = x(2) - x(1)

Maintenant, si nous additionnons toutes les barres individuelles, la superficie totale sera de

A=sum(f)*delta_x

Ainsi, le graphique correctement mis à l'échelle est obtenu par

bar(x, f/sum(f)/(x(2)-x(1)))

1voto

user1240280 Points 96

Pour certaines distributions, comme celle de Cauchy, j'ai constaté que trapz surestime l'aire, et donc que la fdp change en fonction du nombre de bins sélectionnés. Dans ce cas, je fais

[N,h]=hist(q_f./theta,30000); % there Is a large range but most of the bins will be empty
plot(h,N/(sum(N)*mean(diff(h))),'+r')

0 votes

Bonjour ! Est-ce que la quantité moyenne(diff(h)) est censé être la largeur des bacs ?

1voto

anna Points 11

Il existe un excellent guide en trois parties pour Ajustements des histogrammes dans MATLAB ( lien original brisé , lien vers archive.org ), la première partie est consacrée à l'étirement des histogrammes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X