Vraag:
Het optimale aantal bakken in een histogram berekenen
Tony Stark
2010-07-27 20:21:48 UTC
view on stackexchange narkive permalink

Ik ben geïnteresseerd in het vinden van een zo optimaal mogelijke methode om te bepalen hoeveel bakken ik in een histogram moet gebruiken. Mijn gegevens moeten variëren van 30 tot maximaal 350 objecten, en in het bijzonder probeer ik drempels toe te passen (zoals de methode van Otsu) waar 'goede' objecten, waarvan ik er minder zou moeten hebben en die meer verspreid zouden moeten zijn, worden gescheiden van ' slechte 'objecten, die een hogere waarde zouden moeten hebben. Een concrete waarde zou voor elk object een score van 1-10 hebben. Ik had 5-10 objecten met scores 6-10 en 20-25 objecten met scores 1-4. Ik zou graag een histogram-binningpatroon willen vinden dat over het algemeen zoiets als de methode van Otsu toestaat om de laag scorende objecten te beperken. Bij de implementatie van Otsu's die ik heb gezien, was de bin-grootte echter 256, en vaak heb ik veel minder datapunten dan 256, wat volgens mij suggereert dat 256 geen goed bin-nummer is. Met zo weinig gegevens, welke benaderingen moet ik nemen om het aantal te gebruiken bakken te berekenen?

Ik denk dat de regel van Sturges kan worden gebruikt voor n <200;waarbij n het aantal waarnemingen is
Acht antwoorden:
#1
+114
Rob Hyndman
2010-07-28 05:23:22 UTC
view on stackexchange narkive permalink

De regel Freedman-Diaconis is erg robuust en werkt goed in de praktijk. De bin-breedte is ingesteld op $ h = 2 \ times \ text {IQR} \ times n ^ {- 1/3} $ . Het aantal bakken is dus $ (\ max- \ min) / h $ , waarbij $ n $ is het aantal waarnemingen, max is de maximumwaarde en min is de minimumwaarde.

In basis R kun je gebruiken:

  hist (x, breaks = "FD")  

Voor andere plotbibliotheken zonder deze optie (bijv. ggplot2 ), kunt u de binwidth berekenen als:

  bw <- 2 * IQR (x) / length (x) ^ (1/3) ### bijvoorbeeld ##### ggplot () + geom_histogram (aes (x), binwidth = bw)  
Als een opmerking, standaard (dus, als u geen `pauzes` specificeert) R
@nico. De standaardwaarde in R is breaks = "Sturges", wat niet altijd goede resultaten geeft.
om welke reden dan ook werd mijn commentaar afgekapt ... ik wilde standaard schrijven "(dus, als je geen pauzes specificeert) R gebruikt het Sturges-algoritme" ... odd!
Hoe bereken je 'IQR'?
@KurtMueller IQR betekent interkwartielbereik.Zoek naar het 1e kwartiel en het 3e kwartiel en het verschil is IQR.IQR wordt al geleverd met R, dus je kunt hem gebruiken.
In R wordt het Freedman-Diaconis-algoritme geïmplementeerd als functie `nclass.FD` in het pakket grDevices (standaard geïnstalleerd).`hist` gebruikt deze functie als` braks = "FD" `.
Ik denk dat deze formule mogelijk niet werkt als sommige gegevens meerdere keren voorkomen.Het nemen van een gelijk gewogen gemiddelde voor repetitieve gegevens, waarop deze formule misschien is gebaseerd, zou de schatting naar vaker voorkomende waarden vertekenen.
Nr. Lengte (x) is het aantal waarnemingen.bereik (x) = c (min (x), max (x)).
U kunt meer informatie over de variabelen toevoegen.Het kan tijd besparen en mensen sneller helpen.Wat is: n, max, min?
Als ik me niet vergis, zou het antwoord moeten zijn: 'num_bins <- diff (range (x)) / (2 * IQR (x) / length (x) ^ (1/3))'
Heb je http://users.stat.umn.edu/~gmeeden/papers/hist.pdf gelezen?Wat vind je van deze benadering van het minimaliseren van een functie in vergelijking met de Freedman-Diaconis-regel?
Een gedrag dat ik tegenkwam met de Freedman Diaconis-regel is dat als ik twee datasets heb, de ene aanzienlijk groter is dan de andere (1000x), elk met slechts één kolom, die beide uit dezelfde distributie komen (dwz dezelfde IQR), danhet aantal bakken wordt 10x meer in de grotere set. Is dit gedrag wenselijk?Wat zouden de effecten zijn van deze toename van het aantal bakken naarmate het aantal waarnemingen toeneemt?
Over "Hoe IQR berekenen?"kijk op http://stat.ethz.ch/R-manual/R-devel/library/stats/html/quantile.html of https://cran.r-project.org/doc/manuals/fullrefman.pdf p.1571
Het moet `binwidth <- (2 * IQR (x)) / lengte (x) ^ (1/3)` zijn
waarom niet wijzen op al geïmplementeerde `nclass.FD`?
`nclass.FD` bestond negen jaar geleden niet.
Jezus Christus, zijn we zover gevallen?Wat is er gebeurd met oordelen met onze ogen?
#2
+20
Harvey Motulsky
2010-07-27 21:17:44 UTC
view on stackexchange narkive permalink

Als u te weinig opslaglocaties gebruikt, geeft het histogram de gegevens niet echt goed weer. Als je te veel bakken hebt, krijg je een kapotte kam-look, die ook geen idee geeft van de verdeling.

Een oplossing is om een ​​grafiek te maken die elke waarde laat zien. Ofwel een puntplot of een cumulatieve frequentieverdeling, waarvoor geen opslaglocaties nodig zijn.

Als u een frequentieverdeling wilt creëren met bakken op gelijke afstanden, moet u beslissen hoeveel bakken (of de breedte van elk). De beslissing hangt duidelijk af van het aantal waarden. Als u veel waarden heeft, ziet uw grafiek er beter uit en is hij informatiever als u veel bakken heeft. Deze Wikipedia-pagina geeft een overzicht van verschillende methoden om de bakbreedte te bepalen op basis van het aantal waarnemingen. De eenvoudigste methode is om het aantal bakken gelijk te stellen aan de vierkantswortel van het aantal waarden dat je aan het verzamelen bent.

Deze pagina van Hideaki Shimazaki legt een alternatieve methode uit. Het is een beetje ingewikkelder om te berekenen, maar het lijkt geweldig werk te leveren. Het bovenste gedeelte van de pagina is een Java-app. Scroll daar voorbij om de theorie en uitleg te zien, en blijf scrollen om links te vinden naar de artikelen die de methode uitleggen.

De link naar de pagina van Hideaki is verbroken. Ik weet niet zeker of dit hetzelfde is: http://toyoizumilab.brain.riken.jp/hideaki/res/histogram.html
#3
+11
ars
2010-07-28 12:23:23 UTC
view on stackexchange narkive permalink

Misschien is de paper " Variations on the histogram" van Denby en Mallows interessant:

Deze nieuwe weergave die we 'dhist' noemen (voor diagonaal -cut histogram) behoudt de gewenste kenmerken van zowel de hist met gelijke breedte als de hist met gelijke oppervlakte. Het toont hoge smalle bakken zoals de ea hist wanneer er pieken in de gegevens zijn en toont geïsoleerde uitschieters, net als het gebruikelijke histogram.

Ze vermelden ook dat code in R op verzoek beschikbaar is .

#4
+7
Girardi
2012-08-24 02:48:47 UTC
view on stackexchange narkive permalink

Heb je de Shimazaki-Shinomoto -methode gezien?

Hoewel het rekenkundig duur lijkt, kan het goede resultaten opleveren. Het is de moeite waard om het eens te proberen als rekentijd niet jouw probleem is. Er zijn enkele implementaties van deze methode in java, MATLAB, enz., In de volgende link, die snel genoeg werkt: webinterface

Hier is een implementatie: https://gist.github.com/salotz/0158a99a75078b47538452111ec0faa2.En ja, het is duurder omdat u een bereik kiest voor het aantal bakken en u voor elk een histogram moet maken en vervolgens de kosten moet berekenen, en vervolgens de minst kostbare kiest.
#5
+5
Ian Turner
2010-07-27 20:30:31 UTC
view on stackexchange narkive permalink

Ik weet niet zeker of dit strikt een goede gewoonte is, maar ik heb de neiging om meer dan één histogram met verschillende bakbreedten te produceren en het histogram te kiezen welk histogram ik moet gebruiken op basis van welk histogram past bij de interpretatie die ik het beste probeer te communiceren . Hoewel dit enige subjectiviteit introduceert in de keuze van het histogram, rechtvaardig ik het met de basis dat ik veel meer tijd heb gehad om de gegevens te begrijpen dan de persoon aan wie ik het histogram geef, dus ik moet ze een heel beknopt bericht geven.

Ik ben ook een grote fan van het presenteren van histogrammen met hetzelfde aantal punten in elke bak in plaats van dezelfde bakbreedte. Ik vind meestal dat deze de gegevens veel beter weergeven dan de constante bakbreedte, hoewel ze moeilijker te produceren zijn.

sorry, ik had moeten zeggen dat ik dit op een geautomatiseerde manier moet doen. de optie om "het meerdere keren te doen totdat ik degene vind die het beste bij mijn doel past" zal niet werken voor mij. moet rekenkundig worden gedaan ...
Ik ben het ermee eens - het idee dat er één "optimale" bakbreedte is, is een enorm vereenvoudigende aanname.
#6
+3
Benjamin Bannier
2010-07-27 23:47:26 UTC
view on stackexchange narkive permalink

Als ik het aantal bakken programmatisch moet bepalen, begin ik meestal met een histogram met veel meer bakken dan nodig. Zodra het histogram is gevuld, combineer ik bakken totdat ik genoeg invoer per bak heb voor de methode die ik gebruik, bijv. als ik Poisson-onzekerheden wil modelleren in een telexperiment met onzekerheden van een normale verdeling tot ik meer dan ongeveer 10 ingangen heb.

#7
+2
Anastasiya-Romanova 秀
2018-12-15 23:21:15 UTC
view on stackexchange narkive permalink

Zie dit antwoord als een aanvulling op Mr. Antwoord van Rob Hyndman.

Om histogramplots te maken met exact dezelfde intervallen of 'binwidths' met behulp van de Freedman – Diaconis-regel met het basis R- of ggplot2 -pakket, kunnen we een van de volgende gebruiken de waarden van de hist () functie namelijk breekt . Stel dat we een histogram willen maken van qsec van mtcars -gegevens met behulp van de Freedman-Diaconis-regel. In basis R gebruiken we

  x <- mtcars $ qsec
hist (x, breaks = "FD")
 

Ondertussen gebruiken we in het ggplot2 -pakket

  h <- hist (x, breaks = "FD", plot = FALSE)
qplot (x, geom = "histogram", breaks = h $ breaks, fill = I ("red"), col = I ("white"))
 

Of, alternatief

  ggplot (mtcars, aes (x)) + geom_histogram (breaks = h $ breaks, col = "white")
 

Ze genereren allemaal histogramplots met exact dezelfde intervallen en hetzelfde aantal bakken als bedoeld.

#8
-5
Sergo Cusiani
2015-02-19 14:42:55 UTC
view on stackexchange narkive permalink

Ik heb 600 waarnemingen voor Au g / t. Bin size 1 geeft me dit: enter image description here

Automatische selectie (laat het bin-bereik weg) geeft dit: enter image description here

De gegevens zien er O'K uit op de eerste en tweede grafieken , alsof er geen probleem is met de gegevensintegriteit. Alleen bin-grootte 0,1 (g / t) beantwoordt de vraag: de metingen waren zowel onnauwkeurig als onnauwkeurig enter image description here

Mijn oordeel: 1. Er is geen meting techniek op aarde om de ware waarde van natuurverschijnselen aan te tonen. Alle metingen zijn bij benadering, sommige liggen dicht bij de werkelijke waarde. Het hangt af van het ontwerp van de steekproef, de kalibratie, de menselijke kwalificaties, enz. 2. Dit is de reden waarom de verdeling scheef is in plaats van symmetrisch.3. Niettemin moet de vorm van de verdeling lijken op een "klokachtig" gedeelte, tenminste ongeveer. Eén bel per keer (tenzij er meerdere geologische omgevingen zijn) Frequentieverdeling met de manipulatie van de bakgrootte kan helpen om een ​​patroon te onthullen over hoe nauwkeurig en precies de metingen waren gedaan. Zodat men een experimentele pick-up van de bakmaat nodig heeft in plaats van een regel die op steen is gehouwen.

Dit is meer een opmerking dan een antwoord, tenzij je de moraal beschrijft.Ik zou zeggen dat de moraal dit is: alle regels zijn vuistregels, sommige hebben meer statistische basis dan andere, maar de meeste regels doen misschien niet wat je wilt als distributies een zeer hoge scheefheid of kurtosis hebben.Gebruik dus ook uw oordeel.
Je hebt opmerkingen toegevoegd, maar het is niet duidelijk of er nuttige nieuwe details aan de thread worden toegevoegd.1. is prima voor mij, maar niet het probleem hier.2. volgt niet uit 1. aangezien sommige distributies bijna symmetrisch zijn.3. is twijfelachtig: er zijn veel situaties waarin andere vormen dan bellen worden verwacht.4. is ook twijfelachtig aangezien de kwaliteit van de oorspronkelijke metingen vaak niet uit een histogram blijkt, maar vaak het beste kan worden bekeken met aandacht voor de zeer fijne structuur van een distributie.
2. Bijna symmetrisch is niet symmetrisch.Je kunt bijna niet zwanger zijn: zwanger of niet.
Zeker, maar exacte symmetrie in gegevens is zo zeldzaam dat als ik "symmetrisch" had gezegd, iemand daar redelijkerwijs ook bezwaar tegen zou hebben.Het is heel gemakkelijk om bijna symmetrisch te zijn;dat is waarom en hoe we maten van scheefheid hebben.
Mijn zin tussen haakjes (tenzij er verschillende geologische omgevingen zijn) verklaart een geval waarin de vormen anders dan symmetrisch worden verwacht.4. Ik schreef "KAN HELPEN om een patroon te onthullen over hoe nauwkeurig en precies ...", wat niet betekent dat het in elk geval zal werken.In mijn geval - JA, aangezien de dubbele monsters werden gecontroleerd door een onafhankelijk laboratorium en een normale verdeling vertoonden.
Opgemerkt, maar uw opmerking was algemeen en miste de context die u nu geeft.Op mijn beurt zei ik "dubieus" niet "fout".Mijn belangrijkste opmerking blijft dat je antwoord niet echt veel toevoegt aan de discussie over het kiezen van de bakgrootte of het equivalente aantal bakken.Een ander voorbeeld hebben waarin het moeilijk is, is een draai aan de vraag, niet echt een antwoord.


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 2.0-licentie waaronder het wordt gedistribueerd.
Loading...