
這是一個 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" />很酷! 但我會為“評級”添加一個新列並對我的鄰居進行評級。 然後我可以找到我喜歡的最近的鄰居!