Matlab中的KNN算法
classification
machine-learning
matlab
4
0

我正在研究拇指识别系统。我需要实现KNN算法对我的图像进行分类。根据 ,它仅具有2个测量值,其通过该计算距离寻找最近邻但在我的情况下,我具有25 X 42 400个图像,其中,200是用于训练和200用于测试。我正在搜索几个小时,但找不到找到两点之间距离的方法。

编辑:我已经将第1张200图像重塑为1 X 1050,并将它们存储在200 X 1050的矩阵trainingData中。类似地,我制作了testingData

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

这是k近邻分类的示例代码(使用的某些功能需要“统计”工具箱):

%# 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))
收藏
评论

如果要计算向量ab之间的欧几里得距离 ,只需使用毕达哥拉斯 。在Matlab中:

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

但是,您可能要使用pdist一次为矩阵中所有矢量组合计算它。

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

我将列解释为要分类的实例,将行解释为潜在的邻居。不过,这是任意的,您可以切换它们。

如果有单独的测试集,则可以使用pdist2计算到训练集中的实例的距离:

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

您可以使用此距离矩阵对向量进行knn分类,如下所示。我将生成一些随机数据作为示例,这将导致较低的准确性(大约机会级别)。但是,当然您应该插入实际数据,结果可能会更好。

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

看一下neighborvalsneighborindex矩阵,看看它们是否对您有意义。第一个是较早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)
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号