MATLAB中如何使用KNN对数据进行分类?

Posted

技术标签:

【中文标题】MATLAB中如何使用KNN对数据进行分类?【英文标题】:How to use KNN to classify data in MATLAB? 【发布时间】: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 版本,而且我的版本非常不同,所以我无法可靠地承认。对不起。您应该使用一些具有明显特征-类关系的真实数据来测试您的程序,而不是随机数据和类。 【参考方案1】:

对于您的第一个问题 “划分 3 个子组的最佳比例是多少”只有经验法则:

    训练数据量是最重要的。越多越好。 因此,使其尽可能大,并且绝对大于测试或验证数据。

    测试和验证数据具有相似的功能,因此可以方便地为它们分配相同的数量 数据的。但重要的是要有足够的数据来识别过度适应。所以他们 应该完全随机地从数据基础中挑选出来。

因此,50/25/25 或 60/20/20 分区很常见。但是,如果您的数据总量与您选择的拓扑的权重总数相比很小(例如,您的网络中有 10 个权重,数据中只有 200 个案例),那么 70/15/15 甚至 80/10/10可能是更好的选择。

关于您的第二个问题 “进行验证测试有什么意义?”

通常,您在训练数据上训练所选模型,然后通过将训练模型应用于未见数据(验证集)来估计“成功”。

如果您现在完全停止提高准确性的努力,那么您确实不需要数据的三个分区。但通常,你觉得你可以通过例如提高你的模型的成功率。改变权重或隐藏层的数量或......现在开始运行一个大循环并进行多次迭代:

1) 更改权重和拓扑,2) 训练,3) 验证,不满意,转到 1)

这个循环的长期影响是,您越来越多地使模型适应验证数据,因此结果变得更好不是因为您如此聪明地改进了拓扑,而是因为您无意识地学习了验证集的属性以及如何对付他们。

现在,您的神经网络的最终且唯一有效的准确度是根据真正看不见的数据估算的:测试集。这仅进行一次,并且对于揭示过度适应也很有用。现在不允许你开始第二个更大的循环来禁止对测试集的任何适应!

【讨论】:

我喜欢你的回答,但我有一个问题:如果你的数据量相对于权重总数来说是巨大的,为什么你还要更多地权衡训练?我想如果你的权重数量更高,那么你会想要使用更多的训练数据来获得更好的拟合。我只是不明白为什么反过来也是如此。 谢谢,周斯特。你说得对,我更正了这段话。 我明白了,目的以及如何在理论上划分和使用子组,但是如何使用KNN呢?我不知道如何使用 KNN 函数,更不知道如何根据验证结果操纵其权重/拓扑。你也可以帮我吗?不管怎样,谢谢你的回答 我的朋友,这与其说是科学,不如说是一门艺术!您需要大量训练人工神经网络的经验以提高其准确性。我的意思是“很多”!不是几天,而是几个月。最好的办法是让你身边的人对 ANN 有经验,让你在他做这项工作的同时学习。我担心无论是 *** 还是任何教程都不足以教会您需要在正确的时间做正确的事情的感觉。但刚开始,尝试,学习!我的建议:只选择一个隐藏层和几个权重。首先减少你的 65 个特征,例如使用 PCA。 我想我能做到,但如果有人能检查我的代码,那就太棒了。不知道有没有更好的方法比较真实的test_label和预测的label。

以上是关于MATLAB中如何使用KNN对数据进行分类?的主要内容,如果未能解决你的问题,请参考以下文章

Matlab中的KNN文本分类

在matlab中加载一个数据集进行knn分类

Matlab中使用KNN进行数据分类

如何定义kNN分类器的最大k?

如何在 weka 中使用高尔距离进行 KNN?

用matlab对数据分类汇总