搜索k个最近的点

时间:2012-09-11 12:14:42

标签: python knn

我有一大堆功能如下:

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 euclidean距离并对它们进行排序以找到最近的5个点。 因为我的数据集非常大。什么是最好的方法。

2 个答案:

答案 0 :(得分:7)

scikit-learn有nearest neighbor search。例如:

  1. 将数据加载到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]])
    

    (仅显示两点。)

  2. 适合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)距离。

  3. 执行查询。要获得X[0]的邻居,您的第一个数据点是:

    >>> knn.kneighbors(X[0], return_distance=False)
    array([[0, 1]])
    

    因此,X[0]的最近邻居X[0]本身和X[1](当然)。

  4. 确保设置n_neighbors=6,因为集合中的每个点都将成为其最近的邻居。

    免责声明:我参与了scikit-learn开发,所以这不是公正的建议。

答案 1 :(得分:1)

从您的问题来看,您的问题具体细节并不完全清楚。到目前为止我了解到,您需要计算大量数据点之间的欧氏距离。 Python中最快的解决方案可能会使用scipy.spatial.distance模块。请看看

http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html

http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html

您必须熟悉numpy数据类型,为其中一个函数开发输入数据并进一步评估结果数据。您可能最终会尝试获取数组的最大/最小N值,此时How to get indices of N maximum values in a numpy array?可能有所帮助。