• k-折交叉验证(k-fold crossValidation)


    k-折交叉验证(k-fold crossValidation):
    在机器学习中,将数据集A分为训练集(training set)B和测试集(test set)C,在样本量不充足的情况下,为了充分利用数据集对算法效果进行测试,将数据集A随机分为k个包,每次将其中一个包作为测试集,剩下k-1个包作为训练集进行训练。
    在matlab中,可以利用:
    indices=crossvalind('Kfold',x,k);
    来实现随机分包的操作,其中x为一个N维列向量(N为数据集A的元素个数,与x具体内容无关,只需要能够表示数据集的规模),k为要分成的包的总个数,输 出的结果indices是一个N维列向量,每个元素对应的值为该单元所属的包的编号(即该列向量中元素是1~k的整随机数),利用这个向量即可通过循环控 制来对数据集进行划分。

    例:
       [M,N]=size(data);//数据集为一个M*N的矩阵,其中每一行代表一个样本
        indices=crossvalind('Kfold',data(1:M,N),10);//进行随机分包
        for k=1:10//交叉验证k=10,10个包轮流作为测试集
            test = (indices == k); //获得test集元素在数据集中对应的单元编号
            train = ~test;//train集元素的编号为非test元素的编号
            train_data=data(train,:);//从数据集中划分出train样本的数据
             train_target=target(:,train);//获得样本集的测试目标,在本例中是train样本的实际分类情况
            test_data=data(test,:);//test样本集
            test_target=target(:,test);//test的实际分类情况

            ...........

          end

    ****************************************************************************************************

    crossvalind函数

    关于crossvalind函数 盛经纬 jevonsheng@163.com 

    crossvalind是cross-valindation的缩写,意即交叉检验。 常用的形式有: 

    ①Indices =crossvalind('Kfold', N, K) 

    ②[Train, Test] = crossvalind('HoldOut',N, P) ③[Train, Test] = crossvalind('LeaveMOut',N, M) 

    ④[Train, Test] = crossvalind('Resubstitution',N, [P,Q])  

    ①indices =crossvalind('Kfold', N, K): 

    该命令返回一个对于N个观察样本的K个fold(意为折,有“层”之类的含义,感觉还是英文意思更形象)的标记(indices)。该标记中含有相 同(或者近似相同)比例的1—K的值,将样本分为K个相斥的子集。在K-fold交叉检验中,K-1个fold用来训练,剩下的一个用来测试。此过程循环 K次,每次选取不同的fold作为测试集。K的缺省值为5。 使用程序: 

    [m n]=size(data); %data为样本集合。每一行为一个观察样本 

    indices = crossvalind('Kfold',m,10); %产生10个fold,即indices里有等比例的1-10 

    for i=1:10 

    test=(indices==i); %逻辑判断,每次循环选取一个fold作为测试集 train=~test; %取test的补集作为训练集,即剩下的9个fold 

    data_train=data(trian,:); %以上得到的数都为逻辑值,用与样本集的选 取 label_train=label(train,:); %label为样本类别标签,同样选取相应的训练 集 data_test=data(test,:); %同理选取测试集的样本和标签 label_test=label(test,:); end 

    ②[Train, Test] = crossvalind('HoldOut',N, P): 

    该命令返回一个逻辑值的标记向量,从N个观察样本中随机选取(或近似于)P*N个样本作为测试集。故P应为0-1,缺省值为0.5。 使用程序: 

    groups=ismenber(label,1); %label为样本类别标签,生成一个逻辑矩阵groups,1用来逻辑判断筛选 

    [train, test] = crossvalind('holdOut',groups); %将groups分类,默认比例1:1,即P=0.5 

    ③[Train, Test] = crossvalind('LeaveMOut',N, M): 

    该命令返回一个逻辑值的标记向量,从N个观察样本中随机选取M个样本作为测试集。M的缺省值为1。值得注意的是,LeaveMOut在循环中使用不能保证产生的是互补集合,即每次循环的随机选取是独立的。如果要用互补的话还是使用Kfold命令。 使用程序: 

    [m,n]=size(data); 

    [train,test]=crossvalind('LeaveMOut',m,10) 

    svmStruct = svmtrain(data(train,:),groups(train));  classes = svmclassify(svmStruct,data(test,:));  cp=classperf(groups); cr=cp.CorrectRate  

    ④[Train, Test] = crossvalind('Resubstitution',N, [P,Q]): 

    本函数为②的一个特殊情况。当我不想把P*N剩下的部分全部作为训练集的时候使用该函数,用Q指定一个比例,选取Q*N作为训练集。两个集合的选取以最小化交集为原则。


  • 相关阅读:
    bash:加减乘除(bc、let)
    shell配置文件
    HDU4624 Endless Spin 【最大最小反演】【期望DP】
    SPOJ10707 COT2
    HDU5977 Garden of Eden 【FMT】【树形DP】
    Codeforces1023E Down or Right 【贪心】
    Codeforces1023F Mobile Phone Network 【并查集】【最小生成树】
    UOJ272 [清华集训2016] 石家庄的工人阶级队伍比较坚强 【分治乘法】
    LOJ2721 [NOI2018] 屠龙勇士 【扩展中国剩余定理】
    UOJ268 [清华集训2016] 数据交互 【动态DP】【堆】【树链剖分】【线段树】
  • 原文地址:https://www.cnblogs.com/wangccc/p/5307927.html
Copyright © 2020-2023  润新知