以降序找到10个最接近的点

时间:2018-10-04 14:26:34

标签: python scipy distance nearest-neighbor scipy-spatial

我试图找到一个点与其他40,000个点之间的距离。

每个点都是一个300维向量。

我能够找到收盘点。如何以降序找到最近的10个点?

最接近点的功能:

from scipy.spatial import distance
def closest_node(node,df):
    closest_index = distance.cdist([node],df.feature.tolist()).argmin()
    return pd.Series([df.title.tolist([closest_index],df.id.tolist()[closest_index]])

此命令返回最接近的标题和ID:

df3[["closest_title","closest_id"]]=df3.feature.apply(lambda row: closest_node(row,df2))

df2- pandas dataframe of 40,000 points (each 300 dimension)

如何返回最接近的10个点的标题和索引

谢谢

2 个答案:

答案 0 :(得分:1)

由于我不知道您的完整代码中是否包含数据样本,因此,这是我的建议:

代替使用“ .argmin()”,只需按距离对列表进行排序,然后返回已排序列表的前十个元素。然后像您已经在做的那样找到他们的索引。

答案 1 :(得分:1)

只需对前10个节点的排序距离矩阵进行切片。 像这样:

from scipy.spatial import distance

# Find the query node
query_node = df.iloc[10] ## Not sure what you're looking for

# Find the distance between this node and everyone else
euclidean_distances = df.apply(lambda row: distance.euclidean(row, query_node), axis=1)

# Create a new dataframe with distances.
distance_frame = pandas.DataFrame(data={"dist": euclidean_distances, "idx": euclidean_distances.index})
distance_frame.sort("dist", inplace=True)

# nodes
smallest_dist_ixs = distance_frame.iloc[1:10]["idx"]
most_similar_nodes = df.iloc[int(smallest_dist_ixs)]

基于您在此处使用的“标题”一词的我的假设以及300个维向量的选择是,这些向量是词或短语向量。
Gensim实际上有一种方法可以根据这种想法获得前N个相似词,这是相当快的。

https://tedboy.github.io/nlps/generated/generated/gensim.models.Word2Vec.most_similar.html

>>> trained_model.most_similar(positive=['woman', 'king'], negative=['man'])
[('queen', 0.50882536), ...]

如果您想获得所有 all 点之间的最短路径,然后简单地切出前10个“城市”,则对于稍有不同的事物,这也与旅行商问题(TSP)略有相似。 。

https://developers.google.com/optimization/routing/tsp处,Google使用OR工具非常简单快捷地实现了python。