Для скачивания кода перейдите по этой ссылке: https://github.com/Ayanzadeh93/cs231n

Для построения 5 примеров каждого класса CIFAR-10 мы использовали функцию подзаголовка из встроенной функции библиотеки python. Код можно увидеть в коде KNN.py, который просто отображает 5 примеров каждого класса на рис. 1.

Реализация евклидова расстояния:

Два цикла: для реализации с двумя циклами этот код итеративно вычисляет расстояние между каждым экземпляром в наборе тестов и набором поездов. Наконец, он создает матрицу расстояний, в которой показано расстояние между тестовым экземпляром i и поездом j. kNearestNeighbor.py

Один цикл: для реализации только с одним циклом мы используем метод широковещания. На самом деле, в этой части мы используем цикл for для прохождения каждого экземпляра тестовых данных и на каждой итерации i. вычесть один экземпляр тестовых данных из всей матрицы поезда. Затем мы используем функцию суммирования по оси 1, чтобы сложить все вычитаемые элементы. Наконец, после завершения цикла for у нас снова будет матрица расстояний. kNearestNeighbor.py

Нет цикла: в этой части мы используем умножение матриц, чтобы найти формулу для расчета евклидова расстояния. После умножения тестовой матрицы на транспонированную обучающую матрицу каждый элемент этой новой матрицы является результатом векторного умножения одного экземпляра из набора поездов и одного экземпляра из тестового набора. Собственно, в деталях сначала нужно взять квадрат 3 из (X t_rain) и (X_t est), после чего по строке суммируется каждая из X матриц тестовых муравьиных поездов, кроме того, мы вычисляем произведение X t rain и X t est и умножьте их результат на минус два. (−2 ∗ (X t rain ∗ X t est) ). В конце с помощью функции векторизации в numpy мы можем суммировать результат (−2 ∗ (X t rain ∗ X t est)) с суммой квадрата (X t rain) и (xt est ) kNearestNeighbor.py

Выборка из основного набора данных: для создания нового набора данных, содержащего 5000 обучающих и 500 тестовых выборок. Как видно из следующих рисунков, количество образцов в разных классах неодинаково. Но количество выборок каждого класса близко, и можно сказать, что данные почти сбалансированы. На следующих рисунках показана гистограмма нового выборочного поезда и набора тестовых данных на рисунке 2.

Прошедшее время
В случае времени вычисления этих трех различных способов реализации я использовал пакет Time (Tic-Toc) для измерения времени вычисления данных методов. Время вычислений для реализации без цикла, с одним циклом и с двумя циклами составило соответственно 0,291302 с, 59,508242 с и 26,03 с. имеет следующую информацию: Intel Core i7–4702MQ 2,2 ГГц и 8 ГБ ОЗУ, и это получено на основе этой системы.

Реализация двух циклов заняла 26,03 секунды
Реализация одного цикла заняла 59,508242 секунды
Реализация без цикла заняла 0,291302 секунды

визуализация матрицы евклидовых расстояний. На рисунке 3 показано евклидово расстояние между обучающей и тестовой выборками.

прогнозирование меток
Для прогнозирования меток экземпляров в тестовом наборе в зависимости от их расстояния, во-первых, мы сортируем их в соответствии с расстоянием, используя np.argsort, а затем я выбираю k экземпляров с лучшими расстояния, а затем я использую np.bincount для подсчета количества вхождений каждой метки. Наконец, используя argmax, я нахожу ближайший экземпляр к каждому экземпляру запроса. k-кратная перекрестная проверка. В этой части мы разделяем наши обучающие данные и метки на 5 кратных и проверяем k на 1, 3, 5, 8, 10, 12, 15, 20, 50, 100. на основе k-перекрестия метод проверки, на каждой итерации мы выбираем 4 из 5 раз в качестве обучающего набора, а остальные выбираем в качестве набора проверки. Далее в таблице 1 показана средняя точность для каждого k запуска алгоритма для различных k параметров.

Обратите внимание, что все они были выполнены с использованием 5-кратной перекрестной проверки, и эти результаты имеют среднюю точность (вычислите среднее значение сгибов в каждом k). Рисунок 3 также показывает эту идею о том, что k=10 приводит к лучшим результатам. Используя k = 10 для выборочного набора данных, который содержит 5000 обучающих и 500 тестовых выборок, алгоритм может получить среднюю точность 0,2820. В конце вы можете увидеть результаты точности каждого k в 5-кратной перекрестной проверке.