인접 이웃 평균 계산안녕하세요 여러분,
예를 들어 3x3 상자에서 마이크로 전자 웨이퍼의 이웃 다이 / 구성 요소의 평균을 계산해야합니다.

참조 구성 요소는 상자의 중앙에 있으므로 데이터 테이블의 각 행에 대해 평균을 계산하려는 8 개의 구성 요소로 둘러싸여 있습니다 (그런 다음 5x5 상자와 15 개의 이웃에 대해 동일한 것을 계산합니다 ...).
기계 학습의 새로운 기능으로 사용됩니다.
내 코드는 다음과 같습니다.
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
);누군가가 더 효율적으로 계산을 수행하는 현명한 방법이 있습니까?
감사!
스크립팅Re : 인접 이웃 평균 계산효율성이 어떻게 비교되는지 잘 모르겠지만 여기에 시도해 볼 수있는 대안이 있습니다.
- 시작 / 종료 데이터 update ()를 사용하면 모든 방법에 도움이됩니다.
- Nearest Neighbor를 사용하는 것은 영리하지만 (그리고 훨씬 더 효율적일 수도 있습니다), 이웃이 모두 한쪽에있는 웨이퍼의 가장자리에서도 항상 가장 가까운 8 개를 반환합니다.
- 행렬 첨자는 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();
Re : 인접 이웃 평균 계산문제의 크기가 kdtable () 또는 loc () 접근 방식이 더 나은지 여부를 결정할 것이라고 확신합니다. 나는 loc ()이 10x10 이하의 행렬에서 이길 것이고 kdtable은 100x100 이상에서 이길 것이라고 생각합니다.
가장자리에 대한 Xan의 요점은 중요합니다. Loc ()는 정답을 얻는 가장 쉬운 방법 일 수 있습니다.
Re : 인접 이웃 평균 계산정말 감사합니다. 매우 흥미 롭습니다!
가끔 "데이터 업데이트 시작"을 사용하지만 여기서는 생각하지 못했습니다. 좋은 지적입니다. 이를 통해 Loc () 솔루션은 실제로 20,000 행에 대해 찾은 시작 업데이트를 추가하면 knearestrows ()보다 약간 느립니다.
업데이트 시작이없는 이전 스크립트 : 116 초!
knearestrows () 업데이트 시작 : 5 초
업데이트 시작이있는 Loc () : 14 초
그러나 knearestrows의 경우 시작 / 끝 업데이트에서 더 이상 선택 행을 사용할 수 없기 때문에 평균 계산 방식을 변경해야했습니다.
당신이 완벽하게 옳은 가장자리를 위해 다음을 넣을 생각했습니다.
neighbours = table << Knearestrows ({8,1.5}, i);
제한된 반경을 사용하여이 문제를 방지하려면
다시 한 번 감사드립니다!
Re : 인접 이웃 평균 계산반면에 반경 제한의 솔루션이 완벽하지 않다는 것을 알고 있습니다.
예를 들어 반경 1.5는 이웃 검색을 중지하는 값이기 때문에 값 2를 포함합니다. 그래서 내가 원하는 것을 정확히 제공하지 못합니다. 조금 더 검색해야합니다!
Re : 인접 이웃 평균 계산누락 된 값의 충분한 행과 열 (왼쪽, 오른쪽, 위쪽, 아래쪽)을 채울 수 있습니다.이웃을 확장하는 정도에 따라 실제 웨이퍼를 둘러싼 8 개의 완전한 결 측값 웨이퍼가있을 수 있습니다.
이 작업을 수행하는 또 다른 방법이 있습니다. 또한 더미 행과 열이 필요합니다. 정말 빠릅니다.
JMP 2D 행렬은 1D 선형 행렬로 인덱싱 할 수 있습니다.
[1 2,
3 4,
5 6] (3 행, 2 열)
또한 다음과 같이 보입니다
[ 1,
2,
삼,
4,
5,
6] (6 행, 아래 첨자를 사용하는 경우 1 열)
웨이퍼가 NRows x NCols이면 3NRows x 3NCols 행렬의 중간에 놓습니다 (M3라고 부릅니다).
수평으로 이동하려면 1을 추가하고 수직으로 이동하려면 3NCol을 추가하여 인덱스 M3에 1D 첨자의 행렬을 만들 수 있습니다. M3에서 3x3 부분 행렬을 추출하려면 인덱스 행렬과 shape () 함수를 사용하십시오.
이 같은:
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 [. ., 삼 .]
5 3 [3., 6.]
5 4 [6., 9.]
5 5 [9.,. .]
이것도 필요할 수 있습니다. 2D 매트릭스와 함께 Loc 사용
indexer3x3 등을 만들고 각 레벨에 대해 M3를 재사용 할 수 있습니다. for 루프 x = 3, x <= 5는 매번 조금 더 가야합니다.
편집 : 인덱싱 된 요소의 평균을 얻고있는 경우 모양 기능이 필요하지 않을 수 있지만 위에서 발생한 일을 표시하는 데 도움이됩니다. more : JSL 행렬은 인덱스가 1보다 작을 때 특별한 동작을하며 원하는 오류 메시지를 얻지 못할 것입니다! 인덱서에 0 (또는 -1 등)이 포함되어 있으면 매우 이상하게 보일 것입니다.
Re : 인접 이웃 평균 계산안녕 뿡뿡 ,
다음과 같은 도움이 될 수도 있습니다. 추가 기능 : 공간 데이터 분석
당신이 찾고있는 것이 공간적 상관 관계라면 모란의 I는 아마도 가장 기본적인 개념 일 것입니다.
Ron
Re : 인접 이웃 평균 계산이 모든 것에 감사 드리며 더 깊이 파고들겠습니다