寻找K-最近邻居

时间:2016-12-04 12:25:30

标签: matlab knn

我需要实现KNN算法来对数据进行分类。 我有一个测试矩阵(200 * 25)和一个列车矩阵(800 * 25)。 我需要在matlab中找到KNN及其精度 对于k = 1,3,5。

这是我的代码到目前为止,但我不确定:

clc
clear all
close all

train=load('Train.txt');
[rtrain,ctrain]=size(train);
xtrain=zeros(rtrain,ctrain-1);
xtrain=train(:,1:ctrain-1);


test=load('Test.txt');
[rtest,ctest]=size(test);
xtest=zeros(rtest,ctest-1);
xtest=test(:,1:ctest-1);


dist=zeros(rtrain,1);
N = size(rtrain,1);
dists = zeros(N,1);
for idx = 1 : N
    for j=1:rtrain
    dists(idx) = sqrt(sum((xtest(idx,:) - xtrain(j,:)).^2))
    end
end

1 个答案:

答案 0 :(得分:0)

xtrain=zeros(rtrain,ctrain-1);
xtrain=train(:,1:ctrain-1);

是多余的。你只需要第二个陈述。

再来一次:

dist=zeros(rtrain,1);
N = size(rtrain,1);
dists = zeros(N,1);

除了现在您使用了distdists。你只想要第二个任务 - 第一个任务实际上覆盖了Matlab的dist函数。

所以,回到k-NN。此

for idx = 1 : N
    for j=1:rtrain
        dists(idx) = sqrt(sum((xtest(idx,:) - xtrain(j,:)).^2))
    end
end

为您提供测试实例idx与所有培训实例j=1,2,...rtrain之间的距离。太好了,那差不多是1-NN。现在你所要做的就是找到最小的距离并检查班级标签。

要查找最近邻居的索引,您可以这样做:

[~, neighbour] = min(dists);

min返回两个值:最小值和最小值索引。使用此代码,您将忽略距离并仅采用最近邻居的索引。

要为k-NN扩展此代码,请使用sort代替min。它的行为类似。