我需要实现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
答案 0 :(得分:0)
此
xtrain=zeros(rtrain,ctrain-1);
xtrain=train(:,1:ctrain-1);
是多余的。你只需要第二个陈述。
再来一次:
dist=zeros(rtrain,1);
N = size(rtrain,1);
dists = zeros(N,1);
除了现在您使用了dist
和dists
。你只想要第二个任务 - 第一个任务实际上覆盖了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
。它的行为类似。