2016-12-04 157 views
-1

我需要实现KNN算法来分类数据。 我有一个测试矩阵(200 * 25)和一个火车矩阵(800 * 25)。 我需要找到kNN和它的精度matlab k = 1,3,5。查找K最近邻居

这是到目前为止我的代码,但我不知道:

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 

回答

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 

让你与所有训练实例j=1,2,...rtrain测试实例idx之间的距离。太棒了,那几乎就是1-NN。现在你所要做的就是找到最小距离并检查班级标签。

要找到最近的邻居的指数,你可以这样做:

[~, neighbour] = min(dists); 

min返回两个值:最低和最小的指数。通过这个代码,你忽略了距离,只取最近邻居的索引。

要扩展此代码的k-NN,请使用sort而不是min。它的行为相似。

+0

我很感谢如果k> 1向我解释这个和写代码 –