Daniel@0: % --- Daniel@0: % class cvpartition_trunctrain Daniel@0: % NOTE: this is a fake cvpartition double for Daniel@0: % using cvpartitions in truncated-training size experiments Daniel@0: % Daniel@0: % differently from cvpartition_trunctrain, we take all the training sizes Daniel@0: % at once and generate training partitions where the smaller ones are subsets Daniel@0: % of the bigger ones Daniel@0: % --- Daniel@0: classdef cvpartition_trunctrain_incsubsets Daniel@0: Daniel@0: properties (Hidden) Daniel@0: Daniel@0: mtest; Daniel@0: mtraining; Daniel@0: end Daniel@0: properties Daniel@0: N; Daniel@0: NumTestSets; Daniel@0: TrainSize; Daniel@0: TestSize; Daniel@0: end Daniel@0: Daniel@0: Daniel@0: methods Daniel@0: Daniel@0: % --- Daniel@0: % constuctor: directly calculates the truncated testset Daniel@0: % --- Daniel@0: function P = cvpartition_trunctrain_incsubsets(Pin, perctrain) Daniel@0: Daniel@0: % --- Daniel@0: % NOTE: we use a different permutation for each cv-Buun (testset), Daniel@0: % as otherwise the very small training sets will have about the same Daniel@0: % data Daniel@0: % --- Daniel@0: if ~cvpartition_trunctrain_incsubsets.exists_permutation(Pin) Daniel@0: cvpartition_trunctrain_incsubsets.renew_permutation(Pin); Daniel@0: end Daniel@0: Daniel@0: P.N = Pin.N; Daniel@0: P.NumTestSets = Pin.NumTestSets; Daniel@0: Daniel@0: for i = 1:Pin.NumTestSets Daniel@0: Daniel@0: % copy testing data Daniel@0: P.TestSize(i) = Pin.TestSize(i); Daniel@0: P.mtest{i} = Pin.test(i); Daniel@0: Daniel@0: % calculate new training size Daniel@0: P.TrainSize(i) = ceil(perctrain * Pin.TrainSize(i)); Daniel@0: Daniel@0: % get actual training indices Daniel@0: idx = find(Pin.training(i)); Daniel@0: Daniel@0: % --- Daniel@0: % NOTE: the Test-Set-Specific permutation is applied Daniel@0: % we only extract as many indices as fit in Pin Daniel@0: % --- Daniel@0: permu = cvpartition_trunctrain_incsubsets.get_permutation(i,Pin.TrainSize(i)); Daniel@0: Daniel@0: % truncate the indices Daniel@0: idx = idx(permu(1:P.TrainSize(i))); Daniel@0: Daniel@0: % build truncated training set Daniel@0: P.mtraining{i} = false(P.N, 1); Daniel@0: P.mtraining{i}(idx) = true; Daniel@0: end Daniel@0: end Daniel@0: function out = test(P, i) Daniel@0: Daniel@0: out = P.mtest{i}; Daniel@0: end Daniel@0: Daniel@0: function out = training(P, i) Daniel@0: Daniel@0: out = P.mtraining{i}; Daniel@0: end Daniel@0: end Daniel@0: Daniel@0: methods (Static) Daniel@0: Daniel@0: % --- Daniel@0: % TODO: save the permutation in a global variable, Daniel@0: % tomake the same smaller set available Daniel@0: % for all further experiments. Daniel@0: % moreover, it would be great if the smaller training sets Daniel@0: % are subsets of the bigger ones Daniel@0: % --- Daniel@0: function renew_permutation(P) Daniel@0: global globalvars; Daniel@0: Daniel@0: if isfield(globalvars.camir, ... Daniel@0: 'cvpartition_trunctrain_incsubsets'); Daniel@0: warning 'renwewing permutations for train sets'; Daniel@0: end Daniel@0: Daniel@0: for i = 1:P.NumTestSets Daniel@0: globalvars.camir.cvpartition_trunctrain_incsubsets.permutation(i).data = ... Daniel@0: randperm(P.N); Daniel@0: end Daniel@0: end Daniel@0: Daniel@0: function idx = get_permutation(testId, trainSize) Daniel@0: % returns the permutation for specific test set Daniel@0: global globalvars; Daniel@0: Daniel@0: idx = globalvars.camir.cvpartition_trunctrain_incsubsets.permutation(testId).data; Daniel@0: Daniel@0: % cut the permutation to contain no exxcess numbers Daniel@0: idx = idx(idx <= trainSize); Daniel@0: end Daniel@0: Daniel@0: function out = exists_permutation(P) Daniel@0: global globalvars; Daniel@0: if isfield(globalvars.camir, ... Daniel@0: 'cvpartition_trunctrain_incsubsets'); Daniel@0: Daniel@0: out = (numel(globalvars.camir.cvpartition_trunctrain_incsubsets.permutation) == P.NumTestSets) ... Daniel@0: && (numel(globalvars.camir.cvpartition_trunctrain_incsubsets.permutation(1).data) == P.N); Daniel@0: Daniel@0: Daniel@0: else out = false; Daniel@0: end Daniel@0: end Daniel@0: Daniel@0: end Daniel@0: end