Histogramme de valeurs discrètes avec matplotlib
J'ai parfois de l'histogramme des valeurs discrètes avec matplotlib. Dans ce cas, le choix de la zone de binning peut être crucial: si vous histogramme [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] à l'aide de 10 bacs, l'un des bacs de deux fois plus de compte comme les autres. En d'autres termes, la binsize devrait normalement être un multiple de la discrétisation de la taille.
Alors que ce simple cas est relativement facile à gérer par moi-même, quelqu'un aurait-il un pointeur vers une bibliothèque/fonction qui permettrait de prendre soin de cette automcatically, y compris dans le cas de données en virgule flottante où la discrétisation de la taille pourrait être légèrement différentes en raison de FP arrondi?
Grâce.
OriginalL'auteur antony | 2015-05-07
Vous devez vous connecter pour publier un commentaire.
Donné le titre de votre question, je vais supposer que la discrétisation de la taille est constante.
Vous pouvez trouver cette discrétisation de la taille (ou au moins, strictement, n fois que la taille que vous ne pouvez pas avoir deux échantillons adjacents dans vos données)
Ce trouve les valeurs uniques de vos données (
np.unique
), trouve les différences entre ensuite (np.diff
). Le unique est nécessaire afin que vous n'obtenez pas les valeurs nulles. Vous ensuite de trouver le minimum de différence. Il pourrait y avoir des problèmes avec ce où la discrétisation de la constante est très faible, je reviendrai.Prochaine vous voulez que vos valeurs dans le milieu de l'emplacement de votre problème actuel est parce que les deux 9 et 10 sont sur les bords de la dernière bin que matplotlib fournit automatiquement, de sorte que vous obtenez deux échantillons dans un bac.
Soi - essayez ceci:
Cela donne:
Petit non entier de discrétisation
Nous pouvons faire un peu plus d'un jeu de données de test par exemple
Si vous exécutez ensuite qu'à travers le tableau ci-dessus et avoir un regard sur le
d
que le code crache, vous verrezSi la valeur détectée de
d
n'est pas la "vraie" valeur denasty_d
que les données a été créé. Toutefois - avec le truc de changer les poubelles par la moitié ded
pour obtenir les valeurs du milieu - il ne devrait pas sauf votre discrétisation est très très petit, de sorte que votre bas dans les limites de la précision d'un flotteur ou vous avez 1000s de bacs et de la différence entre détectéd
et "réel" de discrétisation est possible de construire un tel point que l'un des bacs de "manque" le point de données. C'est quelque chose d'être conscient, mais ne sera probablement pas vous frapper.Un exemple de la parcelle pour le ci-dessus est
Non uniforme de discrétisation /les plus appropriés, bacs...
Pour d'autres cas plus complexes, vous pourriez aimer regarder ce blog je l'ai trouvé. Cela ressemble à des moyens de automatiquement "apprentissage" le meilleur bin largeurs de (continu ou quasi-continu) des données, la consultation de multiples techniques standard telles que Sturges " la règle et Freedman et Diaconis règle avant de développer son propre Bayésien dynamique de la méthode de programmation.
Si c'est votre cas d'utilisation, - la question est beaucoup plus large et ne peut pas être adapté à une réponse définitive sur Stack Overflow, bien que nous espérons que les liens de l'aide.
Merci. Bonne place sur la typo - j'ai nettoyé jusqu'à maintenant.
beau travail, résout un vrai problème 🙂
Note à moi-même: utile histogramme options:
plt.hist(x, bins = bins, density = True, color = "green", ec = "black"
oùec
signifie "bord de couleur".OriginalL'auteur J Richard Snape
Peut-être une moins-réponse complète que J Richard Snape est, mais j'ai appris récemment et que j'ai trouvé intuitive et facile.
S'avère que près de 16/100 jette sera le même numéro!
OriginalL'auteur Manuel Martinez