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

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