首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >matlab中的KNN算法

matlab中的KNN算法
EN

Stack Overflow用户
提问于 2012-06-02 02:22:21
回答 3查看 23.5K关注 0票数 1

我正在研究拇指识别系统。我需要实现KNN算法来对我的图像进行分类。根据this的说法,它只有两个测量值,通过这两个测量值计算距离来找到最近的邻居,但在我的例子中,我有400张25x42的图像,其中200张用于训练,200张用于测试。我寻找了几个小时,但我找不到找到点之间距离的方法。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-03 04:50:41

以下是k-最近邻分类的示例代码(使用的一些函数需要统计工具箱):

代码语言:javascript
复制
%# 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))
票数 7
EN

Stack Overflow用户

发布于 2012-06-02 03:50:18

如果你想计算向量ab之间的Euclidean distance,只需使用Pythagoras即可。在Matlab中:

代码语言:javascript
复制
dist = sqrt(sum((a-b).^2));

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

代码语言:javascript
复制
dist = squareform(pdist(myVectors, 'euclidean'));

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

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

代码语言:javascript
复制
dist = pdist2(trainingSet, testSet, 'euclidean')

你可以使用这个距离矩阵对你的向量进行knn分类,如下所示。我将生成一些随机数据作为示例,这将导致较低(接近概率水平)的准确率。但当然,你应该插入你的实际数据,结果可能会更好。

代码语言:javascript
复制
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中的对角线上)已浮动到顶部。我们对此不感兴趣(始终为零),因此我们将在下一步中跳过第一行。

代码语言:javascript
复制
assignedClasses = mode(neighborclasses(2:1+k,:),1);

因此,我们在k个最近的邻居中分配最常见的类!

您可以将分配的类与实际类进行比较,以获得准确度分数:

代码语言:javascript
复制
accuracy = 100 *  sum(classes == assignedClasses)/length(classes);
fprintf('KNN Classifier Accuracy: %.2f%%\n', 100*accuracy)

或者制作一个混淆矩阵来查看分类的分布:

代码语言:javascript
复制
confusionmat(classes, assignedClasses)
票数 2
EN

Stack Overflow用户

发布于 2012-06-02 12:21:37

是的,knn有一个函数:knnclassify

尝试使用您想要保留的邻居数量,以获得最佳结果(使用混淆矩阵)。当然,这个函数负责处理距离。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10855461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档