我试图找到一个点与其他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个点的标题和索引
谢谢
答案 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。