近鄰均值計算大家好,
我必須計算微電子晶圓上相鄰芯片/組件的平均值,例如在一個 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: 近鄰均值計算你好@弗蘭克_R ,
也許這也可以幫助你:加載項:空間數據分析
如果您要尋找的是空間相關性,那麼 Moran's I 可能是最基本的概念。
羅恩
Re: 近鄰均值計算您可以填充足夠多的缺失值行和列,左、右、上、下。根據您擴展鄰域的程度,您可能有 8 個完整的缺失值晶圓圍繞著真實的晶圓。
還有另一種方法可以做到這一點,也需要虛擬行和列,這將非常快:
JMP 二維矩陣可以作為一維線性矩陣進行索引。
[ 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 與二維矩陣一起使用
您可以製作 indexer3x3 等,並為每個級別重複使用 M3。 for 循環 x=3, x<=5 每次都需要更進一步。
編輯:如果您只是獲取索引元素的平均值,則可能不需要形狀函數,但它有助於顯示上面發生的事情。更多:當索引小於 1 時,JSL 矩陣具有特殊行為,您不會收到您可能希望的錯誤消息!如果索引器包含零(或 -1 等),它會顯得很奇怪。
Re: 近鄰均值計算另一方面,我意識到半徑限制的解決方案並不完美,因為我們仍然在數組中添加了一個額外的元素
例如,半徑 1.5 包含值 2,因為這是停止鄰居搜索的值... 所以它並沒有給我我想要的東西,我將不得不搜索更多!
Re: 近鄰均值計算非常感謝它非常有趣!
我有時會使用“開始數據更新”,但我在這裡沒有想到:好點。 這樣一來,如果添加我在 20,000 行中找到的開始更新,Loc() 解決方案實際上比 knearestrows() 慢一點:
沒有開始更新的舊腳本:116s!
knearestrows() 開始更新:5s
開始更新的 Loc():14 秒
但對於 knearestrows,我不得不改變我計算平均值的方式,因為我們不能再使用選擇行和開始/結束更新。
對於你完全正確的邊緣,我曾想過:
neighbors = table << Knearestrows( {8, 1.5}, i );
使用有限的半徑來避免這個問題
再次感謝!
Re: 近鄰均值計算我很確定問題的大小將決定 kdtable() 或 loc() 方法是否更好。 我猜 loc() 將贏得 10x10 或更小的矩陣,而 kdtable 將贏得 100x100 或更大的矩陣。
Xan 關於邊緣的觀點很重要。 Loc() 可能是獲得正確答案的最簡單方法。
Re: 近鄰均值計算我不確定效率如何比較,但這裡有一個可供您嘗試的替代方案。
- 使用開始/結束數據更新()將有助於任何方法
- 使用最近鄰很聰明(甚至可能更有效),但要注意它總是會返回最近的 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();