在一个功能中对多个功能进行排序

时间:2015-11-24 17:12:46

标签: matlab classification knn

我有一个功能,我从四个随机源接收输入数据和其他数据。此功能必须重复12次,并且应设置12次。此功能也应重复10次。是否有更紧凑的方式来执行我正在做的事情?

setRoot

1 个答案:

答案 0 :(得分:1)

您目前面临的最大问题是您有12个独立的变量来执行12个相关操作。不要那样做。将所有变量合并到一个容器中,然后遍历容器。

我有以下建议:

  1. X_1X_2,... X_12合并到一个容器中。在此可以谨慎使用单元阵列或结构。在这种情况下,我将使用单元格数组,因为您的代码目前使用它们,这可能是您转换到最容易的事情。

  2. 为训练和测试集数据和标签创建四个主单元格数组,并在每个单元格数组中包含包含每个试验的嵌套单元格数组。

  3. 循环在步骤#1中创建的单元阵列,并将结果分配给四个主单元阵列中的每一个。

  4. 因此,想到这样的事情:

    X = {X_1, X_2, X_3, X_4, X_5, X_6, X_7, X_8, X_9, X_10, X_11, X_12};
    Y = {Y_1, Y_2, Y_3, Y_4, Y_5, Y_6, Y_7, Y_8, Y_9, Y_10, Y_11, Y_12};
    N = numel(X);
    num_iterations = 10;
    X_train = cell(1, num_iterations);
    Y_train = cell(1, num_iterations);
    X_test = cell(1, num_iterations);
    Y_test = cell(1, num_iterations);
    Percent = 0.7;
    
    for ii = 1 : num_iterations
        for jj = 1 : N
            vals = X{jj};
            labels = Y{jj};
            num_points = size(vals,1);
            split_point = round(num_points*Percent);
            sequence = randperm(num_points);
            X_train{ii}{jj} = vals(sequence(1:split_point),:);
            Y_train{ii}{jj} = labels(sequence(1:split_point));
            X_test{ii}{jj} = vals(sequence(split_point+1:end),:);
            Y_test{ii}{jj} = labels(sequence(split_point+1:end));
        end
    end
    

    因此,要访问特定迭代的训练数据,您可以这样做:

    data = X_train{ii}; 
    

    ii是您要访问的迭代。 data现在是一个单元格数组,因此如果您想访问特定组的培训数据,您现在可以执行以下操作:

    group = data{jj};
    

    jj是您要访问的群组。但是,您可以通过以下方式将其合并为一步:

    group = X_train{ii}{jj};
    

    您将在我上面编写的代码的各个部分中看到此语法。您对代码中的其他数据(X_test, Y_train, Y_test)执行相同操作。

    我认为你会同意这个更紧凑,更重要。