近鄰均值計算嗨,大家好,
我必須計算微電子晶圓上的相鄰管芯/組件的平均值,例如在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
);有沒有人聰明的方法可以更有效地進行計算?
謝謝!
腳本編寫回复:近鄰均值計算我不確定效率如何比較,但是這是您嘗試的替代方法。
- 使用開始/結束數據update()將有助於任何方法
- 使用最近的鄰居很聰明(甚至可能更有效),但要注意,即使在所有鄰居都在一側的晶圓邊緣,它也總是返回最接近的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();
回复:近鄰均值計算我很確定問題的大小將確定kdtable()還是loc()方法是否更好。 我猜想loc()會贏得10x10或更小的矩陣,而kdtable會贏得100x100或更大的矩陣。
Xan關於邊緣的觀點很重要。 Loc()可能是獲得正確答案的最簡單方法。
回复:近鄰均值計算非常感謝,這非常有趣!
有時我會使用“開始數據更新”,但是我在這裡沒有想到:很好。 這樣,如果添加我發現的20,000行的開始更新,則Loc()解決方案實際上比knearestrows()慢一點:
沒有開始更新的舊腳本:116s!
knearestrows()開始更新:5秒
Loc()開始更新:14秒
但是對於knearestrows,我不得不更改計算均值的方式,因為我們不能再在開始/結束更新中使用選擇行。
對於您完全正確的邊緣,我曾考慮過放入:
鄰居=表<< Knearestrows({8,1.5},i);
為避免此問題,請使用有限的半徑
再次感謝!
回复:近鄰均值計算另一方面,我意識到半徑限制的解決方案並不完美,因為我們仍然在數組中添加了一個額外的元素
例如半徑1.5包含2的值,因為這是阻止鄰居搜索的值... 因此,它並不能完全滿足我的需求,我還需要搜索更多!
回复:近鄰均值計算您可以填充缺少的值(左,右,上,下)的行和列。根據擴展鄰域的距離,您可能會在實際晶圓周圍有8個完全缺失值的晶圓。
還有另一種方法,也需要虛擬行和列,這將非常快:
JMP 2D矩陣可以索引為1D線性矩陣。
[1 2
3 4
5 6](3行2列)
也看起來像
[1
2,
3,
4,
5
6](6行,使用一個下標時為1列)
如果晶片是NRows x NCols,則將其放在3NRows x 3NCols矩陣的中間(我將其稱為M3)。
您可以通過添加1來水平移動並添加3NCols來垂直移動,從而為索引M3創建一維下標矩陣。 要從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 [。 。,3。]
5 3 [3。,6。]
5 4 [6。,9。]
5 5 [9。,。 。]
您可能也需要此:將Loc與2D矩陣配合使用
您可以製作indexer3x3等,然後僅在每個級別重用M3。 for循環x = 3,每次x <= 5都需要走得更遠。
編輯:如果只是獲取索引元素的均值,則可能不需要shape函數,但它有助於顯示上面發生的情況。更多:當索引小於1時,JSL矩陣具有特殊的行為,您將不會收到您希望的錯誤消息!如果索引器包含零(或-1等),它將看起來很奇怪。
回复:近鄰均值計算你好@Franck_R ,
也許這也可以幫助您:加載項:空間數據分析
如果您要尋找的是空間相關性,那麼Moran的I也許是最基本的概念。
羅恩