Werte in einem Intervall gleichverteilt?



  • Wie kann ich feststellen ob int-Werte in einem Intervall "ungefähr" gleichverteilt sind. Ich habe 100K Samples und hätte nun gerne einen Test der mir sagt ob diese Werte in einem gegebenen Intervall gleichverteilt sind oder nicht (weil es bspw. lokale Häufungen gibt).

    Beispiel "fair dice roll": ich habe 100K Würfel-Samples und möchte nun feststellen wie "fair" dieser Würfel ist.

    Gibt es dafür einen guten (und einfachen :)) statistischen Test?

    Dasselbe möchte ich auch für Dezimalzahlen machen (sprich nicht mehr discrete uniformly data sondern continuous uniformly data). Welchen Test gibt es dafür? Ist der KS-Test geeignet?



  • Meine Mathe ist zwar etwas eingerostet, aber aus der Statistik ist doch was hängen geblieben:
    https://de.wikipedia.org/wiki/Chi-Quadrat-Test



  • @martin-richter Was spuckt der Test denn aus, wenn Du ihn auf die ersten 100'000 Ziffern der Zahl π\pi oder ee anwendest?

    @C14 sagte in Häufigkeitsverteilung modellieren:

    Wichtig ist, dass du aus einem hohen p-Wert nichts schließen kannst.
    Deswegen sind dises statistischen Tests auf eine bestimmte Verteilung nicht zu gebrauchen, wenn du aus Daten auf irgendwas schließen und dabei seriöse Fehlerschranken angeben willst.
    Das geht nur mit mehr Aufwand ( http://en.wikipedia.org/wiki/Statistical_learning_theory ).

    🤧 🧐

    @sidewinder sagte in Werte in einem Intervall gleichverteilt?:

    Beispiel "fair dice roll": ich habe 100K Würfel-Samples und möchte nun feststellen wie "fair" dieser Würfel ist.

    Also beim fairen Würfeln - wenn Du fair würfelst, d.h. jedes Mal darauf acht gibst, nicht genau gleich zu würfeln - ist die Wahrscheinlichkeit jeweils 16\frac{1}{6} eine bestimmte Augenzahl oder Seite zu würfeln.

    So gesehen bietet es sich an, π\pi und ee in ein Stellenwertsystem mit Basis 6 umzurechnen und zu schauen, wie weit du kommst die richtigen Ziffern zu würfeln 🤧 🤧 🤧

    Wenn Du jetzt sagst, ich möchte Wissen, ob die Würfelseite mit der Augenzahl 1 fair ist, könnte man es glaube ich auch als Bernoulliverteilung mit Parameter p=16p = \frac{1}{6} auffassen. Also Du machst ein Sample z.B. der Grösse n=20n = 20, also würfelst 20 mal und zählst wie oft die Augenzahl 1 aufgetreten ist.

    Dann musst Du aber noch das Konfidenzintervall dafür konstruieren bzw. herleiten.

    Vielleicht kann man sogar, wenn es sich um Zeiten bis zu einem Ereignisse (event) handelt, als Zeitreihe mit Nullen und Einsen auffassen. Und die entsprechende geometrische Verteilung als Ereigniszeiten. Nähme mich wunder, ob sich die Konfidenzintervalle unterscheiden und wenn ja weshalb, also die Stichprobengrösse (sample size) ist ja dann bei der Bernoulliverteilung grösser.

    Früher dachte ich z.B. die Exponentialverteilung ist easy, da sie nur einen Parameter λ\lambda hat. Aber um das richtige Konfidenzintervall zu bekommen, muss man glaube ich trotzdem so etwas wie eine t-Verteilung herleiten.


  • |  Mod

    Was möchtest du erreichen? Du sagst "testen ob gleichverteilt", aber vermutlich gibt es einen größeren Kontext und du möchtest die Zahlen für irgendwas benutzen und dich durch den "gleichverteilt"-Test gegen einen bestimmten Angriff oder ein bestimmtes Problem schützen? Ich würde sagen es hängt sehr von diesem Angriff oder Problem ab, welche Tests und welcher Aufwand gerechtfertigt sind.

    Pseudozufallszahlengeneratoren (PRNG) entwickeln und testen ist aber auch ein ganzes Forschungsgebiet.

    Falls es dir nicht um Kryptografie geht: Der "Mersenne Twister"-Algorithmus ist einer der üblichsten guten PRNG, deswegen würde ich vielleicht da anfangen und schauen, mit welchen Argumenten und Tests dessen Existenz gerechtfertigt wird (für Kryptografie ist das aber alles unbrauchbar).



  • Es ist mehr Interesse in dem Fall und weniger eine konkrete Aufgabenstellung. Der Chi-Quadrat-Test scheint schon ganz nett zu sein, aber offenbar auch nicht das Gelbe vom Ei wenn man von einem hohen p-Wert auf nichts schließen kann (seid ihr euch da sicher, titan99?).

    Habe https://softwareengineering.stackexchange.com/questions/147134/how-should-i-test-randomness und https://stackoverflow.com/questions/2130621/how-to-test-a-random-generator gefunden. Es scheint da eigene Test-Suites zu geben ob ein PRNG gut ist. Spannende Sache 🙂

    MfG SideWinder



  • @sidewinder sagte in Werte in einem Intervall gleichverteilt?:

    Der Chi-Quadrat-Test scheint schon ganz nett zu sein, aber offenbar auch nicht das Gelbe vom Ei wenn man von einem hohen p-Wert auf nichts schließen kann (seid ihr euch da sicher, titan99?).

    Nein, sicher bin ich nicht, vor allem nicht im Detail. Zudem kenne ich beim Chi-Quadrat-Test nur den Namen.

    Aber z.B. in der Diss von Horst Rönnebeck steht glaube ich ab Seite 6, dass die Weibullverteilung "plausibel" erscheint, aber sich dann trotzdem als falsch herausstellt (Glaube weil die Dichte ähnlich ausschaut, aber andere Dichten schauen eben auch ähnlich aus).

    @christoph sagte in Werte in einem Intervall gleichverteilt?:

    Pseudozufallszahlengeneratoren (PRNG) entwickeln und testen ist aber auch ein ganzes Forschungsgebiet.

    Ja, aber dann sind (Wahrscheinlichkeit-)Verteilung und tatsächliche Parameter immer bekannt, da man sie ja eingibt. Das ist aber bei Daten IMHO normalerweise nicht so.

    Also bei RdRand spricht man glaube ich gar nicht mehr von PRNG (also ich meine ohne Pseudo).

    #include <immintrin.h>
    #include <random>
    
    class rdrand32
    {
    public:
    	static unsigned int min()
    	{
    		return 0;
    	}
    	static unsigned int max()
    	{
    		return static_cast<unsigned int>(-1);
    	}
    	unsigned int operator()() const
    	{
    		unsigned int random;
    		_rdrand32_step(&random); // use -mrdrnd compiler option for g++ / GCC C++ compiler
    		return random;
    	}
    };
    
    
    template<typename T>
    class RandomNumberGenerator
    {
    public:
    	
    	typedef typename T::result_type U;
    	
    	RandomNumberGenerator(const T& randomdistribution)
    		: randomdistribution(randomdistribution)
    	{}
    
    	U RandomNumber()
    	{
    		return randomdistribution(rdrand);
    	}
    	void GenerateSample(size_t samplesize, std::vector<U>* sample)
    	{
    		sample->resize(samplesize);
    		for (auto& variable : *sample)
    		{
    			variable = RandomNumber();
    		}
    	}
    
    private:
    	rdrand32 rdrand;
    	T randomdistribution;
    };
    

    Habe es zur Zeit nicht auf github, da ich einen grossen Teil des Codes geschlissen habe. Zudem bin ich auf meiner roadmap viel zu langsam bzw. stecken geblieben 🤧 🤧 🤧