КНН Алго в Matlab

Я работаю над системой распознавания большого пальца. Мне нужно реализовать алгоритм KNN для классификации моих изображений. в соответствии сэтот, он имеет только 2 измерения, по которым он вычисляет расстояние, чтобы найти ближайшего соседа, но в моем случае у меня есть 400 изображений 25 х 42, из которых 200 для обучения и 200 для тестирования. Я ищу несколько часов, но не нахожу способ найти расстояние между точками.

РЕДАКТИРОВАТЬ:     Я изменил 1-е 200 изображений в 1 X 1050 и сохранил их в матрицеtrainingData 200 X 1050. аналогично я сделалtestingData.

 Muaz Usmani01 июн. 2012 г., 21:44
Я хочу найти расстояния между точками, чтобы я мог применить k-nn algo.
 Oliver Charlesworth01 июн. 2012 г., 21:30
Какой вопрос здесь?
 Gunther Struyf01 июн. 2012 г., 21:08
не можете открыть вашу ссылку, если вы ищете «загрузить файл»; вы найдете множество альтернатив для хостинга
 Muaz Usmani01 июн. 2012 г., 21:21
Простите за это.

Ответы на вопрос(3)

Решение Вопроса

е используемые функции требуют набора инструментов статистики):

%# image size
sz = [25,42];

%# training images
numTrain = 200;
trainData = zeros(numTrain,prod(sz));
for i=1:numTrain
    img = imread( sprintf('train/image_%03d.jpg',i) );
    trainData(i,:) = img(:);
end

%# testing images
numTest = 200;
testData = zeros(numTest,prod(sz));
for i=1:numTest
    img = imread( sprintf('test/image_%03d.jpg',i) );
    testData(i,:) = img(:);
end

%# target class (I'm just using random values. Load your actual values instead)
trainClass = randi([1 5], [numTrain 1]);
testClass = randi([1 5], [numTest 1]);

%# compute pairwise distances between each test instance vs. all training data
D = pdist2(testData, trainData, 'euclidean');
[D,idx] = sort(D, 2, 'ascend');

%# K nearest neighbors
K = 5;
D = D(:,1:K);
idx = idx(:,1:K);

%# majority vote
prediction = mode(trainClass(idx),2);

%# performance (confusion matrix and classification error)
C = confusionmat(testClass, prediction);
err = sum(C(:)) - sum(diag(C))
 03 июн. 2012 г., 22:21
@ user1420026: это цели класса (метка каждого экземпляра), которые должны указываться при выполнении классификации (контролируемое обучение).
 03 июн. 2012 г., 23:38
@ user1420026: это именно метки данных обучения:trainData = labelData;, Затем сделайте то же самое для тестовых данных (если они у вас есть - тестовые метки требуются, только если вы хотите измерить производительность классификатора, как я делал в части кода)
 Muaz Usmani03 июн. 2012 г., 13:41
Спасибо, сэр. Я сказал вам, у меня естьtrainingData порядка 200 X 1050. Это означает, что 200 - это все изображения, а 1050 - это размеры изображения (что на самом деле составляет 25 X 42). мой вопрос к вам, как я могу заменитьtrainClass = randi([1 5], [numTrain 1]); с моим кодом.
 Muaz Usmani03 июн. 2012 г., 22:50
это мои данные лейблаlabelData = zeros(200,1); labelData(1:100,:) = 0; labelData(101:200,:) = 1;, Так как использовать это здесь?

knnclassify

Поиграйте с количеством соседей, которых вы хотите сохранить, чтобы получить лучший результат (используйте путаницу). Эта функция, конечно, заботится о расстоянии.

 02 июн. 2012 г., 15:07
KNN - самый простой алгоритм машинного обучения! K для того, «сколько ближайших соседей должно быть вокруг человека, которого вы рассматриваете», оставьте класс, который больше присутствует среди этих соседей, и расстояние, в основном это евклидово расстояние ... кроме того, user1420026 явно попросил & quot; функция для knn ".
 02 июн. 2012 г., 15:24
Честно говоря, OP не спрашивал о функции knn четко в вопросе, только в более позднем комментарии. Но если это не домашняя работа или какой-то учебный проект,knnclassify вероятно, наиболее удобная вещь для использования в OP. Так что +1 за полезную функцию и ссылку с примерами :)
 02 июн. 2012 г., 12:12
Действительно не отвечает на вопрос, как найти расстояния, и не разъясняет, как работает knn, но в остальном хорошее и простое решение :)

Если вы хотите вычислитьЕвклидово расстояние между векторамиa а такжеb, просто используйтеПифагор, В Matlab:

dist = sqrt(sum((a-b).^2));

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

dist = squareform(pdist(myVectors, 'euclidean'));

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

Если у вас есть отдельный набор тестов, вы можете рассчитать расстояние до экземпляров в обучающем наборе с помощьюpdist2:

dist = pdist2(trainingSet, testSet, 'euclidean')

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

m = rand(nrOfVectors,nrOfFeatures); % random example data
classes = randi(nrOfClasses, 1, nrOfVectors); % random true classes
k = 3;  % number of neighbors to consider, 3 is a common value

d = squareform(pdist(m, 'euclidean')); % distance matrix
[neighborvals, neighborindex] = sort(d,1); % get sorted distances

Посмотрите наneighborvals а такжеneighborindex матрицы и посмотрим, имеют ли они смысл для вас. Первая - это отсортированная версия ранееd матрица, а последний дает соответствующие номера экземпляров. Обратите внимание, что собственные расстояния (по диагонали вd) поплыли на вершину. Нас это не интересует (всегда ноль), поэтому мы пропустим верхнюю строку на следующем шаге.

assignedClasses = mode(neighborclasses(2:1+k,:),1);

Таким образом, мы назначаем самый распространенный класс среди k ближайших соседей!

Вы можете сравнить назначенные классы с фактическими классами, чтобы получить оценку точности:

accuracy = 100 *  sum(classes == assignedClasses)/length(classes);
fprintf('KNN Classifier Accuracy: %.2f%%\n', 100*accuracy)

Или составьте путаницу, чтобы увидеть распределение классификаций:

confusionmat(classes, assignedClasses)
 02 июн. 2012 г., 06:39
@Junuxx: если у вас есть отдельные данные поезда / теста, вы должны использовать PDIST2 для вычисления всех парных расстояний между точками в тестовом наборе по отношению к точке в тренировочном наборе
 01 июн. 2012 г., 22:19
Вы "тренируетесь" (на самом деле не обязательно, если только вы не хотите знать и сравнивать производительность на тренировочном наборе) KNN путем расчета расстояний. Вы вычисляете все попарные расстояния, а затем находите K экземпляров, ближайших (наименьшее расстояние) к экземпляру, который вы хотите классифицировать. Назначьте самый общий класс среди этих соседей экземпляру.
 02 июн. 2012 г., 04:15
Ну, я расширил свой ответ объяснением всего процесса knn. И без всяких петель!
 Muaz Usmani01 июн. 2012 г., 22:11
есть ли функция для кнн? на самом деле я хочу тренировать свою систему
 02 июн. 2012 г., 12:03
@ Амро: Хорошее предложение, не знал оpdist2 но я обновлю свой ответ :)

Ваш ответ на вопрос