www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Создание программы распознавания рукописных цифр с использованием классификатора ближайшего соседа

Дата публикации Jul 6, 2017

Классификатор ближайших соседей - один из самых базовых алгоритмов машинного обучения. В этом руководстве описан очень простой метод создания программы распознавания цифр. Мы не будем здесь использовать библиотеку машинного обучения Python. Итак, начнем

Импорт необходимых библиотек

from sklearn import datasets
import matplotlib.pyplot as plt
import numpy as np

В этом уроке будут использованы цифры цифр sklearn.

Загрузка набора данных

digits = datasets.load_digits()

Визуализация данных

digits.dataсодержит изображение в линейном массиве (в данном случае 64 x 1) иdigits.imagesсохраняет их в массиве 8 х 8 Давайте отображать число

fig = plt.figure()
plt.imshow(digits.images[23],cmap = plt.cm.gray_r)
txt = "This is %d"%digits.target[23]
fig.text(0.1,0.1,txt)
plt.show()

это покажет нам изображение по индексу 23

Теперь давайте посмотрим, как это же изображение выглядит как массив.

digits.images[23]

Это даст выход как

array([[  0.,   1.,   8.,  12.,  15.,  14.,   4.,   0.],
[ 0., 3., 11., 8., 8., 12., 12., 0.],
[ 0., 0., 0., 0., 2., 13., 7., 0.],
[ 0., 0., 0., 2., 15., 12., 1., 0.],
[ 0., 0., 0., 0., 13., 5., 0., 0.],
[ 0., 0., 0., 0., 9., 13., 0., 0.],
[ 0., 0., 7., 8., 14., 15., 0., 0.],
[ 0., 0., 14., 15., 11., 2., 0., 0.]])

Чем темнее пиксель, тем больше число. Если вы наведете курсор на большие числа в массиве, вы увидите, что он делает3.

Набор данных для обучения и тестирования

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

x = 100 #length of training data setX_train = digits.data[0:x]
Y_train = digits.target[0:x]

Тестовый набор данных

pred = 813
X_test = digits.data[pred]
print "X_test's real value is %d"%digits.target[pred]

Для нашей программы мы найдемрасстояниятестового изображения с каждым тренировочным изображением, а изображение с наименьшим расстоянием является прогнозируемым значением. Под расстоянием я подразумеваю евклидово расстояние в 64 измерениях. Чтобы вычислить евклидово расстояние, мы просто найдем разницу между числами в каждом индексе, возведем их в квадрат, сложим их и затем возьмем квадратный корень. Итак, давайте определимсяdistфункция.

def dist(x,y):
return np.sqrt(np.sum((x-y)**2))

Эта функция будет работать для любого размерного массива, если и x, и y имеют одинаковые размеры (одна из причин, по которой я люблю python: P).

Теперь давайте спрогнозируем тестовые данные, используяdistфункция.

l = len(X_train)
distance = np.zeros(l)
for i in range(l):
distance[i] = dist(X_train[i],X_test)
min_index = np.argmin(distance)
print "Preditcted value is ",
print(Y_train[min_index])

Это выведет прогнозируемое значение, которое в данном случае равно 9.

Точность нашей модели

Теперь давайте выясним, насколько хорошо наша модель предсказывает.

l = len(X_train)
no_err = 0
distance = np.zeros(l)
for j in range(1697,1797):
X_test = digits.data[j]
for i in range(l):
distance[i] = dist(X_train[i],X_test)
min_index = np.argmin(distance)
if Y_train[min_index] != digits.target[j]:
no_err+=1
print "Total errors for train length = %d is %d"%(x,no_err)

Наш тестовый набор данных содержит 100 примеров. В цикле for он предсказывает число для изображения с индексом j и сравнивает его с его фактическим значением, а затем печатает общее количество ошибок. когдаx = 10014/100значения неверно предсказаны и дляx = 16962/100значения неверно предсказаны. Таким образом, наша модель предсказывает изображения с точностью 98%.


Прогнозирование пользовательских входов (на случай, если вы захотите показать кого-то: P)

Это вторая часть урока, где мы сделаем прогноз для пользовательских входных данных. Вы можете использовать любой редактор изображений здесь мы будем использоватьG.I.M.P.

Следуй этим шагам

  1. Открыть GIMP
  2. Ctrl + N
  3. В следующем окне укажите высоту и ширину как 8. Возможно, вам придется увеличить изображение, так как лист очень маленький
  4. Теперь прокрутите. Если размер указателя меняется, перейдите к следующему шагу, в противном случае следуйтеэтотак что вы можете изменить размер указателя.
  5. Уменьшите размер указателя до минимума.
  6. Перейдите в Инструменты → Инструменты рисования → Кисть или нажмитеП.
  7. Скажите человеку нарисовать число в этом файле.
  8. Перейдите в Файл → Экспорт и сохраните изображение как test.png.
Это test.png

Код Python для доступа к изображению test.png

from scipy import misc
image = misc.imread("/path_to_test.png/test.png",flatten = 1)

Теперь, если вы печатаетеdigits.images[0]вы увидите, что белый пиксель эквивалентен0и чем больше значение, тем темнее пиксель, но если вы печатаетеimageкоторый находится в стандартной форме,255для белых и0для полного черного. Таким образом, мы должны преобразовать его так, чтобы белый цвет соответствовал0а затем мы изменим изображение с 8 х 8 до 64 х 1

image1 = 255 - image
image2 = np.reshape(image1,64)

Если вы посмотрите на любой пример digits.images, вы увидите, что самый черный пиксель соответствует ~ 15, но максимальное значение любого пикселя в вашем пользовательском вводе может быть 255, поэтому, чтобы избежать каких-либо ошибок из-за этого эффекта, мы нормализуем данные (т.е. измените масштаб в диапазоне от 0 до 1). Для этого мы просто найдем максимальное количество в массиве и разделим каждый элемент на это максимальное число.

# Training data
for i in xrange(len(X_train)):
maximum = np.amax(X_train[i])
X_train[i]/=maximum#Testing data
maximum = np.amax(X_test)
X_test/=maximum

Теперь нам пора. Давай предсказывать :)

l = len(X_train)
distance = np.zeros(l) #This will store the distance of test from every training value
for i in range(l):
distance[i] = dist(X_train[i],X_test)
min_index = np.argmin(distance)
# print X_test
print "Preditcted value is "
print(Y_train[min_index])

Это напечатает

Predicted value is 2

Вы можете сделать больше изображений и прогнозировать их.

Весь код доступенВот[https://github.com/Salil-Jain/DigitRecognizer]

Спасибо.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map