Кажется, я не могу понять, как использовать ядро радиальной базисной функции для задачи классификации в python

#python #numpy #machine-learning #classification #kernel-density

#python #numpy #машинное обучение #классификация #плотность ядра

Вопрос:

Мне поручено использовать Parzen windows с ядром радиальной базисной функции, чтобы определить, какую метку присвоить данной точке.

Мой набор обучающих данных имеет 4 измерения (по 4 объекта на точку). Мой набор обучающих меток содержит метки (которые могут быть 0,1,2, … в зависимости от того, сколько классов у нас есть) для всех точек в моем обучающем наборе (это 1D-массив). Мой набор тестовых данных содержит пару точек с 4 измерениями, но без меток, так что это массив nx4.

Мы заинтересованы в том, чтобы дать метки для каждой из точек в моем наборе тестовых данных.

Сначала я вычисляю ядро rdf $ k (x_i,x) $: (используя python и numpy)

 for (i, ex) in enumerate(test_data):

    squared_distances = (np.sum((np.abs(ex - self.train_inputs)) ** 2, axis=1)) ** (1.0 / 2)
    k = np.exp(- squared_distances/2*(np.square(self.sigma)))
  

Давайте предположим, что test_data это выглядит так :

 [[  0.40614   1.3492   -1.4501   -0.55949]
 [ -1.3887   -4.8773    6.4774    0.34179]
 [ -3.7503  -13.4586   17.5932   -2.7771 ]
 [ -3.5637   -8.3827   12.393    -1.2823 ]
 [ -2.5419   -0.65804   2.6842    1.1952 ]]
  

ex это точка из набора тестовых данных. здесь в качестве примера :

 [ 0.40614  1.3492  -1.4501  -0.55949]
  

self.train_inputs это набор обучающих данных, и он выглядит так

 [[ 3.6216   8.6661  -2.8073  -0.44699]
 [ 4.5459   8.1674  -2.4586  -1.4621 ]
 [ 3.866   -2.6383   1.9242   0.10645]
 ...
 [-1.1667  -1.4237   2.9241   0.66119]
 [-2.8391  -6.63    10.4849  -0.42113]
 [-4.5046  -5.8126  10.8867  -0.52846]]
  

k это массив, содержащий все расстояния между каждым x_i (в self.training_inputs ) и нашей текущей контрольной точкой x (которая находится ex в коде).

 k = [0.99837982 0.9983832  0.99874063 ... 0.9988909  0.99706044 0.99698724]
  

Оно имеет ту же длину, что и количество точек self.train_inputs в.

Мое понимание радиальной базисной функции заключается в том, что чем ближе точки обучения к контрольной точке, тем больше значение k(текущая точка обучения, контрольная точка). Однако k никогда не может превышать 1 или быть ниже 0.

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

В коде это переводится следующим образом (дополнительный код помещен под первым фрагментом кода выше) :

 best_arg = np.argmax(k) #selects the greatest value in k and gives back its index.
classes_pred[i] = self.train_labels[best_arg] #we use the index to select the label in the train labels array.
  

Здесь self.train_labels выглядит так :

 [0. 0. 0. ... 1. 1. 1.]
  

Этот подход дает для ex = [ 0.40614 1.3492 -1.4501 -0.55949] и k = [0.99837982 0.9983832 0.99874063 ... 0.9988909 0.99706044 0.99698724] :

818 для индекса, содержащего наибольшее значение в текущем k и 1. в качестве заданной метки self.train_labels[818] = 1.

Однако, похоже, я делаю это неправильно. Учитывая уже реализованный моим учителем алгоритм, я неправильно понимаю некоторые метки (особенно когда у нас более двух классов). Мой вопрос в том, делаю ли я это неправильно? Если да, то где? Кстати, я новичок в машинном обучении.