我正在开发一个拇指识别系统。我需要实现KNN算法来对我的图像进行分类。根据这个,它只有两个测量值,通过这些测量值计算距离以找到最近的邻居,但在我的情况下,我有400张25 x 42的图像,其中200张用于训练,200张用于测试。我已经搜索了几个小时,但还没有找到计算点之间距离的方法。
编辑:我已经将前200张图像重塑为1 x 1050,并将它们存储在一个200 x 1050的矩阵trainingData
中。同样,我创建了testingData
。
回答:
以下是k-最近邻分类的一个示例代码(使用的一些函数需要统计工具箱):
%# 图像大小
sz = [25,42];
%# 训练图像
numTrain = 200;
trainData = zeros(numTrain,prod(sz));
for i=1:numTrain
img = imread( sprintf('train/image_%03d.jpg',i) );
trainData(i,:) = img(:);
end
%# 测试图像
numTest = 200;
testData = zeros(numTest,prod(sz));
for i=1:numTest
img = imread( sprintf('test/image_%03d.jpg',i) );
testData(i,:) = img(:);
end
%# 目标类别(我只是使用随机值。请加载你的实际值)
trainClass = randi([1 5], [numTrain 1]);
testClass = randi([1 5], [numTest 1]);
%# 计算每个测试实例与所有训练数据之间的成对距离
D = pdist2(testData, trainData, 'euclidean');
[D,idx] = sort(D, 2, 'ascend');
%# K个最近邻居
K = 5;
D = D(:,1:K);
idx = idx(:,1:K);
%# 多数投票
prediction = mode(trainClass(idx),2);
%# 性能(混淆矩阵和分类错误)
C = confusionmat(testClass, prediction);
err = sum(C(:)) - sum(diag(C))