Python SKLearn具有信号功能

时间:2017-11-20 14:34:21

标签: python machine-learning scikit-learn svm feature-extraction

问题陈述

我有一个大小(19,1000,100)的数据集,其中包含:

- 100 SAMPLES
- 19 channels / samples of length 1000 (2 s at 500 Hz)

数据集是label,矢量长度为100。

我想使用学习算法,当然,为了获得最佳拟合。为此,我将数据集拆分为训练集和测试集。目前的代码:

# -*- coding: utf-8 -*-

# Library importation
import os
import numpy as np
from scipy import io as sio
from scipy import signal
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from matplotlib import pyplot as plt

#------------------------------------------------------------------------------
# Functions

def filter(x, n, fs, fc1, fc2):
    b, a = signal.butter(n, [fc1/(fs/2), fc2/(fs/2)], 'bandpass')
    y = signal.filtfilt(b, a, x)
    return y

def haming(x, L):
    # Symetric L-points hamming window
    window = signal.hamming(L)
    y = x * window.T                            # Element wise multiplication
    return y

#------------------------------------------------------------------------------
# Script

s_EEG = "{}/{}".format(EEG_path, EEG[4])
data = sio.loadmat(s_EEG)['s_EEG']['data'][0][0].astype(float)     # data[i, j ,k]
labels = sio.loadmat(s_EEG)['s_EEG']['labels'][0][0][0]            # labels[k]
fs = sio.loadmat(s_EEG)['s_EEG']['sampling_rate'][0][0][0][0]      # 500 Hz
size = data.shape                                                  # (i,j,k)

for i in range(size[0]):
    for k in range(size[2]):
        data[i,:,k] = haming(filter(data[i,:,k], 10, fs, 1, 45), size[1])

data = data.reshape(size[0] * size[1], size[2]).T

# X signal / Y label
X_train, X_test, Y_train, Y_test = train_test_split(data, list(labels), test_size=0.33, random_state=42)

clf = SVC()
clf.fit(X_train, Y_train)
print (clf.score(X_test, Y_test))

过滤每个样品(1 Hz和45 Hz之间的带通)。 每个样品都应用汉明窗。

然后通过一个接一个地放置样本,以100 * 19 000的形式重新整形数据。

问题

  1. 方法是否正确?
  2. 通过一个接一个地放置样品,是不是会产生问题?
  3. 我如何使用大量功能进行分类? 例如,频谱分析,频道之间的同步方法,均值,方差......是否可以为每个样本提取“特征信号”,然后将它们一个接一个地放置,即,svc的输入将是一个100 * A LOT的矩阵?有没有办法保持信号的形式:
  4.   

    (样本*(通道1,通道2,...通道19,功能1,功能   2,......))

    甚至更好:

      

    (样本*((通道1,通道2,...通道19),(功能1为   通道1,通道2的特征1,......),(通道1的功能2,   chan 2的特征2,...)))

    由于我不知道哪个特征可能会出现在我的信号中(EEG数据......),我需要测试很多不同的功能并保持最佳功能。

    感谢您的帮助!

    P.S:代码的任何优化,就速度,内存,简单而言都很棒:)

0 个答案:

没有答案