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