近邻均值计算大家好,
我必须计算微电子晶圆上相邻芯片/组件的平均值,例如在一个 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();