Nahe Nachbarn bedeuten BerechnungHallo allerseits,
Ich muss den Mittelwert benachbarter Chips/Komponenten auf einem mikroelektronischen Wafer berechnen, zum Beispiel auf einer 3x3-Box wie dieser:

Die Referenzkomponente befindet sich in der Mitte einer Box und ist daher von 8 Komponenten umgeben, deren Mittelwert ich berechnen möchte, für jede Zeile der Datentabelle (berechnen Sie dann dasselbe für eine 5x5-Box und 16 Nachbarn ...)
Es wird als neues Feature für maschinelles Lernen verwendet.
Mein Code ist:
dt = current data table();
<BR />// building the KD table
matrice = (dt:row << getvalues) || (dt:col << getvalues);
table = KDTable(matrice);
for( i=1, i<=nrows(dt),i++,
// get the 3x3 neighbors
neighbors = table << Knearestrows(8,i);
neighbors_number = neighbors[1,1];
// Select the neighbors and get their metrics values and calculate the mean<BR /> dt << select rows (neighbors_number );
mean_selection = Col Mean( If( Selected(), :metric, . ) );
:mean_metric[i] = mean_selection;
dt << clear select
);Hat jemand eine clevere Möglichkeit, diese Berechnung effizienter durchzuführen?
Danke!
SkripterstellungBetreff: Mittelwertberechnung in der Nähe von NachbarnDanke für all das, ich werde mich eingehender damit befassen
Betreff: Mittelwertberechnung in der Nähe von NachbarnHallo @Franck_R ,
Vielleicht hilft dir auch das weiter: Add-In: Räumliche Datenanalyse
Wenn Sie nach der räumlichen Korrelation suchen, ist Moran's I vielleicht das grundlegendste Konzept.
Ron
Betreff: Mittelwertberechnung in der Nähe von NachbarnSie könnten genügend Zeilen und Spalten mit fehlenden Werten auffüllen, links, rechts, oben, unten.Je nachdem, wie weit Sie mit der Erweiterung der Nachbarschaft gehen, haben Sie möglicherweise 8 vollständige Wafer mit fehlendem Wert, die den echten Wafer umgeben.
Es gibt einen anderen Weg, dies zu tun, der auch die Dummy-Zeilen und -Spalten erfordert, was sehr schnell sein wird:
JMP 2D-Matrizen können als lineare 1D-Matrizen indiziert werden.
[ 1 2,
3 4,
5 6 ] (3 Reihen, 2 Spalten)
sieht auch so aus
[ 1,
2,
3,
4,
5,
6] (6 Zeilen, 1 Spalte bei Verwendung eines Index)
Wenn der Wafer NRows x NCols ist, platzieren Sie ihn in der Mitte einer 3NRows x 3NCols-Matrix (ich nenne ihn M3).
Sie können eine Matrix aus 1D-Indizes zum Index M3 erstellen, indem Sie 1 hinzufügen, um sich horizontal zu bewegen, und 3NCols hinzufügen, um sich vertikal zu bewegen. Um eine 3x3-Untermatrix aus M3 zu extrahieren, verwenden Sie die Indexmatrix und die Funktion shape().
etwas wie das:
M3 = [. . . . . . . . .,
. . . . . . . . .,
. . . . . . . . .,
. . . 1 2 3 . . .,
. . . 4 5 6 . . .,
. . . 7 8 9 . . .,
. . . . . . . . .,
. . . . . . . . .,
. . . . . . . . .];
indexer2x2 = [1 2 10 11]; // top left 2x2 sub-matrix
For( x = 2, x <= 5, x += 1,
For( y = 2, y <= 5, y += 1,
Write( "\!n ", x, " ", y, " ", Shape( M3[indexer2x2 + x + y * 9], 2 ) );
)
);
2 2 [. ., . 1]
2 3 [. 1, . 4]
2 4 [. 4, . 7]
2 5 [. 7, . .]
3 2 [. ., 1 2]
3 3 [1 2, 4 5]
3 4 [4 5, 7 8]
3 5 [7 8, . .]
4 2 [. ., 2 3]
4 3 [2 3, 5 6]
4 4 [5 6, 8 9]
4 5 [8 9, . .]
5 2 [. ., 3 .]
5 3 [3 ., 6 .]
5 4 [6 ., 9 .]
5 5 [9 ., . .]
Das könntest du auch brauchen: Verwenden von Loc mit einer 2D-Matrix
Sie können indexer3x3 usw. erstellen und den M3 einfach für jede Ebene wiederverwenden. die for-Schleife x=3, x<=5 muss jedes Mal etwas weiter gehen.
Bearbeiten: Die Shape-Funktion wird möglicherweise nicht benötigt, wenn Sie nur den Mittelwert der indizierten Elemente erhalten, aber sie hilft zu zeigen, was oben passiert ist. mehr: JSL-Matrizen haben ein spezielles Verhalten, wenn der Index kleiner als 1 ist, und Sie erhalten nicht die erhoffte Fehlermeldung! Wenn der Indexer eine Null (oder -1 usw.) enthält, wird es sehr seltsam erscheinen.
Betreff: Mittelwertberechnung in der Nähe von NachbarnAndererseits ist mir klar, dass die Lösung der Radiusgrenze nicht perfekt ist, weil wir immer noch ein zusätzliches Element in das Array nehmen
Beispielsweise enthält ein Radius von 1,5 einen Wert von 2, da dies der Wert ist, der die Suche nach Nachbarn stoppt ... Es gibt mir also nicht genau das, was ich will, ich muss ein bisschen mehr suchen!
Betreff: Mittelwertberechnung in der Nähe von NachbarnVielen Dank es ist sehr interessant!
Ich benutze manchmal "begin data update", aber ich habe hier nicht daran gedacht: guter Punkt. Damit ist die Loc()-Lösung tatsächlich etwas langsamer als knearestrows(), wenn Sie das begin update hinzufügen, das ich für 20.000 Zeilen finde:
altes script ohne begin update: 116s !
knearestrows() mit begin update: 5s
Loc() mit begin update: 14s
aber für die Knearestrows musste ich die Art und Weise ändern, wie ich den Mittelwert berechne, da wir ausgewählte Zeilen nicht mehr mit der Anfangs-/Endaktualisierung verwenden können.
Für die Kanten hast du vollkommen recht, ich hatte daran gedacht, Folgendes einzufügen:
neighbors = table << Knearestrows( {8, 1.5}, i );
Um dieses Problem zu vermeiden, verwenden Sie einen begrenzten Radius
Danke noch einmal!
Betreff: Mittelwertberechnung in der Nähe von NachbarnIch bin mir ziemlich sicher, dass die Größe des Problems bestimmt, ob der Ansatz kdtable() oder loc() besser ist. Ich würde vermuten, dass loc() für eine 10x10 oder kleinere Matrix und kdtable für 100x100 oder größer gewinnt.
Xans Argument zu den Rändern ist wichtig. Loc() ist möglicherweise der einfachste Weg, um die richtige Antwort zu erhalten.
Betreff: Mittelwertberechnung in der Nähe von NachbarnIch bin mir nicht sicher, wie die Effizienz im Vergleich ist, aber hier ist eine Alternative, die Sie ausprobieren können.
- Die Verwendung von begin/end data update() hilft bei jeder Methode
- Die Verwendung von Nearest Neighbor ist clever (und vielleicht sogar effizienter), aber seien Sie sich bewusst, dass es immer die 8 am nächsten zurückgibt, selbst an den Rändern des Wafers, wo die Nachbarn alle auf einer Seite sind.
- Matrix-Subskription kann effizienter sein als Col Mean().
dt = current data table();
metrics = dt[0, "metric"];
rows = dt[0, "row"];
cols = dt[0, "col"];
d = 1; // 1 => 3x3, 2 => 5x5
dt << Begin Data Update();
For Each Row(
neighbors = Loc( :col - d <= cols <= :col + d & :row - d <= rows <= :row + d );
mean all = Mean( metrics[neighbors] );
nn = N Rows( neighbors );
mean without center = (mean all * nn - :metric) / (nn - 1);
:mm = mean without center;
);
dt << End Data Update();