基于留一法的快速KNN代码

留一法交叉验证(LOOCV)

留一法即Leave-One-Out Cross Validation。这种方法比较简单易懂,就是把一个大的数据集分为k个小数据集,其中k-1个作为训练集,剩下的一个作为测试集,然后选择下一个作为测试集,剩下的k-1个作为训练集,以此类推。其主要目的是为了防止过拟合,评估模型的泛化能力。计算时间较长。

适用场景:

数据集少,如果像正常一样划分训练集和验证集进行训练,那么可以用于训练的数据本来就少,还被划分出去一部分,这样可以用来训练的数据就更少了。loocv可以充分的利用数据。

KNN算法简介与MATLAB实现

KNN算法MATLAB实现

快速留一法KNN

因为LOOCV需要划分N次,产生N批数据,所以在一轮训练中,要训练出N个模型,这样训练时间就大大增加。为了解决这样的问题,根据留一法的特性,我们可以提前计算出不同样本之间的距离(或者距离的中间值),存储起来。使用LOOCV时直接从索引中取出即可。下面的代码以特征选择为Demo,验证快速KNN留一法。

其中FSKNN1是普通KNN,FSKNN2是快速KNN

主函数main.m

数据集划分divide_dlbcl.m

简单KNN

FSKNN1.m

KNN1.m

快速KNN

preKNN.m

FSKNN2.m

KNN2.m

数据集:https://github.com/xyjigsaw/Dataset 下载DLBCL.mat即可。

结果

可以看到FSKNN2+preKNN的时间比FSKNN1要少很多。

 

 

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注