2

Интересно, есть ли способ заставить sklearn алгоритм NearestNeighbors, чтобы принять во внимание порядок точки во входном массиве, когда есть повторяющиеся точки.Проблема с sklearn k ближайших соседей

Для иллюстрации:

>>> from sklearn.neighbors import NearestNeighbors 
>>> import numpy as np 

X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) 
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X) 
distances, indices = nbrs.kneighbors(X) 
indices           
>>>> array([[0, 1], 
    [1, 0], 
    [2, 1], 
    [3, 4], 
    [4, 3], 
    [5, 4]]) 

Поскольку набор запросов соответствует обучающему набору, ближайший сосед каждой точки есть сама точка, на расстоянии от нуля. Однако, если я позволяю дублированные точки в X, алгоритм, по понятным причинам, не отличающим между дубликатами:

X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1],[3, 2],[-1,-1],[-1,-1]]) 
nbrs = NearestNeighbors(n_neighbors=2, algorithm='auto').fit(X) 
distances, indices = nbrs.kneighbors(X) 
indices 
>>>> array([[6, 0], 
    [1, 0], 
    [2, 1], 
    [3, 4], 
    [4, 3], 
    [5, 4], 
    [6, 0], 
    [6, 0]]) 

В идеале я хотел бы последний выход, чтобы быть что-то вроде:

>>>> array([[0, 6], 
    [1, 0], 
    [2, 1], 
    [3, 4], 
    [4, 3], 
    [5, 4], 
    [6, 0], 
    [7, 6]]) 

ответ

1

Я думаю, что вы не можете сделать это, так как из ref мы получили:

Внимание: что касается ближайших соседей алгоритмов, если два соседних, соседних k + 1 и k, имеют одинаковые расстояния, но разные метки, результаты будут зависеть от заказа данных обучения.