KNN Matlab 火车测试交叉验证
KNN Matlab Train Test Cross-validation
所以我想使用我在下面定义的数据(有两个标签)并使用 KNN 进行训练和测试以及交叉验证。我找不到有用的 MATLAB 教程,所以如果你们能帮助我,我将不胜感激。
假设我有
Data=rand(2000,2);
Lables=[ones(1000,1);-1*ones(1000,1)];
我想使用 KNN 并且有:
- 50%的数据用于训练
- 25% 交叉验证
- 25% 测试
您提供的数据不是很好的数据集,因为两组之间没有差异。你应该使用
Data = [rand(1000,2)+delta;rand(1000,2)-delta];
最大的增量越容易 classify
kNN 背后的想法是你不需要任何训练。
假设您有一个包含 N 个标记值的数据集。现在假设您有一个要 class 化的条目。
如果考虑 1-NN classifier,则计算输入与 N 个标记的训练示例之间的距离。输入class被确定为距离最短的例子的标签。
在 k-NN classifier 中,您检查距离最短的示例的 k 个标签是什么。 NN个数多的class获胜
在 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)
所以我想使用我在下面定义的数据(有两个标签)并使用 KNN 进行训练和测试以及交叉验证。我找不到有用的 MATLAB 教程,所以如果你们能帮助我,我将不胜感激。
假设我有
Data=rand(2000,2);
Lables=[ones(1000,1);-1*ones(1000,1)];
我想使用 KNN 并且有:
- 50%的数据用于训练
- 25% 交叉验证
- 25% 测试
您提供的数据不是很好的数据集,因为两组之间没有差异。你应该使用
Data = [rand(1000,2)+delta;rand(1000,2)-delta];
最大的增量越容易 classify kNN 背后的想法是你不需要任何训练。
假设您有一个包含 N 个标记值的数据集。现在假设您有一个要 class 化的条目。
如果考虑 1-NN classifier,则计算输入与 N 个标记的训练示例之间的距离。输入class被确定为距离最短的例子的标签。
在 k-NN classifier 中,您检查距离最短的示例的 k 个标签是什么。 NN个数多的class获胜
在 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)