zoukankan      html  css  js  c++  java
  • 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作为训练集。两个集合的选取以最小化交集为原则。


  • 相关阅读:
    faster with MyISAM tables than with InnoDB or NDB tables
    w-BIG TABLE 1-toSMALLtable @-toMEMORY
    Indexing and Hashing
    MEMORY Storage Engine MEMORY Tables TEMPORARY TABLE max_heap_table_size
    controlling the variance of request response times and not just worrying about maximizing queries per second
    Variance
    Population Mean
    12.162s 1805.867s
    situations where MyISAM will be faster than InnoDB
    1920.154s 0.309s 30817
  • 原文地址:https://www.cnblogs.com/wangccc/p/5307927.html
Copyright © 2011-2022 走看看