
这是一个 2D 邻域。(感谢 JMP 的开放街道地图连接!)你可以想象一维邻里也,但是一维不是很有趣。

您可以想象一个拥有高层建筑的城市中的 3D 社区;你的每个邻居都会得到一个纬度、经度和高度坐标。在任何 nD (n > 0) 空间中,一个有趣的问题是“谁是我最近的邻居?”可以在 2D 地图上轻松识别最近的邻居。但是如果所有的 Latitudes, Longitude, Altitudes 都在一个数据表里呢?和
每个邻居一行?这是一个包含 1000 行的二维表。找到 SMITH 最近邻居的一种方法是计算他与所有其他邻居的距离,对距离进行排序,然后选择最小的。还不错,如果你只需要做一次。但远不如查看 SMITH 房子的二维地图和只看到他最近的邻居那么令人满意。(有趣的事实:如果 Fred 是 Joe 的最近邻居,那么 Joe 可能不是 Fred 的最近邻居。最近邻链构成集群平台“快速 Ward 方法”的核心。)
如果需要为表中的很多人回答问题,则有一种找到最近邻居的更好方法。一维问题“不是很有趣”,因为房屋已经排成一行,并且通过对数据进行排序,只需一次,只需查看与其他两个邻居的距离,就可以找到与该行中任何人最近的邻居……隔壁的两个邻居。有没有什么方法可以对数据表中的二维行进行一次排序,这样就可以像找到两个隔壁邻居一样容易地找到街对面的邻居和后门的邻居?同时按 X 和 Y 排序?是的...
JMP 的 KDTable 函数根据 K 维数据创建 JSL 对象,以高效查找最近邻。它使 nD 问题看起来像 1D 问题,这非常令人满意。KDTable 由具有 K 列的矩阵构成(K 是维数...对于示例邻居表为 2,对于高层居民为 3。)矩阵中的每一行都是 K 维空间中的一个点(示例中有 1000 个邻居。)要从数据表创建 KDTable,只需将 x 和 y 列作为矩阵并使用 ||矩阵连接将两个 1000x1 列向量转换为 1000x2 矩阵:
dt = Open( "$desktop/RandomNameLocation.jmp" );
mat = (dt:x << getvalues) || (dt:y << getvalues);
Show( N Rows( mat ), N Cols( mat ) );
kdt = KDTable( mat );
N 行(垫)= 1000;
N列(垫)= 2;
Kdt是保存 KDTable 对象的 JSL 变量。该对象有几种方法; << K最近的行最有趣的是:
kdt<<K nearest="" rows=""></K>
{[984 169], [0.684553526256623 2.00033962590788]}
第一个参数 2 请求最近的 2 行,第二个参数 1 是要与它们进行比较的行(SMITH 的行)。返回值是两个矩阵的列表。第一个矩阵标识两行(984 是 CARNEY,169 是 RICE。)他们来了:

显然,CARNEY 比 RICE 更接近。这是使用 K Nearest Rows 方法的最简单方法——使用表中的实际行号。也可以使用任意K维坐标作为1行K列的矩阵。也可以省略最后一个参数,在这种情况下,返回的列表将包含每行具有最近邻/距离的矩阵(例如 1000)。
KDTable 非常快速地返回最近的邻居。下一个最近的邻居需要更长的时间才能发现,依此类推。事实上,将第一个参数设置为 999 将返回所有最近邻居的排序列表,并且运行速度足够快以处理 1000 行,但请记住——该表擅长查找最近的邻居,而不是遥远的邻居。
因为减速从距离开始,所以第一个参数(限制返回的邻居数量)除了邻居数量之外还可以指定半径限制。例如,
kdt<<K nearest="" rows=""></K>
{[984 169 745 403 506 772 977 864 12 0], [0.684553526256623 2.00033962590788
2.27070259974598 3.94275990709721 4.20575097464916 4.29873200846626 4.6027795012889
4.82632837039104 5.48011662134314 0]}
要求最多 20 行,最大半径为 5。第 12 行的半径为 5.4,仅在 9 个邻居后停止搜索
已经成立。最后的零标记不是有效的行号,意味着半径限制停止了搜索。在具有 1,000,000 个点且分布不均匀的云中,请求 20 个最近的邻居在人口稠密地区可能很快,而在郊区则很慢。设置合理的半径限制可以区分反应迟钝和反应敏捷。
KDTable 对象应该构造一次,然后反复使用。KDTable 的内部数据结构尽可能快地构建,但是在构建之后向它询问有关邻居的问题要快得多。
有两个脚本,云和蜘蛛, 进一步说明如何使用 KDTable 函数。两者都是交互式的(拖动白色小方块)。可以为云中的更多点编辑点云示例(200 万并不算多),而蜘蛛示例有一个复选框以使其令人毛骨悚然。和上周帖子中的视频使用KDTable,很多。
2018 年 10 月 8 日更新:修复格式
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />很酷! 但我会为“评级”添加一个新列并对我的邻居进行评级。 然后我可以找到我喜欢的最近的邻居!