5

我有很多看起来像这样的功能:

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 个点。因为我的数据集非常大。最好的方法是什么。

4

2 回答 2

19

scikit-learn 有最近邻搜索。例子:

  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](当然)。

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

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

于 2012-09-11T13:31:11.360 回答
2

从你的问题来看,你的问题的具体细节并不完全清楚。到目前为止,我了解到,您需要计算大量数据点之间的欧几里得距离。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 值,此时如何在 numpy 数组中获取 N 个最大值的索引?有帮助。

于 2012-09-11T12:24:41.420 回答