Melden Sie eine zweistufige KS-Statistik aus zwei vorberechneten Histogrammen

Problem:

Hier habe ich 2 Datensätze, die in Textdateien (im Listen- dataset ) gespeichert sind, mit jeweils 21,8 Milliarden Datenpunkten. Dies macht die Daten zu groß, um im Speicher als Array zu halten. Ich bin immer noch in der Lage, sie als Histogramme zu zeichnen, aber ich bin unsicher, wie man ihren Unterschied über einen 2 Probe KS Test berechnen kann. Dies ist, weil ich nicht herausfinden kann, wie man auf jedes Histogramm im plt-Objekt zugreift.

Beispiel:

Hier ist ein Code, um Dummy-Daten zu generieren:

 mu = [100, 120] sigma = 30 dataset = ['gsl_test_1.txt', 'gsl_test_2.txt'] for idx, file in enumerate(dataset): dist = np.random.normal(mu[idx], sigma, 10000) with open(file, 'w') as g: for s in dist: g.write('{}\t{}\t{}\n'.format('stuff', 'stuff', str(s))) 

Dies erzeugt meine beiden Histogramme ( hier möglich gemacht):

 chunksize = 1000 dataset = ['gsl_test_1.txt', 'gsl_test_2.txt'] for fh in dataset: # find the min, max, line qty, for bins low = np.inf high = -np.inf loop = 0 for chunk in pd.read_table(fh, header=None, chunksize=chunksize, delimiter='\t'): low = np.minimum(chunk.iloc[:, 2].min(), low) high = np.maximum(chunk.iloc[:, 2].max(), high) loop += 1 lines = loop*chunksize nbins = math.ceil(math.sqrt(lines)) bin_edges = np.linspace(low, high, nbins + 1) total = np.zeros(nbins, np.int64) # np.ndarray filled with np.uint32 zeros, CHANGED TO int64 for chunk in pd.read_table(fh, header=None, chunksize=chunksize, delimiter='\t'): # compute bin counts over the 3rd column subtotal, e = np.histogram(chunk.iloc[:, 2], bins=bin_edges) # np.ndarray filled with np.int64 # accumulate bin counts over chunks total += subtotal plt.hist(bin_edges[:-1], bins=bin_edges, weights=total) plt.savefig('gsl_test_hist.svg') 

Frage:

Die meisten Beispiele für KS-Statistiken verwenden zwei Arrays von Rohdaten / Beobachtungen / Punkten / etc, aber ich habe nicht genug Speicher, um diesen Ansatz zu verwenden. Wie kann ich nach dem obigen Beispiel auf diese vorberechneten Bins zugreifen (von 'gsl_test_1.txt' und 'gsl_test_2.txt' , um die KS-Statistik zwischen den beiden Distributionen zu berechnen?

Bonus Karma: Aufzeichnen der KS-Statistik und pvalue auf dem Diagramm!

One Solution collect form web for “Melden Sie eine zweistufige KS-Statistik aus zwei vorberechneten Histogrammen”

Ich habe deinen Code aufgeräumt. Schreiben in StringIO b / c ist es effizienter als das Schreiben in eine Datei. Setzen Sie die Standard-Vibe w / seaborn b / c matplotlib Defaults sind matplotlib . Youre bins Schwellen sollten die gleichen für beide Samples, wenn Sie wollen, dass der Stat Test Line-up. Ich glaube nicht, dass du durch die Beine hervortreten und die Bins auf diese Weise machen soll, das Ganze wird länger dauern, als es braucht. Sie sollten wirklich versuchen, dass Counter Sache, so dass Sie nur einmal durchlaufen müssen … plus Sie werden in der Lage, die gleiche Bin-Größe zu machen. Konvertiere einfach Schwimmer zu Ints, da du sie trotzdem zusammenbringst. from collections import Counter dann C = Counter() und C[value] += 1 . Du wirst am Ende list(C.keys()) haben, wo man die Fächer aus der list(C.keys()) . Das wäre gut da deine Daten so knorrig sind. Auch, sollten Sie sehen, ob es einen Weg zu tun, chunksize mit numpy anstelle von pandas b / c numpy ist WAY schneller bei der Indizierung. Versuche eine %timeit für DF.iloc[i,j] und ARRAY[i,j] und du wirst sehen, was ich meine. Ich habe alles in Funktionen gemacht, also ist es modularer

 import numpy as np import pandas as pd import math import matplotlib.pyplot as plt from io import StringIO from scipy.stats import ks_2samp import seaborn as sns; sns.set() %matplotlib inline #Added seaborn b/c it looks mo betta mu = [100, 120] sigma = 30 def write_random(file,mu,sigma=30): dist = np.random.normal(mu, sigma, 10000) for i,s in enumerate(dist): file.write('{}\t{}\t{}\n'.format("label_A-%d" % i, "label_B-%d" % i, str(s))) return(file) #Writing to StringIO instead of an actual file gs1_test_1 = write_random(StringIO(),mu=100) gs1_test_2 = write_random(StringIO(),mu=120) chunksize = 1000 def make_hist(fh,ax): # find the min, max, line qty, for bins low = np.inf high = -np.inf loop = 0 fh.seek(0) for chunk in pd.read_table(fh, header=None, chunksize=chunksize, sep='\t'): low = np.minimum(chunk.iloc[:, 2].min(), low) #btw, iloc is way slower than numpy array indexing high = np.maximum(chunk.iloc[:, 2].max(), high) #you might wanna import and do the chunks with numpy loop += 1 lines = loop*chunksize nbins = math.ceil(math.sqrt(lines)) bin_edges = np.linspace(low, high, nbins + 1) total = np.zeros(nbins, np.int64) # np.ndarray filled with np.uint32 zeros, CHANGED TO int64 fh.seek(0) for chunk in pd.read_table(fh, header=None, chunksize=chunksize, delimiter='\t'): # compute bin counts over the 3rd column subtotal, e = np.histogram(chunk.iloc[:, 2], bins=bin_edges) # np.ndarray filled with np.int64 # accumulate bin counts over chunks total += subtotal plt.hist(bin_edges[:-1], bins=bin_edges, weights=total,axes=ax,alpha=0.5) return(ax,bin_edges,total) #Make the plot canvas to write on to give it to the function fig,ax = plt.subplots() test_1_data = make_hist(gs1_test_1,ax) test_2_data = make_hist(gs1_test_2,ax) #test_1_data[1] == test_2_data[1] The bins should be the same if you're going try and compare them... ax.set_title("ks: %f, p_in_the_v: %f" % ks_2samp(test_1_data[2], test_2_data[2])) 

Bildbeschreibung hier eingeben

  • Wie kann ich redundante Komponenten für das DPGMM von Scikit-Learn richtig entfernen?
  • Anpassen von Daten an Verteilungen?
  • Pandas - Berechnen Sie z-Score für alle Spalten
  • Beispiel für die Umsetzung von Baum-Welch
  • Dimensionsreduktion in kategorischen Daten mit fehlenden Werten
  • Statistik für Histogramm von periodischen Daten
  • Überlagern von mehreren Histogrammen mit Pandas
  • Berechnen der Ableitung der kumulativen Dichtefunktion in Python
  • Numpy cov (Kovarianz) Funktion, was genau berechnet es?
  • Numpy konvertieren kategorische String Arrays zu einem Integer-Array
  • XGBoost CV und beste Iteration
  • Python ist die beste Programmiersprache der Welt.