2016-06-28 2 views
2

Когда я использую алгоритм knn в sklearn, я могу получить ближайших соседей в пределах радиуса, который я укажу, т.е. возвращает форму круга ближайших соседей в этом радиусе. Есть ли реализация, в которой вы можете указать два значения радиуса, чтобы вернуть форму эллипса ближайших соседей?K ближайший сосед в радиусе sklearn - эллипс

ответ

2

Вы можете указать пользовательское расстояние метрики в NearestNeighbors:

# aspect of the axis a, b of the ellipse 
aspect = b/a 
dist = lambda p0, p1: math.sqrt((p1[0] - p0[0]) * (p1[0] - p0[0]) + (p1[1] - p0[1]) * (p1[1] - p0[1]) * aspect) 
nn = NearestNeighbors(radius=1.0, metric=dist) 

или непосредственно use the KDTree с custom metric:

from sklearn.neighbors import KDTree 
import numpy as np 
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) 

# aspect of the axis a, b of the ellipse 
aspect = b/a 
dist = DistanceMetric.get_metric('pyfunc', lambda p0, p1: math.sqrt((p1[0] - p0[0]) * (p1[0] - p0[0]) + (p1[1] - p0[1]) * (p1[1] - p0[1]) * aspect)) 
kdt = KDTree(X, leaf_size=30, metric=dist) 

# now kdt allows queries with ellipses with aspect := b/a 
kdt.query([0.1337, -0.42], k=6) 

Конечно, вы можете применить любое аффинное преобразование в вашем расстоянии метрики получить поворот и масштабирование для ориентированных эллипсов.

+0

Быстрый вопрос: в 'kdt.query', где я могу указать' b' и 'a'? –

+0

@ Javiar вы не можете, вам нужно создать новый 'NearestNeighbors' /' KDTree', если вы измените соотношение сторон 'a' и' b'/при изменении метрики расстояния. – BeyelerStudios

+0

Хм .. Мне нужно посмотреть, как я могу изменить ваше решение, чтобы соответствовать моей проблеме. Но спасибо за полезный указатель - я отвечу на ваш ответ. –

Смежные вопросы