Ich interessiere mich für Statistiken über verschiedene zufällig ausgewählte Teilmengen einer großen Datenmatrix, und jetzt ist ein Flaschenhals in meinem Code die tatsächliche Unterabtastung. Das erscheint mir komisch, da es bei den unterabgetasteten Daten ziemlich viele O (N^2) -Distanzberechnungen gibt. Ich modifiziere die Subsamples überhaupt nicht, schaue sie nur an.Der schnellste Weg, um Sätze von Spalten aus großen Arrays in Julia zu unterteilen
using Distributions, Distances
function test_subsetting(X; batch_size=500, nloops=100)
nfeatures, nsamples = size(X)
ref_samples = X[:,1:10]
batch_inds = zeros(batch_size)
batch = zeros(nfeatures,batch_size)
d_matrix = zeros(batch_size,batch_size)
for i = 1:nloops
batch_inds = sort(sample(1:nsamples, batch_size, replace = false))
batch = X[:,batch_inds]
d_matrix = pairwise(SqEuclidean(), batch, ref_samples)
end
end
Als ich es testen, indem 50000 Probenmatrix auf einem 5000-Funktion aus:
X_test = randn(5000,50000);
Ich sehe, dass ich etwa die Hälfte meiner Zeit in _unsafe_getindex
in multidimensional.jl
verbringen, und die andere Hälfte der Abstandsberechnung zu tun .
Gibt es eine effizientere Möglichkeit, dieses Problem anzugehen?
Wenn Sie Ihre Matrix X zuerst vollständig mischen und dann nachfolgende Stapel von 'n'-Spalten daraus ziehen (wenn Sie es nach Bedarf neu mischen), könnte das die Dinge beschleunigen. Sie könnten auch in Betracht ziehen, Dinge zu parallelisieren. Diese Art des Samplings ist sehr gut geeignet, um diese Funktion für mehrere Arbeiter gleichzeitig auszuführen. –
Parallelisierung ist ein interessanter Gedanke, aber die Statistiken, die ich für jeden Batch verwende, werden verwendet, um die Statistik des nächsten Stapels in der nächsten Runde zu beeinflussen (das ist in meinem Beispiel nicht klar), also glaube ich nicht, dass es parallelisiert . Im Idealfall möchte ich das auf Dinge skalieren, die nicht in den Speicher passen, also ist es nicht der richtige Weg. – Rory
Ich denke, ich muss die 'batch' erstellen, oder vielleicht eine Stand-in, die nicht wirklich neuen Speicher für ein neues Array zuweisen, sondern nur die Daten in' X' und fakes es - ich sammle 'sub' und 'view' machen Dinge wie diese, aber ich konnte sie nicht dazu bringen, mit der' paarweisen' Funktion von 'distances.jl' zu arbeiten. – Rory