示例#1
0
def test_unsupervised_spatial_filter():
    """Test unsupervised spatial filter."""
    from sklearn.decomposition import PCA
    from sklearn.kernel_ridge import KernelRidge
    raw = io.read_raw_fif(raw_fname)
    events = read_events(event_name)
    picks = pick_types(raw.info, meg=True, stim=False, ecg=False,
                       eog=False, exclude='bads')
    picks = picks[1:13:3]
    epochs = Epochs(raw, events, event_id, tmin, tmax, picks=picks,
                    preload=True, baseline=None, verbose=False)

    # Test estimator
    assert_raises(ValueError, UnsupervisedSpatialFilter, KernelRidge(2))

    # Test fit
    X = epochs.get_data()
    n_components = 4
    usf = UnsupervisedSpatialFilter(PCA(n_components))
    usf.fit(X)
    usf1 = UnsupervisedSpatialFilter(PCA(n_components))

    # test transform
    assert_equal(usf.transform(X).ndim, 3)
    # test fit_transform
    assert_array_almost_equal(usf.transform(X), usf1.fit_transform(X))
    # assert shape
    assert_equal(usf.transform(X).shape[1], n_components)

    # Test with average param
    usf = UnsupervisedSpatialFilter(PCA(4), average=True)
    usf.fit_transform(X)
    assert_raises(ValueError, UnsupervisedSpatialFilter, PCA(4), 2)
示例#2
0
def test_unsupervised_spatial_filter():
    """Test unsupervised spatial filter."""
    from sklearn.decomposition import PCA
    from sklearn.kernel_ridge import KernelRidge
    raw = io.read_raw_fif(raw_fname)
    events = read_events(event_name)
    picks = pick_types(raw.info, meg=True, stim=False, ecg=False,
                       eog=False, exclude='bads')
    picks = picks[1:13:3]
    epochs = Epochs(raw, events, event_id, tmin, tmax, picks=picks,
                    preload=True, baseline=None, verbose=False)

    # Test estimator
    assert_raises(ValueError, UnsupervisedSpatialFilter, KernelRidge(2))

    # Test fit
    X = epochs.get_data()
    n_components = 4
    usf = UnsupervisedSpatialFilter(PCA(n_components))
    usf.fit(X)
    usf1 = UnsupervisedSpatialFilter(PCA(n_components))

    # test transform
    assert_equal(usf.transform(X).ndim, 3)
    # test fit_transform
    assert_array_almost_equal(usf.transform(X), usf1.fit_transform(X))
    assert_equal(usf.transform(X).shape[1], n_components)
    assert_array_almost_equal(usf.inverse_transform(usf.transform(X)), X)

    # Test with average param
    usf = UnsupervisedSpatialFilter(PCA(4), average=True)
    usf.fit_transform(X)
    assert_raises(ValueError, UnsupervisedSpatialFilter, PCA(4), 2)
示例#3
0
def kernel_pca(num_components, epochs, kernel='linear', label=-1, plot=True):
    data = epochs.get_data()

    pca = UnsupervisedSpatialFilter(KernelPCA(num_components, kernel=kernel),
                                    average=False)
    print('fitting pca')
    pca_data = pca.fit_transform(data)
    print('fitting done')

    if label != -1:
        all_labels = epochs.events[:, 2]
        inds_to_keep = np.where(all_labels == label)
        pca_subdata = pca_data[inds_to_keep]
        pca_data = pca_subdata

    if plot:
        info = mne.create_info(pca_data.shape[1], epochs.info['sfreq'])

        ev = mne.EvokedArray(np.mean(pca_data, axis=0), info=info)
        if label != -1:
            ev.plot(show=False,
                    window_title="PCA",
                    time_unit='s',
                    titles="Kernel PCA for label {}".format(label))
        else:
            ev.plot(show=False, window_title="PCA", time_unit='s')
        plt.axvline(x=0.15, color='b', linestyle='--')
        plt.show()

    return pca_data
示例#4
0
def ApplyPCA(raw, n):
    SetPaths()
    dictionary = {"T2": 100}
    eves = mne.events_from_annotations(raw, dictionary)
    events = eves[0]
    events_ids = {"target/stimulus": 100}
    epochs = mne.Epochs(raw, events, event_id=events_ids, preload=True)
    fig = epochs.plot()
    fig.savefig(PLOT_PATH + '/' + 'raw_epochs.png')
    fig = epochs.plot_psd()
    fig.savefig(PLOT_PATH + '/' + 'epochs_psd.png')
    from mne.decoding import UnsupervisedSpatialFilter
    from sklearn.decomposition import PCA
    X = epochs.get_data()
    pca = UnsupervisedSpatialFilter(PCA(n), average=False)
    pca_data = pca.fit_transform(X)
    tmin, tmax = -0.1, 0.3
    ev = mne.EvokedArray(np.mean(pca_data, axis=0),
                         mne.create_info(n,
                                         epochs.info['sfreq'],
                                         ch_types='eeg'),
                         tmin=tmin)
    fig = ev.plot(show=False, window_title="PCA", time_unit='s')
    fig.savefig(PLOT_PATH + '/' + 'PCA_15_Channels.png')
    fig = ev.plot_image()
    fig.savefig(PLOT_PATH + '/' + 'EvokedData_As_Image.png')

    epoch_avg = np.mean(pca_data, axis=0)
    return pca_data, epoch_avg
示例#5
0
def kernel_pca_per_label(num_components, epochs, kernel='linear', plot=True):
    data = epochs.get_data()

    all_labels = epochs.events[:, 2]

    for label in range(8):
        label_inds = np.where(all_labels == label)
        data_per_label = data[label_inds]

        pca = UnsupervisedSpatialFilter(KernelPCA(num_components,
                                                  kernel=kernel),
                                        average=False)
        print('fitting pca for label {} and kernel {}'.format(label, kernel))
        pca_data = pca.fit_transform(data_per_label)
        print('fitting done')

        if label == 0:
            all_pca = pca_data
        else:
            all_pca = np.concatenate((all_pca, pca_data))

        if plot:
            info = mne.create_info(pca_data.shape[1], epochs.info['sfreq'])

            ev = mne.EvokedArray(np.mean(pca_data, axis=0), info=info)

            ev.plot(show=False,
                    window_title="PCA",
                    time_unit='s',
                    titles="Kernel PCA for label {} and kernel".format(
                        label, kernel))
            plt.axvline(x=0.15, color='b', linestyle='--')
            plt.show()

    return all_pca
示例#6
0
    def cvlr(C,
             n_features,
             pupil_diff_thresh=None,
             threshold=None,
             X_raw=X_raw,
             y_raw=y_raw):
        n_features = int(n_features)
        # X, y = exclude_eyes(X_raw, y_raw, threshold=threshold, pupil_diff_thresh=pupil_diff_thresh, timepoints=10)
        X, y = (X_raw, y_raw)
        X = X[:, 29:302, best_idx - 5:best_idx + 5]
        if X.shape[0] > 200:

            pca = UnsupervisedSpatialFilter(PCA(n_features), average=False)
            pca_data = pca.fit_transform(X)
            # X_raw = pca_data

            clf = make_pipeline(
                StandardScaler(),
                LogisticRegression(multi_class='multinomial',
                                   C=C,
                                   penalty='l2',
                                   solver='saga',
                                   tol=0.01))
            # clf = make_pipeline(StandardScaler(), LogisticRegression(multi_class='ovr', C=C, penalty='l2', tol=0.01))

            cv = KFold(3)  # CV
            shifts = np.arange(-4,
                               5)  # Additional timepoints to use as features
            # shifts = [0]
            accuracy = []

            for n, (train_index,
                    test_index) in enumerate(cv.split(pca_data[..., 0])):
                print("Fold {0} / 3".format(n + 1))

                # Add features + samples to X/y training data and test data
                X_train, y_train = add_features(pca_data[train_index, :, :],
                                                shifts, y[train_index])
                X_test, y_test = add_features(pca_data[test_index, :, :],
                                              shifts, y[test_index])

                # Add samples to training data
                # X_train, y_train = augment_samples(X_train, shifts, y_train)

                # Fit the classifier to training data and predict on held out data
                clf.fit(
                    X_train[..., 5], y_train
                )  # X represents timepoints 5 either side of the best index
                y_pred = clf.predict(X_test[..., 5])

                accuracy.append(recall_score(y_test, y_pred, average='macro'))

            acc = np.mean(accuracy)

        else:

            acc = 0

        return acc
示例#7
0
 def pca_filter(self, data, parameter_list):
     pca = UnsupervisedSpatialFilter(PCA(parameter_list[-1]), average=False)
     data = data[0:parameter_list[-1], :]
     print(data.shape)
     eeg_data = np.array([data])
     pca_data = pca.fit_transform(eeg_data)
     filter_data = pca_data[0]
     return filter_data
def applyPCA(components, examples, targets):
    tmin, tmax = -0.1, 0.3
    channel_names = np.loadtxt('./metadata/channel_names.csv', dtype=str)
    epochs_info = create_info(channel_names[0:components].tolist(),
                              240,
                              ch_types='eeg',
                              montage='biosemi64')
    pca = UnsupervisedSpatialFilter(PCA(components), average=False)
    pca_data = pca.fit_transform(examples)
    ev = mne.EvokedArray(np.mean(pca_data, axis=0), epochs_info, tmin=tmin)
    ev.plot(show=False, window_title="PCA", time_unit='s')
    plt.savefig('last_pca_plot.png', dpi=300)
    return examples, targets
示例#9
0
def PredApplyPCA(raw, n):
    dictionary = {"T2": 100}
    eves = mne.events_from_annotations(raw, dictionary)
    events = eves[0]
    events_ids = {"target/stimulus": 100}
    epochs = mne.Epochs(raw, events, event_id=events_ids, preload=True)
    from mne.decoding import UnsupervisedSpatialFilter
    from sklearn.decomposition import PCA
    X = epochs.get_data()
    pca = UnsupervisedSpatialFilter(PCA(n), average=False)
    pca_data = pca.fit_transform(X)
    epoch_avg = np.mean(pca_data, axis=0)
    return pca_data, epoch_avg
示例#10
0
def save_wavelet_complex(n_components):
    all_x_train_samples = []

    for sample in range(1, 22):
        print("sample {}".format(sample))
        epochs = get_epochs(sample, scale=False)
        freqs = np.logspace(*np.log10([2, 15]), num=15)
        n_cycles = freqs / 4.

        print("applying morlet wavelet")
        wavelet_output = tfr_array_morlet(epochs.get_data(),
                                          sfreq=epochs.info['sfreq'],
                                          freqs=freqs,
                                          n_cycles=n_cycles,
                                          output='complex')

        all_x_train_freqs = []

        for freq in range(wavelet_output.shape[2]):
            print("frequency: {}".format(freqs[freq]))

            wavelet_epochs = wavelet_output[:, :, freq, :]
            wavelet_epochs = np.append(wavelet_epochs.real,
                                       wavelet_epochs.imag,
                                       axis=1)

            wavelet_info = mne.create_info(ch_names=wavelet_epochs.shape[1],
                                           sfreq=epochs.info['sfreq'],
                                           ch_types='mag')
            wavelet_epochs = mne.EpochsArray(wavelet_epochs,
                                             info=wavelet_info,
                                             events=epochs.events)

            pca = UnsupervisedSpatialFilter(PCA(n_components=n_components),
                                            average=False)
            print('fitting pca')
            reduced = pca.fit_transform(wavelet_epochs.get_data())
            print('fitting done')

            x_train = reduced.transpose(0, 2, 1).reshape(-1, reduced.shape[1])
            all_x_train_freqs.append(x_train)

        all_x_train_samples.append(all_x_train_freqs)

    print('saving x_train for all samples')
    pickle.dump(
        all_x_train_samples,
        open(
            "DataTransformed/wavelet_complex/15hz/pca_{}/x_train_all_samples.pkl"
            .format(n_components), "wb"))
    print("x_train saved")
示例#11
0
def eeg_signals():
    #获取原始数据,根据采样率大小取出1s的数据
    eeg_data = board.get_current_board_data(sampling_rate)[0:9]
    # 带通滤波处理(0.5-50),中心频率25.25,带宽49.5
    eeg_channels = BoardShim.get_eeg_channels(0)
    for count, channel in enumerate(eeg_channels):
        eeg_data[channel] = eeg_data[channel] - np.average(eeg_data[channel])
        DataFilter.perform_bandpass(eeg_data[channel],
                                    BoardShim.get_sampling_rate(2), 25.25,
                                    49.5, 3, FilterTypes.BESSEL.value, 0)
    eeg_data = eeg_data[1:9]
    eeg_data = np.array([eeg_data])
    pca = UnsupervisedSpatialFilter(PCA(8), average=False)
    eeg_data = pca.fit_transform(eeg_data)
    eeg_data = eeg_data[0]
    return eeg_data
示例#12
0
def PCA_score(Beta, Labels, boxcar, hilb_type):

    labelsR = np.concatenate((Labels[0][0], Labels[0][1]))
    labelsL = np.concatenate((Labels[1][0], Labels[1][1]))

    def Boxcar(data, N):

        fdata = np.zeros((data.shape))
        for i in range(data.shape[0]):
            for q in range(data.shape[1]):
                for k in range(data.shape[2]):
                    if k < N:
                        fdata[i, q, k] = data[i, q, k]
                    else:
                        fdata[i, q, k] = np.sqrt(
                            np.mean(data[i, q, (k - (N - 1)):(k + 1)]**2))
#                      fdata[i,q,k] = (np.mean(data[i,q,(k-(N-1)):(k+1)]))

# depending on if you want to use RMS vs just mean,
#try out with both, see what works better for you

        return (fdata)

    from mne.decoding import UnsupervisedSpatialFilter
    from sklearn.decomposition import PCA
    #of note, here PCA also allows an unsupervised Spatial Filter
    pcaR = UnsupervisedSpatialFilter(PCA(3), average=False)

    if hilb_type == 'amp':

        pca_data_AEFL = pcaR.fit_transform(Beta[0][0][0])
        pca_data_WORD = pcaR.fit_transform(Beta[0][1][0])
        pca_L = np.concatenate((pca_data_AEFL, pca_data_WORD))
        pca_data_AEFR = pcaR.fit_transform(Beta[1][0][0])
        pca_data_WORD_R = pcaR.fit_transform(Beta[1][1][0])
        pca_RR = np.concatenate((pca_data_AEFR, pca_data_WORD_R))

    if hilb_type == 'phase':

        pca_data_AEFL = pcaR.fit_transform(Beta[0][0][1])
        pca_data_WORD = pcaR.fit_transform(Beta[0][1][1])
        pca_L = np.concatenate((pca_data_AEFL, pca_data_WORD))
        pca_data_AEFR = pcaR.fit_transform(Beta[1][0][1])
        pca_data_WORD_R = pcaR.fit_transform(Beta[1][1][1])
        pca_RR = np.concatenate((pca_data_AEFR, pca_data_WORD_R))

    labelsR = labelsR[0:len(pca_RR)]
    labelsL = labelsL[0:len(pca_L)]
    labels_data = labelsL, labelsR

    # Apply Boxcar Filter - based on boxcar length specific in upper level functions
    pca_RR = Boxcar(pca_RR, boxcar)
    pca_L = Boxcar(pca_L, boxcar)

    return (pca_L, pca_RR, labels_data)
示例#13
0
    def ica_filter(self, data, parameter_list):

        pca = UnsupervisedSpatialFilter(FastICA(parameter_list[-1], tol=1),
                                        average=False)
        data = data[0:parameter_list[-1], :]
        # print(data.shape)
        eeg_data = np.array([data])
        ica_data = pca.fit_transform(eeg_data)
        filter_data = ica_data[0]
        """
        ica = FastICA(n_components=parameter_list[-1], tol=0.1)
        # print(ica.n_iter_)
        data = data[0:parameter_list[-1], :].T
        filter_data = ica.fit_transform(data)
        print(ica.tol)
        print(ica.n_iter_)
        filter_data = filter_data.T
        """
        return filter_data
示例#14
0
def ica(num_components, epochs, plot=True):
    data = epochs.get_data()

    ica = UnsupervisedSpatialFilter(FastICA(n_components=num_components,
                                            max_iter=2000),
                                    average=False)
    print('fitting ica')
    ica_data = ica.fit_transform(data)
    print('fitting done')

    info = mne.create_info(ica_data.shape[1], epochs.info['sfreq'])

    if plot:
        ev = mne.EvokedArray(np.mean(ica_data, axis=0), info=info)
        ev.plot(show=False, window_title="ICA", time_unit='s', titles="ICA")
        plt.axvline(x=0.15, color='b', linestyle='--')
        plt.show()

    return ica_data
                    events,
                    event_id,
                    tmin,
                    tmax,
                    proj=False,
                    picks=picks,
                    baseline=None,
                    preload=True,
                    verbose=False)

X = epochs.get_data()

##############################################################################
# Transform data with PCA computed on the average ie evoked response
pca = UnsupervisedSpatialFilter(PCA(30), average=False)
pca_data = pca.fit_transform(X)
ev = mne.EvokedArray(np.mean(pca_data, axis=0),
                     mne.create_info(30, epochs.info['sfreq'], ch_types='eeg'),
                     tmin=tmin)
ev.plot(show=False, window_title="PCA")

##############################################################################
# Transform data with ICA computed on the raw epochs (no averaging)
ica = UnsupervisedSpatialFilter(FastICA(30), average=False)
ica_data = ica.fit_transform(X)
ev1 = mne.EvokedArray(np.mean(ica_data, axis=0),
                      mne.create_info(30, epochs.info['sfreq'],
                                      ch_types='eeg'),
                      tmin=tmin)
ev1.plot(show=False, window_title='ICA')
示例#16
0
                   weights='equal').plot_joint(**joint_kwargs)

##Apply fft
#fft_data = []
#for epochs_idx in range(len(epochs_data)):
#    fft_data.append(abs(fft2(epochs_data[epochs_idx]))/sum(epochs_data[epochs_idx]))
#
#fft_data = np.array(fft_data)

##Apply PCA to the epochs_data
#pca = UnsupervisedSpatialFilter(PCA(14), average=False)
#pca_data = pca.fit_transform(epochs_data)

#Apply ICA to the epochs_data
ica = UnsupervisedSpatialFilter(FastICA(len(picks)), average=False)
ica_data = ica.fit_transform(epochs_data)

##normalizing ICA data
#for epochs_idx in range(len(ica_data)):
#    for channels_idx in range(14):
#        ica_data[epochs_idx,channels_idx] /= ica_data[epochs_idx].sum()

ica_data_reshape = ica_data.reshape(
    (ica_data.shape[0], ica_data.shape[1] * ica_data.shape[2]))

#------------------------------------------------------------------------------

#Checking ICA through plot

method = 'fastica'
random_state = 42
示例#17
0
文件: Guia_2.py 项目: jegonza66/BCI
                       sfreq=sampling_freq,
                       ch_types=tipos[:],
                       montage='standard_1020')
channel_pos = []
for i in range(len(info['chs'])):
    channel_pos.append(info['chs'][i]['loc'][:2])

datos = data['Datos']
datos = np.swapaxes(datos, 0, 2)
datos_eeg = datos[:, :-3, :]
tiempo = [i / sampling_freq for i in range(len(datos[0][0]))]

#APLICAR PCA
sk_pca = PCA()
pca = UnsupervisedSpatialFilter(sk_pca, average=False)
data_pca = pca.fit_transform(datos_eeg)

#PLOT PRINCIPAL COMPONENTS
W = sk_pca.components_
M = np.linalg.inv(W)
M = M.transpose()

fig = plt.figure(figsize=(15, 25))
for i in range(len(M)):
    ax1 = fig.add_subplot(3, 9, (i + 1))
    ax1.set_title('PCA {}'.format(i))
    mne.viz.plot_topomap(M[i], np.array(channel_pos)[:-3], axes=ax1)
fig.tight_layout()
fig.suptitle('Principal components')

#PLOT RAW DATA AND PRINCIPAL COMPONENTS FOR 1 TRIAL EVERY CHANNEL
示例#18
0
    )[:, :, :]  # MEG signals: n_epochs, n_channels, n_times (exclude non MEG channels)
    y_raw = epochs_clean.events[:, 2]  # Get event types
    # y_raw = np.array([i for n, i in enumerate(y_raw) if n not in drop_idx])

    # select events and time period of interest
    event_selector = (y_raw < 23) | (y_raw == 99)
    X_raw = X_raw[event_selector, ...]
    y_raw = y_raw[event_selector]
    X_raw = X_raw[:, 29:302, :]

    # print("Number of unique events = {0}\n\nEvent types = {1}".format(len(np.unique(y_raw)),
    #                                                                   np.unique(y_raw))

    # Do PCA with 50 components
    pca = UnsupervisedSpatialFilter(PCA(50), average=False)
    pca_data = pca.fit_transform(X_raw)
    X_raw = pca_data

    # CLASSIFIER
    # Logistic regression with L2 penalty, multi-class classification performed as one-vs-rest
    # Data is transformed to have zero mean and unit variance before being passed to the classifier

    clf = make_pipeline(
        StandardScaler(),
        LogisticRegression(multi_class='multinomial',
                           C=0.1,
                           penalty='l2',
                           solver='saga',
                           tol=0.01))

    # Try classifying at all time points with 5 fold CV
raw.filter(1, 20, fir_design='firwin')
events = mne.read_events(event_fname)

picks = mne.pick_types(raw.info, meg=False, eeg=True, stim=False, eog=False,
                       exclude='bads')

epochs = mne.Epochs(raw, events, event_id, tmin, tmax, proj=False,
                    picks=picks, baseline=None, preload=True,
                    verbose=False)

X = epochs.get_data()

##############################################################################
# Transform data with PCA computed on the average ie evoked response
pca = UnsupervisedSpatialFilter(PCA(30), average=False)
pca_data = pca.fit_transform(X)
ev = mne.EvokedArray(np.mean(pca_data, axis=0),
                     mne.create_info(30, epochs.info['sfreq'],
                                     ch_types='eeg'), tmin=tmin)
ev.plot(show=False, window_title="PCA")

##############################################################################
# Transform data with ICA computed on the raw epochs (no averaging)
ica = UnsupervisedSpatialFilter(FastICA(30), average=False)
ica_data = ica.fit_transform(X)
ev1 = mne.EvokedArray(np.mean(ica_data, axis=0),
                      mne.create_info(30, epochs.info['sfreq'],
                                      ch_types='eeg'), tmin=tmin)
ev1.plot(show=False, window_title='ICA')

plt.show()
示例#20
0
                    events,
                    event_id,
                    tmin,
                    tmax,
                    proj=False,
                    picks=picks,
                    baseline=None,
                    preload=True,
                    verbose=False)

X = epochs.get_data()

##############################################################################
# Transform data with PCA computed on the average ie evoked response
pca = UnsupervisedSpatialFilter(PCA(30), average=False)
pca_data = pca.fit_transform(X)
ev = mne.EvokedArray(np.mean(pca_data, axis=0),
                     mne.create_info(30, epochs.info['sfreq'], ch_types='eeg'),
                     tmin=tmin)
ev.plot(show=False, window_title="PCA", time_unit='s')

##############################################################################
# Transform data with ICA computed on the raw epochs (no averaging)
ica = UnsupervisedSpatialFilter(FastICA(30), average=False)
ica_data = ica.fit_transform(X)  # (288, 30, 61)
ev1 = mne.EvokedArray(np.mean(ica_data, axis=0),
                      mne.create_info(30, epochs.info['sfreq'],
                                      ch_types='eeg'),
                      tmin=tmin)
ev1.plot(show=False, window_title='ICA', time_unit='s')