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

  • Создание набора данных: Мы будем использовать встроенный набор данных, который предоставляет Scikit learn, для классификации цифр на руке.
from sklearn import datasets
digits = datasets.load_digits()
dir(digits)
#OUTPUT OF DIR(DIGITS)
['DESCR', 'data', 'images', 'target', 'target_names']

Переменная digits содержит [‘DESCR’, ‘data’, ‘images’, ‘target’, ‘target_names’]. Нам требуются функции и метки для обучения распознаванию рук. В этом случае мы будем использовать изображения как функции и цели как метки.

print type(digits.images)
print type(digits.target)
#Output these are the numpy array
<type 'numpy.ndarray'>
<type 'numpy.ndarray'>
digits.images.shape
#Image shapes
#Out: (1797, 8, 8)

digits.image - это трехмерный массив. Первое измерение индексирует изображения, и мы видим, что всего у нас 1797 изображений. Следующие два измерения соответствуют координатам x и y пикселей в каждом изображении. Каждое изображение имеет размер 8x8 = 64 пикселя. Другими словами, этот массив может быть представлен в 3D в виде стопки изображений размером 8x8 пикселей каждое. Давайте посмотрим на данные первого изображения 8x8. Каждый слот в массиве соответствует пикселю, а значение в слоте - это количество черного в пикселе.

print digits.images[0]
#Out:
[[ 0.  0.  5. 13.  9.  1.  0.  0.]
 [ 0.  0. 13. 15. 10. 15.  5.  0.]
 [ 0.  3. 15.  2.  0. 11.  8.  0.]
 [ 0.  4. 12.  0.  0.  8.  8.  0.]
 [ 0.  5.  8.  0.  0.  9.  8.  0.]
 [ 0.  4. 11.  0.  1. 12.  7.  0.]
 [ 0.  2. 14.  5. 10. 12.  0.  0.]
 [ 0.  0.  6. 13. 10.  0.  0.  0.]]

Попробуем визуализировать изображение:

import matplotlib.pyplot as plt
plt.imshow(digits.images[0],cmap='binary')
plt.show()

Теперь давайте исследуем целевой атрибут:

print digits.target.shape
print digits.target
#Out:
(1797,)
[0 1 2 ... 8 9 8]

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

Приступим к изготовлению модели.

Разделение данных на обучающие и тестовые наборы (набор цифр)

Мы создаем обучающие и тестовые наборы, чтобы убедиться, что после обучения нашего алгоритма классификации он может хорошо обобщаться для новых данных.

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=0)

Создайте модель для машинного обучения

from sklearn.linear_model import LogisticRegression

Создать экземпляр модели

# все не указанные параметры устанавливаются по умолчанию
logisticRegr = LogisticRegression()

Обучение модели на данных, сохранение информации, полученной из данных

Модель изучает взаимосвязь между цифрами (x_train) и метками (y_train)

logisticRegr.fit(x_train, y_train)

Прогнозирование меток для новых данных (новых изображений)

Использует информацию, полученную моделью в процессе обучения модели.

# Returns a NumPy Array
# Predict for One Observation (image)
logisticRegr.predict(x_test[0].reshape(1,-1))

Прогноз для нескольких наблюдений (изображений) одновременно

logisticRegr.predict(x_test[0:10])

Поздравляю! Наша модель готова к анализу рукописных цифр.