Finden Sie heraus, ob die beiden Datensätze nahe beieinander liegen

7

Ich habe die folgenden drei Datensätze.

data_a=[0.21,0.24,0.36,0.56,0.67,0.72,0.74,0.83,0.84,0.87,0.91,0.94,0.97]
data_b=[0.13,0.21,0.27,0.34,0.36,0.45,0.49,0.65,0.66,0.90]
data_c=[0.14,0.18,0.19,0.33,0.45,0.47,0.55,0.75,0.78,0.82]

data_a sind reale Daten und die anderen beiden sind die simulierten. Hier versuche ich zu überprüfen, welches (data_b oder data_c) dem data_a am nächsten kommt oder ihm sehr ähnlich ist. Derzeit mache ich es visuell und mit ks_2samp Test (Python).

Visuell

Ich habe das cdf von realen Daten gegen das cdf von simulierten Daten grafisch dargestellt und versucht, visuell das zu sehen, welches am nächsten ist.

cdf von data_a vs data_b

Oben ist das cdf von data_a vs cdf von data_b Geben Sie hier die Bildbeschreibung ein

Oben ist das cdf von data_a vs cdf von data_c

Wenn man es also visuell sieht, kann man sagen, dass data_c näher an data_a liegt als data_b, aber es ist immer noch nicht genau.

KS Test

Die zweite Methode ist der KS-Test, bei dem ich data_a mit data_b sowie data_a mit data_c getestet habe.

>>> stats.ks_2samp(data_a,data_b)
Ks_2sampResult(statistic=0.5923076923076923, pvalue=0.02134674813035231)
>>> stats.ks_2samp(data_a,data_c)
Ks_2sampResult(statistic=0.4692307692307692, pvalue=0.11575018162481227)

Von oben können wir sehen, dass die Statistik niedriger ist, wenn wir data_a mit data_c getestet haben, sodass data_c näher an data_a als an data_b liegen sollte. Ich habe den p-Wert nicht berücksichtigt, da es nicht angebracht wäre, ihn als Hypothesentest zu betrachten und den erhaltenen p-Wert zu verwenden, da der Test mit der vorgegebenen Nullhypothese entworfen wurde.

Meine Frage hier ist also, ob ich das richtig mache und ob es auch einen anderen besseren Weg gibt, es zu tun ??? Vielen Dank

Kartikeya Sharma
quelle
1
Sind Sie sicher, dass dies CDF-Diagramme der Daten sind? Empirische CDF-Diagramme dieser Daten sind diese . Es scheint, dass Sie die Werte auf der y-Achse über eine Standard-x-Achse zeichnen. Sind die Werte in Ihren variablen Beobachtungen oder Punkten auf der CDF?
Edmund
@Fatemehhh Hallo, ich zeichne diese beiden Diagramme nicht in einem einzigen, da es Hunderte anderer Datensätze gibt, die ich mit dem realen Datensatz vergleichen und herausfinden muss, welcher dem realen Datensatz am nächsten kommt. Grundsätzlich versuche ich, einen Parameter zu approximieren, der unterschiedliche simulierte Datensätze mit unterschiedlichen Werten generiert. Wenn der simulierte Datensatz dem realen Datensatz am nächsten kommt, gibt es den richtigen Parameter!
Kartikeya Sharma
@ Edmund Ich denke du bist richtig, diese Werte sind die variable Beobachtung und ich zeichne die Werte auf der y-Achse über eine Standard-x-Achse. x_points=np.asarray(list(range(0,len(data_a)))) >>> x_points=x_points/len(data_a) >>> plt.plot(x_points,data_a) >>> x_points=np.asarray(list(range(0,len(data_b)))) >>> x_points=np.asarray(list(range(0,len(data_c)))) >>> x_points=x_points/len(data_c) >>> plt.plot(x_points,data_c) Dies ist der Code. Aber meine Frage ist, wie man die Nähe zwischen den beiden Datensätzen finden kann
Kartikeya Sharma
2
Wäre es nicht besser, einfach eine Verteilung an die beobachteten Daten anzupassen? Es scheint etwas kompliziert und rechenintensiv zu sein, Parameter zu erraten, Ergebnisse zu simulieren und Ähnlichkeiten zu testen.
Edmund
1
Das fühlt sich sehr nach einem XY-Problem an . Bitte teilen Sie das Problem, das Sie lösen möchten, anstelle dieses Teils der Lösung des Problems mit.
Edmund

Antworten:

5

Sie könnten einen informationstheoretischen Ansatz wählen, indem Sie die geringste Kullback-Leibler-Divergenz zwischen den Verteilungen ermitteln. Innerhalb der Entropiefunktion von SciPy gibt es eine KL-Divergenzoption .

>>> from scipy.stats import entropy

>>> p = [0.21,0.24,0.36,0.56,0.67,0.72,0.74,0.83,0.84,0.87] # Data removed to make equal sizes: [0.91,0.94,0.97]
>>> q_1 = [0.13,0.21,0.27,0.34,0.36,0.45,0.49,0.65,0.66,0.90]
>>> print(entropy(p, q_1)) 
0.019822015024454846

>>> q_2 =[0.14,0.18,0.19,0.33,0.45,0.47,0.55,0.75,0.78,0.82]
>>> print(entropy(p, q_2))
0.01737229446663193

Die zweite simulierte Verteilung ist näher als die erste simulierte Verteilung an der realen Verteilung.

Wenn Sie an Inferenz interessiert sind, können Sie viele Simulationen ausführen und p-Werte berechnen. Dieser Prozess ist eine Variation des Permutationstests .

Brian Spiering
quelle
Vielen Dank für Ihre Antwort, aber warum sollten Sie die Daten aus der tatsächlichen Verteilung entfernen? Ich verstehe, dass die scipy-Methode nur mit gleichen Datensätzen funktioniert, aber welche Elemente der Daten müssen entfernt werden oder warum? Hier sehe ich, dass du die letzten entfernt hast. Gibt es auch keine Möglichkeit, damit es bei ungleichen Datensätzen funktioniert?
Kartikeya Sharma
3
Ich habe willkürlich Daten entfernt, damit das Codebeispiel funktioniert. Wenn es mein Projekt wäre, würde ich keine echten Daten entfernen. Ich würde Daten so simulieren, dass sie die gleiche Größe wie die realen Daten haben. Der Umgang mit ungleichen Datensätzen wäre nicht erforderlich, da ich Daten gleicher Größe generieren würde. Da dies Ihr Projekt ist, können Sie auswählen, welche Daten entfernt werden sollen, wenn Sie die KL-Divergenzmethode von SciPy verwenden.
Brian Spiering
2

Erwägen Sie die Verwendung der Erdbewegungsentfernung (dh der Wasserstein-1- Entfernung), die (ähnlich der KL-Divergenz) verwendet werden kann, um die "Entfernung" zwischen Punktmengen (oder vielmehr die durch sie induzierte empirische Verteilung) zu berechnen. Es gibt eine Methode in scipy dafür sowie diese Bibliothek .

Einige Notizen:

  • Sie müssen nicht die gleiche Anzahl von Punkten in jedem Satz haben (die EMD ermöglicht das "Aufteilen" der Masse).
  • Ein Vorteil gegenüber der KL-Divergenz besteht darin, dass die KLD undefiniert oder unendlich sein kann, wenn die Verteilungen keine identische Unterstützung haben (obwohl die Verwendung der Jensen-Shannon-Divergenz dies abschwächt). Darüber hinaus ist das Schätzen von Entropien oft schwierig und nicht parameterfrei (normalerweise erfordert Binning oder KDE), während EMD-Optimierungen direkt an den Eingabedatenpunkten gelöst werden können.
  • Ein Vorteil gegenüber einfachen Statistiken (z. B. Vergleichen von Mitteln und Kovarianzen oder Normen) besteht darin, dass sie dazu neigen, Informationen zu verlieren. Wenn Sie beispielsweise die ersten beiden Momente abgleichen, wird der dritte Moment nicht zum Abgleichen gezwungen. oder zwei Datensätze können dieselbe Norm haben, obwohl sie sehr unterschiedlich sind (für Punkte hat jeder Punkt auf der Hyperkugel mit demselben Radius die gleiche Norm). Im Gegensatz dazu muss die EMD die Beziehung jedes Punktes in einem Satz zu jedem Punkt im anderen berücksichtigen.nn
  • Ich halte die Verwendung des KS-Tests für völlig vernünftig. Siehe auch diesen Beitrag . Eine Einschränkung ist, dass die Verwendung des Supremums etwas extrem ist. Zum Beispiel hat eine Verteilung irgendwann eine große CDF-Abweichung und ist den Rest der Zeit sehr nahe an einer anderen, die für einige winzige viele Male um abweicht - die KS-Statistik wird die erstere bevorzugen. Es liegt an Ihnen, ob das Sinn macht.δδϵϵ
user3658307
quelle
1

Da wir keine Daten entfernen sollten ... können wir die Vektornorm vom Ursprung verwenden (l2-Norm)

gegebene Daten_a, Daten_b, Daten_c sind Arrays.

 import numpy as np    
 import pandas as pd
 from numpy.linalg import norm
 l2_a=norm(data_a)
 l2_b=norm(data_b)
 l2_c=norm(data_c)
 print(l2_a,l2_b,l2_c)

Ausgabe : 2.619885493680974 1.5779100101083077 1.6631897065578538.

da l2_a, l2_c Werte näher sind, sind data_a und data_c nahe beieinander.

tharun___ Datenbegeisterter
quelle