В одной из прошлых статей я переписал простую нейронную сеть с Python’а на Java, что позволило мне начать подробнее изучать нейронные сети, а также ставить эксперименты с ними. Я решил попробовать нестандартный подход и алгоритмически решить задачу распознавания рукописных цифр из набора MNIST. Для этого сравнил образец со средним экземпляром класса, а также сравнил их моменты Ху. Полученные результаты сопоставил с решением на основе нейронной сети, и выбрал победителя.
Мне не нравится долгое обучение сети (но с этим можно бороться), а также я крайне недоволен тем, что сеть распознаёт хорошо только цифры из тестового набора, а цифры, написанные моей рукой, сеть распознаёт с точностью 50-60%, и то если я начинаю подстраиваться под неё, рисуя «нужные».
Я подумал, что задачу распознавания цифр можно решить проще — алгоритмически. Первое что приходит на ум: можно взять взять обучающее множество и создать для каждого класса некую среднюю картинку, с которой потом можно сравнить тестовый образец. В моём понимании это «алгоритм здравого смысла».
Чтобы получить среднюю картинку для класса, было бы неплохо разбить обучающее множество по цифрам, и каждое такое подмножество отсортировать. С разбиением обучающего множества на 10 подмножеств проблем нет, а для сортировки необходимо научиться сравнивать картинки. Для этого буду использовать евклидово расстояние, представив картинку как вектор с 784 компонентами. Чем меньше расстояние между картинками, тем ближе они друг к другу.