2015-09-19 69 views
0

所以我想用我的数据,我下面定义(有两个标签),并使用KNN进行培训和测试,也交叉验证。我无法找到有用的MATLAB教程,所以如果你们能帮助我,我很感激。KNN Matlab列车测试交叉验证

想象我有

Data=rand(2000,2); 
Lables=[ones(1000,1);-1*ones(1000,1)]; 

我想用KNN和有:培训数据的

  • 50%
  • 25%交叉验证
  • 25%的测试

回答

0

你给的数据不是这么好的d因为两套之间没有差异。您应该使用

Data = [rand(1000,2)+delta;rand(1000,2)-delta]; 

就越容易将分类 背后k近邻的想法最大的三角洲是,你不需要任何培训。

假设您有一个包含N个标签值的数据集。现在假设你有一个你想分类的条目。

如果您考虑1-NN分类器,则计算输入和N标记的训练示例之间的距离。输入分类为具有最短距离的示例标签。

在k-NN分类器中,检查具有最短距离的示例的k个标签。具有最多NN数量的类获胜。

在MATLAB中,您可以使用knnserach来查找最近的k个索引,或者使用knnclassify来获取标签。

这里是knnserach一个例子

delta = 0.3; 
N1 = 50; 
N2 = 50; 
Data1 = rand(1000,2)+delta; 
Data2 = rand(1000,2)-delta; 
train = [Data1(1:N1,:);Data2(1:N2,:)]; % create a training set 
labels = [ones(N1,1);-1*ones(N2,1)]; % create labels for the training 
plot(train(1:N1,1),train(1:N1,2),'xb',train(N1+1:end,1),train(N1+1:end,2),'or') 
k = 7; % Can't be an even number 
idx = knnsearch(train,Data1(N1+1:end,:),'K',k); % classify for the rest of data 1 
res1 = 0; 
for i=1:size(idx,1) 
    if sum(labels(idx(i,:))) < 0; 
     res1 = res1 + 0; % wrong answer 
    else 
     res1 = res1 + 1; % correct answer 
    end 
end 
idx2 = knnsearch(train,Data2(N2+1:end,:),'K',k); % classify for the rest of data 2 
res2 = 0; 
for i=1:size(idx2,1) 
    if sum(labels(idx2(i,:))) > 0; 
     res2 = res2 + 0; % wrong answer 
    else 
     res2 = res2 + 1; % correct answer 
    end 
end 
corr = res1+res2; 
tot = size(idx2,1)+size(idx,1); 
fprintf('Classified %d right out of %d. %.2f correct\n',corr,tot,corr/tot * 100)