一个python包,包含许多解码神经活动的方法。

Neural-Decoding的Python项目详细描述


神经解码:

一个python包,包含许多解码神经活动的方法

该软件包包含经典解码方法(维纳滤波、维纳级联、卡尔曼滤波、朴素贝叶斯、支持向量回归)和现代机器学习方法(xgboost、稠密神经网络、递归神经网络、gru、lstm)的混合体。

解码器目前设计用于预测连续值输出。今后,我们将对这些功能进行修改,以允许进行分类。

我们的手稿和数据集

此软件包附带了一份比较这些方法在多个数据集上性能的手稿。如果您使用我们的代码或数据进行研究,请引用该手稿,我们将不胜感激。

用于纸张的代码位于"纸张代码"文件夹中。下面将进一步介绍"请阅读我的资料"。

本文中使用的3个数据集(运动皮层、体感皮层和海马)都可以下载这里。它们有Matlab和Python两种格式,可以在下面描述的示例文件中使用。

安装

通过在命令行中键入pip可以安装此软件包

pip install Neural-Decoding

或手动通过

git clone https://github.com/KordingLab/Neural_Decoding.git
cd Neural_Decoding
python setup.py install

如果手动安装,则必须自己安装每个依赖项。我们设计的代码并不是所有的机器学习包 需要安装才能让其他人工作。

依赖关系

pip安装时,将自动安装所有软件包(因为requirements.txt文件)。

如果通过python setup.py install手动安装: 为了运行所有基于神经网络的解码器,您需要安装keras
为了运行xgboost解码器,您需要安装xgboost 要运行wiener过滤器、wiener级联或支持向量回归,您将需要scikit learn。< BR> 为了进行超参数优化,您需要安装bayesianoptimization

开始

我们提供了Jupyter笔记本,提供了如何使用解码器的详细示例。

  • 文件"examples-kf-u解码器"用于kalman滤波器解码器,"examples-all-u解码器"文件用于所有其他解码器。这些例子适用于体感和运动皮层数据集。
  • 海马体数据集中有一些细微的差异,因此我们包含了一个文件夹"examples_hamparima",其中包含类似的示例文件。这个文件夹还包括一个使用naive bayes解码器的示例文件(因为它在我们的海马体数据集上工作得更好)。
  • 我们还包括一个笔记本,"example_hyperparam_opt",演示如何对解码器进行超参数优化。

这里我们提供一个使用lstm解码器的基本示例。< BR> 对于本例,我们假设已经加载了矩阵:

  • "神经数据":大小为"总时隙数"x"神经元数"的矩阵,其中每个条目是给定时隙中给定神经元的放电率。
  • "y":您正在解码的输出变量(例如速度),是一个大小为"总时隙数"x"您正在解码的特征数"的矩阵。

我们提供了一个jupyter笔记本,"example_format_data"和一个如何将matlab数据转换成这种格式的例子。

首先,我们将导入必要的函数

fromNeural_Decoding.decodersimportLSTMDecoder#Import LSTM decoderfromNeural_Decoding.preprocessing_funcsimportget_spikes_with_history#Import function to get the covariate matrix that includes spike history from previous bins

接下来,我们将定义使用spi的时间段kes from(相对于我们正在解码的输出)

bins_before=13#How many bins of neural data prior to the output are used for decodingbins_current=1#Whether to use concurrent time bin of neural databins_after=0#How many bins of neural data after the output are used for decoding

下一步,我们将计算协变量矩阵,该矩阵包括来自前一个箱子的尖峰历史

# Function to get the covariate matrix that includes spike history from previous binsX=get_spikes_with_history(neural_data,bins_before,bins_after,bins_current)

在这个基本示例中,我们将忽略在示例笔记本中执行的一些额外预处理。假设我们现在已经将数据分为一个训练集(x~u train,y~u train)和一个测试集(x~u test,y~u test)。

我们现在将最终训练和测试解码器:

#Declare model and set parameters of the modelmodel_lstm=LSTMDecoder(units=400,num_epochs=5)#Fit modelmodel_lstm.fit(X_train,y_train)#Get predictionsy_test_predicted_lstm=model_lstm.predict(X_test)

包含的内容

有3个具有函数的文件。功能概述如下。有关详细信息,请参见文件中的注释。

解码器.py:

此文件提供所有解码器。每个解码器都是一个具有函数"fit"和"predict"的类。

首先,我们将描述解码器所需的数据格式

  • 对于所有解码器,您需要确定用于解码的峰值(相对于输出)的时间段。
  • 对于除kalman滤波器之外的所有解码器,您可以设置"bins_before"(输出前的峰值数)、"bins_current"(是否使用与输出同时的峰值数)和"bins_after"(输出后的峰值数)。设"周围垃圾箱"=前垃圾箱+当前垃圾箱+后垃圾箱。这使得我们可以得到一个三维协变量矩阵"x",其大小为"总时隙数"x"周围的时隙数"x"神经元数"。我们将此输入格式用于递归神经网络(simplenn、gru、lstm)。我们还可以将矩阵展平,这样每个时间点都有一个特征向量,得到"x_flat",它是一个二维矩阵,大小为"时间点总数"x"周围的戋bins x神经元数",这种输入格式用于维纳滤波器、维纳级联、支持向量回归,xgboost和密集的神经网络。
  • 对于kalman滤波器,您可以设置"滞后"——使用神经数据(相对于输出)的哪个时间点来预测输出。kalman滤波器的输入格式只是二维矩阵,大小为"总时隙数"x"神经元数",其中每个条目是给定时隙中给定神经元的触发率。
  • 输出"y"是一个二维矩阵,其大小为"总时隙数"x"输出特性数"。


"decoders.py"中的所有解码器如下:

  1. wienerfilterdecoder
  2. < > >
    • 维纳滤波器是简单的多元线性回归,使用x_平面作为输入。
    • 它没有输入参数
    1. 维纳级联解码器
    2. < > >
      • 维纳级联(也称为线性非线性模型)拟合线性回归(维纳滤波器),然后拟合静态非清晰性。
      • 它具有参数次数(用于非线性的多项式次数)
      1. KalmanFilterDecoder
      2. < > >
        • 我们使用的卡尔曼滤波器类似于在wu等人中实现的卡尔曼滤波器2003 在卡尔曼滤波器中,测量值是神经尖峰序列,隐藏状态是运动学。
        • 我们有一个参数c(它不在前面的实现中)。此参数缩放与运动状态转换相关联的噪声矩阵。它有效地允许在当前更新中更改新神经证据的权重。
        1. 朴素贝叶斯解码器
        2. < > >
          • 我们使用了一个朴素的bayes解码器,类似于zhang等人在中实现的解码器。1998年(详见手稿)。
          • 它有参数编码模型(对于线性或二次编码模型)和res(用于设置预测值的分辨率)
            strong>svrdecoder< > >
            • 此解码器使用支持向量回归,使用x_flat作为输入。
            • 它有参数c(错误项的惩罚)和max-iter(最大迭代次数)。
            • 当输出("y")已标准化时,它最有效
            1. XGBoostDecoder
            2. < > >
              • 我们使用了极端的梯度提升算法xgboostxgboost将xu平面与输出关联起来。xgboost基于增强树的思想。
              • 它有参数max_depth(树的最大深度)、num_round(适合的树的数量)、eta(学习速率)。以及gpu(如果您安装了xgboost的gpu版本,则可以选择要使用的gpu)
              1. 登森编码器
              2. < > >
                • 利用keras库,我们建立了一个密集的前向神经网络,使用x_平面来预测输出。它可以有任意数量的隐藏层。
                • 它有参数units(每层中的单元数)、dropout(被退出的单元的比例)、num epochs(用于训练的epochs的数量)和verbose(是否显示每个epoch之后的拟合进度)
                1. 简单编码器
                2. < > >
                  • 使用keras库,我们创建了一个神经网络结构,其中峰值输入(来自矩阵x)被输入到一个标准的递归神经网络(rnn)中,并激活relu。来自这个循环层的单元完全连接到输出层。
                  • 它有参数unitsdropoutnum-epochsverbose
                  1. grudecoder
                  2. < > >
                    • 使用keras库,我们创建了一个神经网络结构,其中峰值输入(来自矩阵x)被输入到一个门控递归单元(grus;一个更复杂的rnn)网络中。来自这个循环层的单元完全连接到输出层。
                    • 它有参数unitsdropoutnum-epochsverbose
                    1. lstmdecoder
                    2. < > >
                      • 所有的方法都与GRU解码器相同,只是使用了长-短期内存网络(LSTM;另一个更复杂的RNN)而不是GRU。
                      • 它有参数unitsdropoutnum-epochsverbose

                      在设计xgboost和神经网络译码器时,还可以使用许多附加参数(如正则化)。为了简化易用性,我们只包括足以产生良好配合的参数。

                      metrics.py:

                      该文件具有评估模型拟合度的度量函数。它当前有计算功能:

                      • 方程式
                      • equation

                      预处理函数py

                      该文件包含用于预处理数据的函数,这些函数可能有助于将神经AC解码功能的正确格式的活动性和输出

                      • 二进制峰值:将峰值时间转换为时间段内的峰值数
                      • 二进制输出:将连续输出流转换为时间二进制内的平均输出
                      • 使用"历史记录"获取"尖峰":使用二进制尖峰作为输入,此函数创建包含尖峰历史的神经数据的协变量矩阵

                      纸张代码

                      在"Paper_code"文件夹中,我们包括用于手稿的代码。

                      • 以"manydecoders"开头的文件使用除kalman滤波器和naive bayes之外的所有解码器
                      • 以"kf"开头的文件使用卡尔曼滤波器
                      • 以"bayes decoder"开头的文件使用朴素的bayes解码器
                      • 以"plot"开头的文件在纸上创建图形
                      • 以"fulldata"结尾的文件用于图3/4
                      • 以"dataamt"结尾的文件用于图5/6
                      • 以"fewneurons"结尾的文件用于图7
                      • 以"binSize"结尾的文件用于图8
                      • 提到"hyperparams"的文件用于图9

                      欢迎加入QQ群-->: 979659372 Python中文网_新手群

                      推荐PyPI第三方库


热门话题
java限制C++代码访问JNI中的某些类   Android上的java DateFormat:不可解析的日期   通过json进行java迭代,并为其他请求调用多个API   Netbeans中的java JavaFX项目引发异常“输入流不能为null”   多线程Java newFixedThreadPool解释   |在java字符串中无法识别。split()方法   Java中的原始包装器类是否被视为引用类型?   Java swing。如何在intellij idea GUI设计工具中重写组件方法   数组乘矩阵   java将30GB的XML文件分割成小块XML   java通过一棵树递归找到一个节点,并返回指向该节点的路径   java如何将可观察的<Observable<List<T>>转换为可观察的<List<T>>   使用java在web服务器上更改php文件中的字符串?   java希望开发像tomcat这样的servlet容器   java希望提高编程的数学技能