Распознавание рукописных цифр из базы MNIST с помощью PCA

Простой метод распознавания рукописных цифр на python, дающий, тем не менее почти 97% результат на базе MNIST.

Для упрощения работы с базой используется пакет python-mnist, для уменьшения размерности - метод главных компонент(он же PCA), а для классификации - KNeighborsClassifier из пакета sklearn.

Вот 20 главных компонент, полученных алгоритмом:

А вот результат работы:

tested 10000 digits

correct: 9689 wrong: 311

error rate: 3.11 %

got correctly 96.89 %

Собственно, код:

def recognizePCA(train, trainlab, test, labels, num=None):

    if num is None:
        num=len(test)

    train4pca = np.array(train)
    test4pca = np.array(test)

    n_components = 20

    #fitting pca
    pca = RandomizedPCA(n_components=n_components).fit(train4pca)



    xtrain = pca.transform(train4pca)

    xtest = pca.transform(test4pca)

    clf = KNeighborsClassifier()

    #fitting knn
    clf = clf.fit(xtrain, trainlab)

    #predicting
    y_pred = clf.predict(xtest[:num])



#checking the result and printing output
    r=0
    w=0
    for i in range(num):
        if y_pred[i] == labels[i]:
            r+=1
        else:
            w+=1
    print "tested ", num, " digits"
    print "correct: ", r, "wrong: ", w, "error rate: ", float(w)*100/(r+w), "%"
    print "got correctly ", float(r)*100/(r+w), "%"

    return pca.components_

Использование:

from mnist import MNIST
import numpy as np
from sklearn.decomposition import RandomizedPCA
from sklearn.neighbors import KNeighborsClassifier

mndata = MNIST('path_to_mnist')
trainims, trainlabels = mndata.load_training()
ims, labels = mndata.load_testing()

recognizePCA(trainims, trainlabels, ims, labels)
Written on May 18, 2015