【发布时间】:2014-09-01 02:57:42
【问题描述】:
我在理解 K-NN 分类如何在 MATLAB 中工作时遇到问题。' 这是问题所在,我有一个大型数据集(超过 1500 个主题的 65 个特征)及其各自类的标签(0 或 1)。 根据向我解释的内容,我必须将数据划分为训练、测试和验证子集,以对数据进行监督训练,并通过 K-NN 对其进行分类。 首先,划分 3 个子组的最佳比例是多少(每个子组大小的 1/3?)。
我研究了 ClassificationKNN/fitcknn 函数,以及 crossval 函数(理想情况下用于划分数据),但我真的不知道如何使用它们。
总而言之,我想 - 将数据分为 3 组 - 用训练子集“训练”KNN(我知道这不是一种需要训练的方法,而是相当于训练) - 对测试子集进行分类并获得它的分类错误/性能 - 进行验证测试有什么意义?
希望你能帮帮我,提前谢谢
编辑:我想我能做到,但是,如果这不是要求太多,你能看看我是否错过了什么吗?这是我的代码,用于随机情况:
nfeats=60;ninds=1000;
trainRatio=0.8;valRatio=.1;testRatio=.1;
kmax=100; %for instance...
data=randi(100,nfeats,ninds);
class=randi(2,1,ninds);
[trainInd,valInd,testInd] = dividerand(1000,trainRatio,valRatio,testRatio);
train=data(:,trainInd);
test=data(:,testInd);
val=data(:,valInd);
train_class=class(:,trainInd);
test_class=class(:,testInd);
val_class=class(:,valInd);
precisionmax=0;
koptimal=0;
for know=1:kmax
%is it the same thing use knnclassify or fitcknn+predict??
predicted_class = knnclassify(val', train', train_class',know);
mdl = fitcknn(train',train_class','NumNeighbors',know) ;
label = predict(mdl,val');
consistency=sum(label==val_class')/length(val_class);
if consistency>precisionmax
precisionmax=consistency;
koptimal=know;
end
end
mdl_final = fitcknn(train',train_class','NumNeighbors',know) ;
label_final = predict(mdl,test');
consistency_final=sum(label==test_class')/length(test_class);
非常感谢您的帮助
【问题讨论】:
-
我对 MATLAB 方面的 K-NN 了解不多,但我认为此链接中的第一个答案解释了为什么您有三个子集:stats.stackexchange.com/questions/9357/…。总而言之(如果您不想阅读它),测试是最初适合您的模型,验证是调整然后选择最适合的,测试是衡量真实世界的性能。
-
我想我能做到,但如果有人能检查我的代码,那就太棒了。不知道有没有更好的方法比较真实的test_label和预测的label。
-
您的编辑看起来不错,但我没有使用您的 matlab 版本,而且我的版本非常不同,所以我无法可靠地承认。对不起。您应该使用一些具有明显特征-类关系的真实数据来测试您的程序,而不是随机数据和类。
标签: matlab machine-learning classification knn supervised-learning