1. 程式人生 > >利用LSTM對腦電波訊號進行分類

利用LSTM對腦電波訊號進行分類

          最近我們在做利用LSTM網路對腦電波訊號(紡錘體)進行分類的相關工作。我們的資料集是來自於美國開源的睡眠資料集(national sleep research resource)https://sleepdata.org 

          我們獲得資料包含 紡錘波的持續時間,振幅,時間,等幾個特徵。我們採集的樣本主要來自於正常人和病人。我們初步的思想是將紡錘波視為一個事件,生成一個序列。出現紡錘波訊號的為1,反之為0.然後利用神經網路,來學習這個序列的內部特徵,通過序列來判斷病人有沒有患病。

眾所周知LSTM神經網路在處理時序資訊時有一個很好的效果,特別是幾年來nlp的飛速發展。

我們首先需要的是對序列進行二進位制編碼

def bit_coding(data, step): #對一個數據進行編碼
    code = []
    pre_data = 0
    count = 0
    length = len(data)
    while count < length:
        n = (data[count]-pre_data) / step
        if n > 0:
            if n % 1 > 0:
                n = int(n)
                code += [0] * n + [1]
            else:
                n = int(n)
                code += [0] * (n - 1) + [1]
        pre_data = data[count]
        count += 1
    return code

其中的step就是設定的精度,多少步長進行統計,這個值就取決於你獲得一個腦電波的序列的維度大小。

我們再生成一個腦電波的類的相關資訊

class SpindleData:
    path = ""
    paths = []
    labels = []
    data = []
    step = 0.0001
    max_length = 0#設定預設的編碼間隔
    coding_q = []

    def __init__(self, path="datasets", step=0.0001 ):
        self.path = path
        self.step =step
        self.paths, self.labels = self.get_data_labels()   #獲得路徑以及標籤
        self.coding()

    def get_data_labels(self):  # 返回獲取的資料以及標籤[0,1,0,1,...]  "./datasets/"
        path = self.path
        cate = [(os.path.join(path, x)) for x in os.listdir(path)]
        paths = []
        labels = []
        for i, p in enumerate(cate):
            path_tmps = glob.glob(os.path.join(p, "*.csv"))
            for p in path_tmps:
                paths.append(p)
                labels.append(i)
        np.asarray(labels)                  #將標籤轉化為np的格式
        return paths, labels

    def coding(self):#所有的資料讀取以及儲存(這裡儲存了資料的原始資料佔用記憶體可能比較大)
        codeing_q = []
        for p in self.paths:
            data = pd.read_csv(p, skiprows=(0, 1), sep=",")
            print("正在讀取第%d個csv檔案..." % (self.paths.index(p)+1))
            data =data['Time_of_night']
            self.data.append(data)
        for i, d in enumerate(self.data):
            code = bit_coding(d, step=self.step)
            print("正在對第%d個序列進行編碼..."%(i+1))
            codeing_q.append(code)#將二位的編碼加入到序列中
        self.max_length = max([len(x) for x in codeing_q])
        codeing_q = preprocessing.sequence.pad_sequences(codeing_q, maxlen=self.max_length)   #將所有的串都弄成相同的維度
        self.coding_q = np.asarray(codeing_q)

這個類主要包含編碼後的0/1序列,1序列表示的是紡錘波出現,0表示的是紡錘波沒有出現。同時我們再生成一個labels陣列,這個對應的是病人時候患病。其實就是一個二分類問題。

我們再來搭建一個LSTM神經網路

def learning_lstm():                   #lstm暫時還是比較適合於文字中,對於有序序暫不合適
    x_train, y_labels, length = data_test()
    x_train = np.expand_dims(x_train, axis=2)

    model = Sequential()
    # model.add(Embedding(max_feature, 32))
    model.add(LSTM(32, input_shape=(length, 1)))

    model.add(Dense(1, activation='sigmoid'))

    model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
    model.summary()

    history = model.fit(x_train, y_labels, epochs=10, batch_size=16, validation_split=0.2)
    draw(history)


def data_test():
    length = 0   #每一個系列的長度
    spindle = SpindleData()
    x_train = spindle.coding_q
    y_train = spindle.labels
    length = spindle.max_length
    return x_train, y_train, length

我實驗中的step設定的最小間距0.0001,因此每個序列都有120,000維.暫時實驗的效果不是很明顯。我先把github原始碼發上來

相關推薦

利用LSTM腦電波訊號進行分類

          最近我們在做利用LSTM網路對腦電波訊號(紡錘體)進行分類的相關工作。我們的資料集是來自於美國開源的睡眠資料集(national sleep research resource)https://sleepdata.org            我們獲得資

Tensorflow學習教程------利用卷積神經網路mnist資料集進行分類_利用訓練好的模型進行分類

#coding:utf-8 import tensorflow as tf from PIL import Image,ImageFilter from tensorflow.examples.tutorials.mnist import input_data def imageprepare(ar

利用opencv呼叫tensorflow的pb模型jpg圖片進行分類

利用的是opencv中的dnn模組進行呼叫的,之所以標題是對jpg的圖片進行分類,主要的原因是我對bmp格式的圖片分類還沒有成功,成功之後再更新, 使用比較常用的花卉分類圖片進行分類,因為只是為了實驗,並沒有對圖片分類精度進行追求,程式碼中有許多問題,比如有很多沒用的,也沒有刪掉,也只是對花進行

利用CNN股票“圖片”進行漲跌分類——一次嘗試【附原始碼】

首先解釋一下標題: CNN:卷積神經網路(Convolutional Neural Network), 在影象處理方面有出色表現,不是被川普怒懟的那個新聞網站; 股票漲跌:大家都懂的,呵呵; 股票圖片:既然使用CNN,那麼如果輸入資料是股票某個週期的K線圖片就太

利用隨機森林和梯度替身決策樹titanic資料進行分類,並結果進行分析

import pandas as pd from sklearn.cross_validation import train_test_split from sklearn.feature_extraction import DictVectorizer from skle

django 利用ORM單表進行增刪改查

man api light 賦值 連接 取出 簡單 extern follow 牛小妹上周末,一直在嘗試如何把數據庫的數據弄到界面上。畢竟是新手,搞不出來,文檔也看不懂。不過沒關系,才剛上大學。今晚我們就來解釋下,要把數據搞到界面的第一步。先把數據放到庫裏,然後再把數據從庫

利用logrotateTomcat日誌進行切分

最近在做伺服器資源釋放的時候發現有一臺伺服器的find命令無法使用(原因不詳),所以之前利用cronolog對Tomcat日誌進行切分之後。是基於包含find命令的shell指令碼做的自動清理。這時就想到了用logrotate對Tomcat日誌進行切分。 1、指令碼如下: /usr/lo

利用logrotatenginx日誌進行切分

1、指令碼如下: /gdsfapps/flgw/logs/nginx/*.log{ missingok dateext notifempty daily rotate 7 sharedscripts postrotate if [ -f /usr/local/nginx/logs/nginx

利用opencv圖片大小進行修改

執行環境:ubuntu16.04 + opencv 2.4.13 + c++ (系統g++版本5.4.0) #include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #inc

TensorFlow-cifar訓練與測試(可自己資料進行分類和測試)

第一部分:測試軟硬體 硬體:NVIDIA-GTX1080 軟體:Windows7、python3.6.5、tensorflow-gpu-1.4.0 第二部分:資料下載 資料集下載連結 第三部分:程式碼分步展示 第一步:匯入tensorflow import os fr

利用Comparator列舉型別進行排序的實現(ComparatorChain、BeanComparator、FixedOrderComparator)

背景:         工作中遇到按照類的某個屬性排列,這個屬性是個列舉型別(完全是自定義的,沒有明顯的比較標誌),現要按照要求的優先順序排列。        如一個蘋果類有大小和甜度屬性,大小有“特大”,“大”,“中”,“小”,“很小”的等級,甜度有“很甜”,“甜”

資料處理-------利用jieba資料集進行分詞和統計頻數

一,對txt檔案中出現的詞語的頻數統計再找出出現頻率多的 二,程式碼: import re from collections import Counter import jieba def cut_word(datapath): with open(

使用LogisticRegression和SGDClassifier良/惡性腫瘤進行分類,並計算出準確率召回率和F1的值

# -*- coding: utf-8 -*- """ Created on Tue Oct 24 10:08:40 2017 @author: liuyajun """ import pandas as pd import numpy as np from sklearn

圖解利用JiraScrum專案進行跟蹤管理(一)

1.建立Scrum專案 會在面板中生成對應的看板 2.編輯專案 編輯專案資訊 設定專案版本 新增功能模組 關聯工作流 可以對不同型別的問題關聯自定義

利用lucene檔案內容進行關鍵字檢索

一、概述           關於lucene的具體介紹,請自行百度。 二、例項講解 在具體實現之前,請根據自己的要求,建立對應的路徑及檔案。       例如,我這邊建立的路徑及檔案是:       D:/tools/LearningByMyself/lucene/sou

Spark 中文文件分類(一) IKAnalyzer文件進行分類

原網址:http://lxw1234.com/archives/2015/07/422.htm 程式語言 1年前 (2015-07-22) 5885℃ 0評論 關鍵字:中文分詞、IKAnalyzer 最近有個需求,需要對爬到的網頁內容進行分詞,以前沒做過這個,隨便找了

計算機視覺(四):使用K-NN分類CIFAR-10進行分類

1 - 引言 之前我們學習了KNN分類器的原理,現在讓我們將KNN分類器應用在計算機視覺中,學習如何使用這個演算法來進行圖片分類。 2 - 準備工作 建立專案結構如圖所示 在datasets檔案中下載資料集Cifar-10 k_nearest_neighbo

Flume原始碼分析—利用EclipseFlume原始碼進行遠端除錯分析環境搭建(一)

一、引言 最近在學習瞭解大資料分析相關的工作,對於其中用到的收集部分用到了flume,特意花了點時間瞭解了一下flume的工作原理及工作機制。個人瞭解一個新的系統首先從概略上了解一下其基本原理後,接著從原始碼入手瞭解其部分關鍵實現部分,最後會嘗試去修改部分內容

【自然語言處理入門】01:利用jieba資料集進行分詞,並統計詞頻

一、基本要求 使用jieba對垃圾簡訊資料集進行分詞,然後統計其中的單詞出現的個數,找到出現頻次最高的top100個詞。 二、完整程式碼 # -*- coding: UTF-8 -*- fr

利用pandas初創公司進行資料分析

資料來源 Kesci的CrunchBase 初創公司資料集 資料集內容 acquisitions.csv: 初創公司被收購的記錄 acquisitions 初創公司被收購的記錄 company_permalink company_name