У меня есть ситуация, когда я пытаюсь найти трех лучших соседей для данного человека. Я попытаюсь объяснить это простым способом:
мой df выглядит так:
Person Salary Business Segment Headcount Total_exp Career_level
A 10000 IT Engineering 10 5 VP
B 2000 IT Engineering 5 5 AVP
C 4000 IT STEM 5 5 VP
D 3000 IT Software 10 5 VP
E 7000 IT Engineering 8 4 Manager
И иерархия человека выглядит так:
B, C сообщает A и E, D сообщает B, а также другие люди. Теперь, если я посмотрю сверху набора данных, единственными ближайшими соседями к A могут быть C, так как три функции близко совпадают, и я понял это правильно.
Теперь проблема в том, что я вижу только людей, которые находятся на одном уровне, что означает, что он ищет только линейно и не предоставляет мне людей, которые могут быть ниже этого человека.
Теперь, например, человек E, который не сообщает ни одному из людей, упомянутых в списке, все еще хорошо подходит как сосед A, но, поскольку этот человек не входит в иерархию A, не является потенциальным соседом.
Я использую следующий код для достижения этой цели:
from sklearn.neighbors import KDTree
def findsuccess(person):
neighbors_person = np.where(nbrs.kneighbors_graph([principalComponents[i]]))[0]
print('Neighbors of id', neighbors_person)
kdt = KDTree(principalComponents, leaf_size=30, metric='euclidean')
kdt.query(principalComponents, k=4, return_distance=False)
import pickle
s = pickle.dumps(kdt)
tree_copy = pickle.loads(s)
dist, ind = tree_copy.query(principalComponents[:5440], k=4)
print(ind) # indices of 3 closest neighbors
print(dist) # distances to 3 closest neighbors
PrincipalComponents - это мой окончательный сокращенный набор компонентов, которые я получил от моего PCA.
Как найти люди вертикально, а не только горизонтально? Какой метри c будет лучшим для этого?