一个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"中的所有解码器如下:
- wienerfilterdecoder < > >
- 维纳滤波器是简单的多元线性回归,使用x_平面作为输入。
- 它没有输入参数
- 维纳级联解码器 < > >
- 维纳级联(也称为线性非线性模型)拟合线性回归(维纳滤波器),然后拟合静态非清晰性。
- 它具有参数次数(用于非线性的多项式次数)
- KalmanFilterDecoder < > >
- 我们使用的卡尔曼滤波器类似于在wu等人中实现的卡尔曼滤波器2003 在卡尔曼滤波器中,测量值是神经尖峰序列,隐藏状态是运动学。
- 我们有一个参数c(它不在前面的实现中)。此参数缩放与运动状态转换相关联的噪声矩阵。它有效地允许在当前更新中更改新神经证据的权重。
- 朴素贝叶斯解码器 < > >
- 我们使用了一个朴素的bayes解码器,类似于zhang等人在中实现的解码器。1998年(详见手稿)。
- 它有参数编码模型(对于线性或二次编码模型)和res(用于设置预测值的分辨率)
- 此解码器使用支持向量回归,使用x_flat作为输入。
- 它有参数c(错误项的惩罚)和max-iter(最大迭代次数)。
- 当输出("y")已标准化时,它最有效
- XGBoostDecoder < > >
- 我们使用了极端的梯度提升算法xgboostxgboost将xu平面与输出关联起来。xgboost基于增强树的思想。
- 它有参数max_depth(树的最大深度)、num_round(适合的树的数量)、eta(学习速率)。以及gpu(如果您安装了xgboost的gpu版本,则可以选择要使用的gpu)
- 登森编码器 < > >
- 利用keras库,我们建立了一个密集的前向神经网络,使用x_平面来预测输出。它可以有任意数量的隐藏层。
- 它有参数units(每层中的单元数)、dropout(被退出的单元的比例)、num epochs(用于训练的epochs的数量)和verbose(是否显示每个epoch之后的拟合进度)
- 简单编码器 < > >
- 使用keras库,我们创建了一个神经网络结构,其中峰值输入(来自矩阵x)被输入到一个标准的递归神经网络(rnn)中,并激活relu。来自这个循环层的单元完全连接到输出层。
- 它有参数units,dropout,num-epochs和verbose
- grudecoder < > >
- 使用keras库,我们创建了一个神经网络结构,其中峰值输入(来自矩阵x)被输入到一个门控递归单元(grus;一个更复杂的rnn)网络中。来自这个循环层的单元完全连接到输出层。
- 它有参数units,dropout,num-epochs和verbose
- lstmdecoder < > >
- 所有的方法都与GRU解码器相同,只是使用了长-短期内存网络(LSTM;另一个更复杂的RNN)而不是GRU。
- 它有参数units,dropout,num-epochs和verbose
- 二进制峰值:将峰值时间转换为时间段内的峰值数
- 二进制输出:将连续输出流转换为时间二进制内的平均输出
- 使用"历史记录"获取"尖峰":使用二进制尖峰作为输入,此函数创建包含尖峰历史的神经数据的协变量矩阵
- 以"manydecoders"开头的文件使用除kalman滤波器和naive bayes之外的所有解码器
- 以"kf"开头的文件使用卡尔曼滤波器
- 以"bayes decoder"开头的文件使用朴素的bayes解码器
- 以"plot"开头的文件在纸上创建图形
- 以"fulldata"结尾的文件用于图3/4
- 以"dataamt"结尾的文件用于图5/6
- 以"fewneurons"结尾的文件用于图7
- 以"binSize"结尾的文件用于图8
- 提到"hyperparams"的文件用于图9
在设计xgboost和神经网络译码器时,还可以使用许多附加参数(如正则化)。为了简化易用性,我们只包括足以产生良好配合的参数。
metrics.py:
该文件具有评估模型拟合度的度量函数。它当前有计算功能:
预处理函数py
该文件包含用于预处理数据的函数,这些函数可能有助于将神经AC解码功能的正确格式的活动性和输出
纸张代码
在"Paper_code"文件夹中,我们包括用于手稿的代码。