P
ist eine n * d-Matrix, die n
d-dimensionale Proben enthält. P
in einigen Bereichen ist mehrere Male dichter als andere. Ich möchte eine Teilmenge von P
auswählen, in der der Abstand zwischen irgendwelchen Paaren von Proben mehr als d0
ist, und ich brauche es, um über die Fläche verteilt zu werden. Alle Abtastwerte haben dieselbe Priorität, und es ist nicht notwendig, irgendetwas zu optimieren (z. B. die abgedeckte Fläche oder die Summe der paarweisen Abstände).Wie wählt man eine gleichmäßig verteilte Teilmenge eines teilweise dichten Datensatzes?
Hier ist ein Beispielcode, der das tut, aber es ist wirklich langsam. Ich brauche einen effizienteren Code, da ich ihn mehrmals aufrufen muss.
%% generating sample data
n_4 = 1000; n_2 = n_4*2;n = n_4*4;
x1=[ randn(n_4, 1)*10+30; randn(n_4, 1)*3 + 60];
y1=[ randn(n_4, 1)*5 + 35; randn(n_4, 1)*20 + 80 ];
x2 = rand(n_2, 1)*(max(x1)-min(x1)) + min(x1);
y2 = rand(n_2, 1)*(max(y1)-min(y1)) + min(y1);
P = [x1,y1;x2, y2];
%% eliminating close ones
tic
d0 = 1.5;
D = pdist2(P, P);D(1:n+1:end) = inf;
E = zeros(n, 1); % eliminated ones
for i=1:n-1
if ~E(i)
CloseOnes = (D(i,:)<d0) & ((1:n)>i) & (~E');
E(CloseOnes) = 1;
end
end
P2 = P(~E, :);
toc
%% plotting samples
subplot(121); scatter(P(:, 1), P(:, 2)); axis equal;
subplot(122); scatter(P2(:, 1), P2(:, 2)); axis equal;
Edit: Wie gross ist die Teilmenge enthalten sein sollte?
Wie j_random_hacker in Kommentaren hingewiesen, kann man sagen, dass P(1, :)
die schnellste Antwort ist, wenn wir keine Einschränkung für die Anzahl der ausgewählten Proben definieren. Es zeigt zierlich Inkohärenz des Titels! Aber ich denke, der aktuelle Titel beschreibt den Zweck besser. Lassen Sie uns eine Einschränkung definieren: "Versuchen Sie, m
Beispiele auszuwählen, wenn es möglich ist". Mit der impliziten Annahme von m=n
können wir nun die größtmögliche Teilmenge erhalten. Wie ich bereits erwähnt habe, übertrifft eine schnellere Methode diejenige, die die optimale Antwort findet.
Seien Sie sich bewusst sein, dass mehr als die Hälfte der Zeit wird in 'pdist2 (P, P)', so dass auch die Berechnung die Entfernung aufgenommen, wenn Sie vollständig die Schleife optimieren, werden Sie nur die Hälfte der Gesamtausführungszeit. Interessante Frage jedoch. – zelanix
Ich sehe keine Einschränkung, dass es genau (oder zumindest) eine bestimmte Anzahl von Punkten in der Stichprobe geben sollte, also: Warum nicht einen beliebigen Punkt zufällig auswählen und diese Stichprobe aufrufen? (Wie zu lesen als: Denken Sie an eine geeignete Constraint- oder Penalty-Funktion und fügen Sie sie Ihrer Frage hinzu.) –
@zelanix Sie hängt stark vom Wert von 'd0' ab. Kleinere 'd0's machen die Schleife langsamer. – saastn