コード例 #1
0
def subject_independent_setting(k_folds,
                                pick_smp_freq,
                                n_components,
                                n_features,
                                bands,
                                order,
                                save_path,
                                num_class=2,
                                sel_chs=None):
    sel_chs = CONSTANT['sel_chs'] if sel_chs == None else sel_chs
    n_folds = k_folds
    save_path = save_path + '/BCIC2a/fbcsp/{}_class/subject_independent'.format(
        num_class)
    n_chs = len(sel_chs)
    n_trials = n_trials_per_class * num_class

    X_train_all, y_train_all = np.zeros(
        (n_subjs, n_trials, n_chs, int(MI_len * pick_smp_freq))), np.zeros(
            (n_subjs, n_trials))
    X_test_all, y_test_all = np.zeros(
        (n_subjs, n_trials, n_chs, int(MI_len * pick_smp_freq))), np.zeros(
            (n_subjs, n_trials))

    id_chosen_chs = raw.chanel_selection(sel_chs)
    for s in range(n_subjs):
        X_train, y_train, X_test, y_test = __load_BCIC2a(
            raw_path, s + 1, pick_smp_freq, num_class, id_chosen_chs)
        X_train_all[s], y_train_all[s] = X_train, y_train
        X_test_all[s], y_test_all[s] = X_test, y_test

    for directory in [save_path]:
        if not os.path.exists(directory):
            os.makedirs(directory)

    # Carry out subject-independent setting with 5-fold cross validation
    for person, (X_val, y_val, X_te, y_te) in enumerate(
            zip(X_train_all, y_train_all, X_test_all, y_test_all)):
        train_subj = [i for i in range(n_subjs)]
        train_subj = np.delete(train_subj, person)  # remove test subject

        # Generating fake data to used for k-fold cross-validation only
        fake_tr = np.zeros((len(train_subj), 2))
        fake_tr_la = np.zeros((len(train_subj)))

        skf = StratifiedKFold(n_splits=n_folds, random_state=42, shuffle=True)
        for fold, (train_ind,
                   val_ind) in enumerate(skf.split(fake_tr, fake_tr_la)):
            print('FOLD:', fold + 1, 'TRAIN:', len(train_ind), 'VALIDATION:',
                  len(val_ind))
            train_index, val_index = train_subj[train_ind], train_subj[val_ind]
            X_train_cat = np.concatenate(
                (X_train_all[train_index], X_test_all[train_index]), axis=0)
            X_val_cat = np.concatenate(
                (X_train_all[val_index], X_test_all[val_index]), axis=0)
            y_train_cat = np.concatenate(
                (y_train_all[train_index], y_test_all[train_index]), axis=0)
            y_val_cat = np.concatenate(
                (y_train_all[val_index], y_test_all[val_index]), axis=0)

            X_train = X_train_cat.reshape(-1, X_train_cat.shape[2],
                                          X_train_cat.shape[3])
            y_train = y_train_cat.reshape(-1)
            X_val = X_val_cat.reshape(-1, X_val_cat.shape[2],
                                      X_val_cat.shape[3])
            y_val = y_val_cat.reshape(-1)
            X_test = X_te
            y_test = y_te

            # Peforming FBCSP feature extraction
            fbcsp_scaler = FBCSP(bands=bands,
                                 smp_freq=pick_smp_freq,
                                 num_class=num_class,
                                 order=order,
                                 n_components=n_components,
                                 n_features=n_features)
            X_train_fbcsp = fbcsp_scaler.fit_transform(X_train, y_train)
            X_val_fbcsp = fbcsp_scaler.transform(X_val)
            X_test_fbcsp = fbcsp_scaler.transform(X_test)
            print(
                "Check dimension of training data {}, val data {} and testing data {}"
                .format(X_train_fbcsp.shape, X_val_fbcsp.shape,
                        X_test_fbcsp.shape))
            SAVE_NAME = 'S{:03d}_fold{:03d}'.format(person + 1, fold + 1)
            __save_data_with_valset(save_path, SAVE_NAME, X_train_fbcsp,
                                    y_train, X_val_fbcsp, y_val, X_test_fbcsp,
                                    y_test)
            print('The preprocessing of subject {} from fold {} is DONE!!!'.
                  format(person + 1, fold + 1))
コード例 #2
0
def subject_dependent_setting(k_folds,
                              pick_smp_freq,
                              n_components,
                              n_features,
                              bands,
                              order,
                              save_path,
                              num_class=2,
                              sel_chs=None):
    sel_chs = CONSTANT['sel_chs'] if sel_chs == None else sel_chs
    n_folds = k_folds
    save_path = save_path + '/BCIC2a/fbcsp/{}_class/subject_dependent'.format(
        num_class)
    n_chs = len(sel_chs)
    n_trials = n_trials_per_class * num_class

    X_train_all, y_train_all = np.zeros(
        (n_subjs, n_trials, n_chs, int(MI_len * pick_smp_freq))), np.zeros(
            (n_subjs, n_trials))
    X_test_all, y_test_all = np.zeros(
        (n_subjs, n_trials, n_chs, int(MI_len * pick_smp_freq))), np.zeros(
            (n_subjs, n_trials))

    id_chosen_chs = raw.chanel_selection(sel_chs)
    for s in range(n_subjs):
        X_train, y_train, X_test, y_test = __load_BCIC2a(
            raw_path, s + 1, pick_smp_freq, num_class, id_chosen_chs)
        X_train_all[s], y_train_all[s] = X_train, y_train
        X_test_all[s], y_test_all[s] = X_test, y_test

    for directory in [save_path]:
        if not os.path.exists(directory):
            os.makedirs(directory)

    # Carry out subject-dependent setting with 5-fold cross validation
    for person, (X_tr, y_tr, X_te, y_te) in enumerate(
            zip(X_train_all, y_train_all, X_test_all, y_test_all)):
        if len(X_tr.shape) != 3:
            raise Exception('Dimension Error, must have 3 dimension')

        skf = StratifiedKFold(n_splits=n_folds, random_state=42, shuffle=True)
        for fold, (train_index, val_index) in enumerate(skf.split(X_tr, y_tr)):
            print('FOLD:', fold + 1, 'TRAIN:', len(train_index), 'VALIDATION:',
                  len(val_index))
            X_tr_cv, X_val_cv = X_tr[train_index], X_tr[val_index]
            y_tr_cv, y_val_cv = y_tr[train_index], y_tr[val_index]

            # Peforming FBCSP feature extraction
            fbcsp_scaler = FBCSP(bands=bands,
                                 smp_freq=pick_smp_freq,
                                 num_class=num_class,
                                 order=order,
                                 n_components=n_components,
                                 n_features=n_features)
            X_tr_fbcsp = fbcsp_scaler.fit_transform(X_tr_cv, y_tr_cv)
            X_val_fbcsp = fbcsp_scaler.transform(X_val_cv)
            X_te_fbcsp = fbcsp_scaler.transform(X_te)
            print(
                'Check dimension of training data {}, val data {} and testing data {}'
                .format(X_tr_fbcsp.shape, X_val_fbcsp.shape, X_te_fbcsp.shape))

            SAVE_NAME = 'S{:03d}_fold{:03d}'.format(person + 1, fold + 1)
            __save_data_with_valset(save_path, SAVE_NAME, X_tr_fbcsp, y_tr_cv,
                                    X_val_fbcsp, y_val_cv, X_te_fbcsp, y_te)
            print('The preprocessing of subject {} from fold {} is DONE!!!'.
                  format(person + 1, fold + 1))