【问题标题】:searching for k nearest points搜索 k 个最近点
【发布时间】:2012-09-11 12:14:41
【问题描述】:

我有大量的功能,如下所示:

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

【问题讨论】:

  • 欢迎来到 Stack Overflow!我们鼓励您research your questions。如果您有 tried something already,请将其添加到问题中 - 如果没有,请先研究并尝试您的问题,然后再回来。
  • 是否在不同的位置(即您正在为 1000 维空间计算此值)。如果是这样,当你说“欧几里得距离”到哪一点?如果是作为一个组,请你定义“k-closest”......你的意思并不明显。
  • 例如,如果我将输入作为 id2 提供给脚本。我期望结果:关于 id2 的 5 个最近点。我想计算从 id2 到数据集中所有点的欧几里得距离,对它们进行排序并返回 5-最近点。

标签: python knn


【解决方案1】:

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

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

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

【讨论】:

  • 例如,如果我给脚本输入“id2”。我希望结果是与“id2”相关的 5 个最近点。我想计算从“id2”到数据集中所有点的欧几里得距离,对它们进行排序并返回 5-最近点。感谢您的输入。我看到你从数据集中分离了“id numbers”。但是,我想将 'idn' 和它们的值一起保存在同一个数组中。这样当我对最近的 5 个点进行排序时,我就可以知道它们属于哪些 id。
  • @Rafaelopasa:所以?在索引中添加一个并将id 粘贴在前面。或者保留一个 id 数组,如果它们不连续的话。
  • 如果我想找到NearestNeighbors 到新数据点怎么办?
  • 看不到获得余弦相似度的方法(即点积)?
【解决方案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 值,此时How to get indices of N maximum values in a numpy array? 可能会有所帮助。

【讨论】:

  • 如果总和超过限制(即当结果明显大于其他已经计算的结果时)可能会中止计算将加快进程。不过,不知道这是否可以在 scipy 中完成。
  • 例如,如果我将输入作为“id2”和上面的“feature-set file.txt”输入脚本。我希望结果是与“id2”相关的 5 个最近点。我想计算从“id2”到数据集中所有点的欧几里得距离,对它们进行排序并返回 5-最近点。感谢您的意见
猜你喜欢
  • 2017-11-14
  • 2017-08-05
  • 2012-11-10
  • 2011-08-26
  • 2012-12-28
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多