Найти 10 ближайших точек в порядке убывания - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь найти расстояние между точкой и другими 40000 точками.

Каждая точка - это вектор измерения 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]])

Эта команда возвращает ближайший заголовок и идентификатор:

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 голосов
/ 04 октября 2018

Просто нарежьте отсортированную матрицу расстояний для первых 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), ...]

Для чего-то немного отличающегося, это также немного похоже назадача коммивояжера (TSP), если вы хотите получить кратчайшие пути между всеми точками, а затем просто выделите первые 10 «городов».

Google имеет довольно простую и быструю реализацию Python с OR-Tools здесь: https://developers.google.com/optimization/routing/tsp.

0 голосов
/ 04 октября 2018

Поскольку я не знаю, что ваш полный код содержит образец данных, я бы предложил:

Вместо использования ".argmin ()" просто отсортируйте список по расстоянию, а затем вернитепервые десять элементов отсортированного списка.Затем найдите их индексы, как будто вы уже делаете это.

...