Почему евклидово расстояние здесь не работает? - PullRequest
3 голосов
/ 21 апреля 2020

У меня есть набор точек данных (x, y), и я хотел бы получить ближайшую точку относительно одной заданной координаты (x0, y0). Поэтому я оцениваю расстояние между всеми точками и беру меньшую, но по какой-то причине она не дает ближайшую точку для этого конкретного примера.

x = np.array([64.2242304 , 61.2518646 , 58.47390016, 64.20955699, 61.23787029,
   58.46054054, 64.19456598, 61.22357308, 58.44689175, 64.17925719,
   61.20897279, 58.43295363, 64.16385925, 61.19428749, 58.41893435,
   63.87231513, 60.91623635, 58.1534937 , 63.85128529, 60.89617978,
   58.13434676, 63.82993374, 60.87581641, 58.11490693, 63.80826025,
   60.85514599, 58.09517398, 63.78658575, 60.83447461, 58.07544011,
   62.63916359, 59.74015637, 57.03075264, 62.60371968, 59.70635284,
   56.99848221, 62.56794127, 59.6722303 , 56.96590723, 62.53182804,
   59.63778843, 56.93302741, 62.49537965, 59.6030269 , 56.89984243,
   61.81677277, 58.95582667, 56.28199476, 61.77417322, 58.91519867,
   56.24320937, 61.73123185, 58.87424468, 56.20411277, 61.68857821,
   58.83356509, 56.16527813, 61.6449571 , 58.79196282, 56.12556265])

y = np.array([0.873742  , 0.89044404, 0.8905113 , 0.84973851, 0.87760778,
   0.90631466, 0.87658266, 0.87059042, 0.87698866, 0.84016969,
   0.88174558, 0.88865462, 0.85846238, 0.90678905, 0.91368672,
   0.80547866, 0.85115265, 0.85444583, 0.86176715, 0.86161907,
   0.8497139 , 0.83833086, 0.8329039 , 0.8346713 , 0.81458452,
   0.85984806, 0.88086607, 0.85484444, 0.8459257 , 0.85321279,
   0.89137664, 0.95721649, 0.99768893, 0.95881713, 0.92558392,
   0.95388805, 0.92377277, 0.94814089, 0.99000415, 0.94148869,
   0.95076589, 0.97205063, 0.93682003, 0.94698105, 0.98542763,
   0.88543196, 0.88457109, 0.88873105, 0.9231422 , 0.92223527,
   0.90003003, 0.9508397 , 0.97875354, 0.95647845, 0.91495685,
   0.92922366, 0.93115852, 0.99404974, 0.99146021, 1.00299637])
x0, y0 = 56.25631332055924, 1.017018635355944 ### the closest point to this should be the last coordinate in (x,y)
ind = np.argmin(np.sqrt((x-x0)**2 + (y-y0)**2))
plt.plot(x,y,'o')  
plt.plot(x0,y0,'+') 
plt.plot(x[ind],y[ind],'+', ms=10)  

Результат показан на следующем рисунке. Я хочу ближайшую точку к оранжевому кресту, но я получаю точку, где находится зеленый крест! Есть идеи почему?

enter image description here

Ответы [ 4 ]

3 голосов
/ 21 апреля 2020

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

x_max = max(x)
y_max = max(y)
x /= x_max
x0 /= x_max
y /= y_max
y0 /= y_max

ind = np.argmin(np.sqrt((x-x0)**2 + (y-y0)**2))
plt.plot(x,y,'o')  
plt.plot(x0,y0,'+', ms=30) 
plt.plot(x[ind],y[ind],'+', ms=30) 

enter image description here

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

1 голос
/ 21 апреля 2020

Так выглядит картинка (для подмножества данных), когда оси одинаково масштабируются - один тик равен 0,02 по осям x и y:

enter image description here

Это те же 5 точек, что и в этой части исходного изображения, только правильно отображаются:

enter image description here

Вы видите сейчас что точка с крестиком действительно ближе всего к оранжевому кресту? Ваше оригинальное изображение было, по сути, сжато вдоль оси х. Если я нарисую круг с центром в оранжевом кресте и с радиусом, равным расстоянию до ближайшей точки данных, при исходном масштабировании он будет выглядеть как очень вытянутый эллипс:

enter image description here

Однако все точки на его краю равны на равном расстоянии от центра - зеленый крест точно на краю, ваша "предполагаемая ближайшая" точка находится снаружи (как и все остальные точки). ).

0 голосов
/ 21 апреля 2020

Вся идея состоит в том, чтобы получить (x0, y0) щелчком мыши, чтобы удалить некоторые точки данных, но при изменении масштаба, как сказано выше, удаляются точки в порядке слева направо, а не точки, близкие к положению мыши.

0 голосов
/ 21 апреля 2020

Индекс ind на самом деле неверен, ind должен быть 59, но он дает 53. Вот почему он не работает.

...