Машинное обучение в настоящее время является популярной областью и обсуждается повсюду. На нем есть множество реализаций с использованием некоторых функциональных или статистических языков программирования, таких как Python или R. Однако Java, популярный язык программирования ООП, который по-прежнему может быть реализован практически для всех алгоритмов машинного обучения. Как разработчик Java, я хотел бы представить алгоритм kNN (K ближайших соседей), поскольку его легко реализовать и понять, не требуя большого количества математических или статистических знаний.

1. Решение, которое будет применено

Рукописный ввод может быть одной из задач, решаемых алгоритмом kNN, и я буду использовать символы кхмерского алфавита в качестве примера задачи для решения. Кхмерский - один из языков Юго-Восточной Азии, на котором говорит камбоджийский народ. В нем много согласных, зависимых или независимых гласных, а также числительных. На изображении ниже представлены числовые скрипты, и мы напишем несколько кодов, чтобы определить, похоже ли оно на ожидаемое число нет, или, другими словами, чтобы его классифицировать.

2. Подготовка данных

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

3. Блок-схема кНН

Чтобы иметь точное представление о том, что мы собираемся написать, давайте посмотрим на блок-схему ниже:

4. Реализация кода Java с использованием Java 8

Сначала необходимо создать класс DataLoader, чтобы загрузить текстовый файл в память. Карта используется, поскольку предпочтительна группировка по папкам.

DistanceCalculator предназначен для вычисления расстояния по евклидовой формуле:

Некоторые классы также необходимо сгенерировать для хранения некоторых данных и значений, как показано ниже:

KnnClassifer - основная логика этой демонстрации. После приведенной ниже блок-схемы приведен код Java:

Наконец, мы создаем основной класс, чтобы объединить все логики в одно приложение.

Если все в порядке, запуск класса Application должен отображаться ниже, как на картинке. Частота ошибок составляет 0,34, а время - 0,572 секунды (может отличаться на вашем ПК в зависимости от характеристик оборудования). Мы можем изменить K_CONSTANT, NUMBER_OF_THREAD или изменить часть parallelStream на обычный поток чтобы увидеть разное время классификации.

5. Заключение

kNN можно экспериментировать с использованием Java и оптимизировать с помощью многопоточности, параллельного потока и многих других функций Java 8. Приложения kNN можно найти в различных областях, включая рекомендательную систему, почерк и другие классификации. Система прогнозирования Uber - один из реальных примеров применения системы алгоритмов kNN . Однако для этого требовалось много вычислений, масштабируемая система и хорошо подготовленный набор для обучения, чтобы избежать проблем с производительностью. Полный код и набор данных этой демонстрации можно найти в https://github.com/engleangs/knnclassifier.

Я надеюсь, что это базовое введение будет для вас полезным. Дайте мне знать, если возникнут какие-либо отзывы или предложения, Cheer !!.