Классификация рукописных цифр с помощью PCA

Классифицируйте цифры, написанные от руки, с помощью PCA. Используйте 200 цифр для фазы поезда и 20 для теста.

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


person Gigili    schedule 30.01.2013    source источник
comment
Эта статья о распознавании рукописных символов может показаться вам интересной. Он использует PCA и умный процесс сокращения пространственного поиска. dspace.mit.edu/openaccess-disseminate/1721.1/71572   -  person Gabe Johnson    schedule 31.01.2013


Ответы (3)


Если вы нанесете на график баллы, полученные из PCA, вы увидите, что определенные классы уступают место кластеру.

Простой R-скрипт:

data <- readMat(file.path("testzip.mat"))$testzip
pca <- princomp(t(data))
plot(pca$scores)

Получится такой сюжет:

R график цифр

Я не могу его раскрасить, потому что файл мата не содержал результата вектора для класса цифр. Однако вы видите по крайней мере один кластер, который помогает вам классифицировать этот единственный класс по сравнению с другими (остальные вещи кажутся шумом?).

Также Оливье Гризель (участник scikit-learn) ответил на ваш вопрос о метаоптимизации:

Как использовать PCA для классификации?

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

На самом деле я нашел другой способ сделать «классификацию с помощью PCA» в этом докладе Стефана Малла: каждый класс аппроксимируется аффинным многообразием с первым компонентом в качестве направления и центроидом в качестве смещения, а новые образцы классифицируются путем измерения расстояния до ближайшего многообразие с ортогональной проекцией.

Обсуждение: https://www.youtube.com/watch?v=lFJ7KdSdy0k ( очень интересно для резюме)

Документы по теме: http://www.cmap.polytechnique.fr/scattering/

Но я думаю, что это перебор для вас. Если у вас есть метки классов, вы можете использовать любой классификатор, чтобы соответствовать этой проблеме на выходе PCA. Если нет, выберите кластеризацию на основе плотности, например DBSCAN, и посмотрите, найдет ли она кластер, который вы там видите, и используйте его для классификации новых изображений (например, по расстоянию от среднего значения кластера).

person Thomas Jungblut    schedule 30.01.2013
comment
Большое спасибо за ваш ответ. Разве этот трехстрочный код не будет работать в Matlab? - person Gigili; 31.01.2013
comment
Нп, не знаю. То есть Р. - person Thomas Jungblut; 31.01.2013

Да, как указывает Томас, в основном PCA и связанные с ним методы являются инструментами для уменьшения размерности. Идея состоит в том, чтобы бороться с "проклятием размерности", получая только самую важную информацию и помещая отображение его в подпространство малой размерности. В этом подпространстве вы можете использовать более простые методы для фактической классификации или кластеризации данных.

Вы можете перейти от простого K ближайших соседей до Машины опорных векторов для выполнения классификации. Для этого вам также понадобятся метки данных.

Давайте попробуем самый простой метод (не обязательно лучший) с использованием kNN:

Теперь для выполнения классификации вам понадобится еще один вектор с реальной маркировкой. Скажем, у вас есть 100 изображений размером 16x16 пикселей. Из этих 100 у вас есть 10 цифр «0», 10 цифр «2» и так далее.

Возьмите изображения и сделайте из них вектор размером 1x1600, поместите те. Также создайте вектор 100x1 с «метками». В матлабе что-то вроде:

labels = kron([0:1:9],ones(1,10))

Теперь примените PCA к вашим данным (предполагая, что каждое изображение является столбцом матрицы sampleimgs, поэтому матрица 256x100), вы также можете сделать это с помощью svd:

[coeff,scores]= pca(sampleimgs');

Чтобы отправить их в низкоразмерное пространство, которое вы хотите (скажем, R ^ 2), выберите только два первых основных компонента:

   scatter(scores(:,1),scores(:,2))

Теперь вы можете применить к ним K-NN и классифицировать новое входящее изображение newimg после его отправки в то же подпространство ПК:

 mdl = ClassificationKNN.fit(scores(1:100,[1 2]),labels);

 %get the new image:
 newimgmap = coef(:,1:2)'*newimg
 result = predict(mdl,newimgmap)

Надеюсь, поможет.

person mfcabrera    schedule 01.02.2013

Динг и Хе (2004) показали, что уменьшение размерности с помощью PCA и кластеризация с помощью k-средние тесно связаны. Кластеризация, также известная как обучение без учителя, по-прежнему не является классификацией, известной как обучение с учителем, но, как указывали другие, кластеризация может помочь идентифицировать группы точек данных, принадлежащих разным цифрам.

person A. Donda    schedule 29.08.2014