我有一大堆功能,看起来像这样:

id1 28273 20866 29961 27190 31790 19714 8643 14482 5384 ....  upto 1000
id2 12343 45634 29961 27130 33790 14714 7633 15483 4484 ....
id3 ..... ..... ..... ..... ..... ..... .... ..... .... .... .   .   .
...
id200000 .... .... ... ..  .  .  .  .

我想计算每个 id 欧几里得距离并对它们进行排序以找到 5 个最近的点。
因为我的数据集非常大。最好的方法是什么。

最佳答案

scikit-learn 有 nearest neighbor search 。例子:

  • 将数据加载到 NumPy 数组中。
    >>> import numpy as np
    >>> X = np.array([[28273, 20866, 29961, 27190, 31790, 19714, 8643, 14482, 5384, ...],
                      [12343, 45634, 29961, 27130, 33790, 14714, 7633, 15483, 4484, ...],
                      ...
                      ])
    

    (仅显示两点。)
  • 适合 NearestNeighbors 对象。
    >>> from sklearn.neighbors import NearestNeighbors
    >>> knn = NearestNeighbors(n_neighbors=5)
    >>> knn.fit(X)
    NearestNeighbors(algorithm='auto', leaf_size=30, n_neighbors=5, p=2,
             radius=1.0, warn_on_equidistant=True)
    
    p=2 表示欧几里得 (L2) 距离。 p=1 表示曼哈顿(L1)距离。
  • 执行查询。要获取X[0]的邻居,您的第一个数据点:
    >>> knn.kneighbors(X[0], return_distance=False)
    array([[0, 1]])
    

    所以,X[0] 的最近邻是 X[0] 本身和 X[1](当然)。

  • 确保你设置了 n_neighbors=6 因为你的集合中的每个点都将是它自己最近的邻居。

    免责声明:我参与了scikit-learn开发,因此这不是不偏不倚的建议。

    关于python - 搜索 k 个最近点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12369484/

    10-12 19:39