Как найти ближайших соседей точки и другую точку, которая не удалена? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть задача найти ближайших соседей некоторых точек и удалить другие точки, которые не являются ближайшими соседями. Эта задача похожа на проблему с выборкой.

Код пока:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy import spatial

data = pd.read_csv('data.csv')
majority = data.loc[data['class']==0]
minority = data.loc[data['class']==1]

majority_points=majority.drop('class', axis=1)
minority_points=minority.drop('class', axis=1)

all_data = pd.concat([majority,minority])

data_points = all_data.drop('class', axis=1)
# print(data_points)

majority_points=np.array(majority_points)
print (majority_points)
minority_points =np.array(minority_points)
print (minority_points)
    #result
    [[1 1]
 [1 2]
 [1 3]
 [1 4]
 [1 5]
 [2 1]
 [2 2]
 [2 4]
 [2 5]
 [3 1]
 [3 2]
 [3 5]
 [4 1]
 [4 4]
 [4 5]
 [5 1]
 [5 2]
 [5 3]
 [5 4]
 [5 5]] (20, 2)
[[2 3]
 [3 3]
 [3 4]
 [4 2]
 [4 3]]

`

#to find nearest neighbor
from scipy.spatial import distance
Y = distance.cdist(minority_points, majority_points, 'euclidean')

K = np.argsort(Y)
print (Y)
print ("Ordered data: \n", K)
Y.sort()
print ("After short: \n", Y)
#result
[[2.23606798 1.41421356 1.         1.41421356 2.23606798 2.
  1.         1.         2.         2.23606798 1.41421356 2.23606798
  2.82842712 2.23606798 2.82842712 3.60555128 3.16227766 3.
  3.16227766 3.60555128]
 [2.82842712 2.23606798 2.         2.23606798 2.82842712 2.23606798
  1.41421356 1.41421356 2.23606798 2.         1.         2.
  2.23606798 1.41421356 2.23606798 2.82842712 2.23606798 2.
  2.23606798 2.82842712]
 [3.60555128 2.82842712 2.23606798 2.         2.23606798 3.16227766
  2.23606798 1.         1.41421356 3.         2.         1.
  3.16227766 1.         1.41421356 3.60555128 2.82842712 2.23606798
  2.         2.23606798]
 [3.16227766 3.         3.16227766 3.60555128 4.24264069 2.23606798
  2.         2.82842712 3.60555128 1.41421356 1.         3.16227766
  1.         2.         3.         1.41421356 1.         1.41421356
  2.23606798 3.16227766]
 [3.60555128 3.16227766 3.         3.16227766 3.60555128 2.82842712
  2.23606798 2.23606798 2.82842712 2.23606798 1.41421356 2.23606798
  2.         1.         2.         2.23606798 1.41421356 1.
  1.41421356 2.23606798]]
Ordered data: 
 [[ 2  6  7  1  3 10  5  8  0 13 11  9  4 12 14 17 16 18 15 19]
 [10  6  7 13  9  2 17 11  1  3  5  8 18 12 14 16  0  4 15 19]
 [ 7 11 13  8 14  3 18 10 19  2  4 17  6  1 16  9 12  5 15  0]
 [16 10 12  9 17 15  6 13  5 18  7  1 14  0  2 11 19  8  3  4]
 [17 13 16 10 18 14 12  9 15 11 19  7  6  5  8  2  3  1  4  0]]
After short: 
 [[1.         1.         1.         1.41421356 1.41421356 1.41421356
  2.         2.         2.23606798 2.23606798 2.23606798 2.23606798
  2.23606798 2.82842712 2.82842712 3.         3.16227766 3.16227766
  3.60555128 3.60555128]
 [1.         1.41421356 1.41421356 1.41421356 2.         2.
  2.         2.         2.23606798 2.23606798 2.23606798 2.23606798
  2.23606798 2.23606798 2.23606798 2.23606798 2.82842712 2.82842712
  2.82842712 2.82842712]
 [1.         1.         1.         1.41421356 1.41421356 2.
  2.         2.         2.23606798 2.23606798 2.23606798 2.23606798
  2.23606798 2.82842712 2.82842712 3.         3.16227766 3.16227766
  3.60555128 3.60555128]
 [1.         1.         1.         1.41421356 1.41421356 1.41421356
  2.         2.         2.23606798 2.23606798 2.82842712 3.
  3.         3.16227766 3.16227766 3.16227766 3.16227766 3.60555128
  3.60555128 4.24264069]
 [1.         1.         1.41421356 1.41421356 1.41421356 2.
  2.         2.23606798 2.23606798 2.23606798 2.23606798 2.23606798
  2.23606798 2.82842712 2.82842712 3.         3.16227766 3.16227766
  3.60555128 3.60555128]]

Я хочу получить 3-ближайших соседей каждой точки в minority_points в Major_points и сохранить значение своего массива, а остальные удалить.

Это иллюстрация:

  1. до пересчета / исходный набор данных
  2. после повторной выборки

Красные точки - примеры меньшинства, а синие точки - примеры большинства. Итак, каждый класс меньшинства вычисляет, например, 3 ближайших соседа из большинства. Затем алгоритм убрал несколько точек, которые не являются ближайшими соседями.

1 Ответ

0 голосов
/ 04 июля 2019

Кажется, вы продвинулись довольно далеко, и вам нужна помощь, чтобы двигаться вперед.Одна проблема, связанная с тем, как вы прошли сортировку расстояний.Сначала вы создаете массив расстояний, а затем сортируете их, но при этом вы теряете контекстную информацию для каждого расстояния.У вас есть все расстояния, и они отсортированы, но вы не знаете, к каким точкам они относятся.Этот шаг кажется мне ненужным, и вы можете просто остановиться на K, который является индексами элементов на месте (без потери контекстной информации), имея информацию об их отсортированной позиции.Если вы посмотрите на K, вы можете заметить, что это матрица 5x20, и, учитывая форму ваших majority_points и minoirty_points, (20x2 и 5x2 соответственно), это означает, что K является 2D матрицейс каждой строкой индексы отсортированного расстояния между данным n minority_point всеми m majority_point с.

Давайте рассмотрим пример.Первая строка в K - это

[ 2  6  7  1  3 10  5  8  0 13 11  9  4 12 14 17 16 18 15 19]

, это будет означать, что для первых minority_point [2, 3] самые близкие контрольные точки находятся в индексах 2, 6, 7, 1, 3 и т. Д.порядок, который оказывается [1, 3] [2, 2] [2, 4] [1, 2] и т. д. в этом порядке.Если вы посмотрите, первые 3 - самое короткое расстояние, всего в 1 единице от рассматриваемого minority_point.(Первое по вертикали, второе по горизонтали.) (Обратите внимание, что алгоритм сортировки размещает как самые близкие, так и первые элементы, как они появляются во входном массиве. Таким образом, индекс 2 предшествует 6 или 7даже если они на одинаковом расстоянии.)

Итак, все, что вам нужно сделать, это создать новый массив, скопировав элементы с первыми 3 индексами для каждой строки в K. Это то же самое, что сказать3 ближайших majority_points для каждого из minority_points.

В условных обозначениях это означает просмотр массива majority_points (вместо копирования всего объекта). Должна работать следующая строка (Iпроверил это):

majority_points[K[:,0:3]]

Это означает, что вы извлекаете элементы из K (K[]) из всех строк (первое измерение перед запятой, все из которых являются просто :,)и первые 3 элемента из второго измерения.Это те показатели, которые вы хотели бы получить с majority_points.

. Вывод для меня выглядит так:

[[[1 3]
  [2 2]
  [2 4]]

 [[3 2]
  [2 2]
  [2 4]]

 [[2 4]
  [3 5]
  [4 4]]

 [[5 2]
  [3 2]
  [4 1]]

 [[5 3]
  [4 4]
  [5 2]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...