Да, как указывает Томас, в основном 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