暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

脑机接口中的数据处理

黄尚民 2022-07-22
1700

内容摘要:脑机接口数据处理包括数据采集、放大、滤波、数学转化,其中数学转化是数据处理的核心。人工智能常用数据数学处理方法主要有主成分分析PCA,非负矩阵分解NMF和分布随机邻域嵌入t-SNE等降维方法。

关键词:脑机接口、数据处理、降维。


一、脑电信号的采集

脑电信号由神经元化学电位变化传导产生,神经元是脑电信号的基本单位,分离每个神经元的电位变化是脑电信号分析的最终目标。大脑由约860亿个神经元,相互关系更为复杂,神经元活动时表现出的电信号有三种形式,分别对应侵入式电极、半侵入式电极与非侵入式电极的接受情况。

(图片来源:https://zhuanlan.zhihu.com/p/28390875

1.侵入式:接收到局部场电位(LFP)。局部场电位由插入式金属电极采集,是位于同一区域的多个神经元动作电位合成的,参数为500μV0.1-7kHz。可视化的结果是高度同步的动作电位图像直接叠加。这样的电信号具有同步化高、电位变化明显、受环境影响小的特点,在电脑分析的时候降低了解码难度。但由于侵入电极植入对人体创伤较大,成本较高,不是未来脑机接口普及化的主要方式。

2.半侵入式:接收到皮层脑电(ECoG)。皮层脑电由电极阵列在大脑皮层,颅骨之下提取,参数为0.01-5mV<200Hz。可视化结果是较为无序的电位震动,是由于采集信号范围相对较大,神经元分布更广而关联性较弱,所以处理这类信号需要利用独立成分分析(ICA)分离不同神经元的电位信号。由于采集信号在颅骨之下,信号受环境影响也不大,手术创伤相对侵入式小一点,但依旧不能大范围推广。

3.非侵入式:接受到头皮脑电(EEG)。头皮脑电由体外电极在头皮上采集,参数为5-300μV<100Hz。可视化结果是无序的电位震动,相较于ECoG信号强度更弱。由于信号采集在体外,分析时除了分离信号源外,还要进行针对不同干扰类型的滤波处理,所以数据处理难度很大,但由于设备对人体没有创伤,是未来脑机接口普及化的重要方向。

采集到数据后,要根据数据特征的不同分出不同指令下的脑电状态。比如我们要区分人抬手与放手的脑电信号,以便操控机械臂,直观看数据,人很难分出不同的信号种类,甚至采集到高维信号,无法直接可视化。而通过主成分分析等特征提取、可视化手段,可以实现对数据的高效分类,从而搭建其脑电与动作指令之间的映射关系。

接下来主要对头皮脑电信号进行数据处理进行讨论。


二、脑电信号的放大、滤波

由于EEG极其微弱、受环境影响大,对其放大、滤波需要有“高增益、低噪声”的要求。高增益需要经EEG信号分2~3级逐级放大,低噪声要求针对脑电信号频率区域滤波。由于脑电频率处于约0.5~100Hz之间,其中包含50Hz的工频噪声,所以要对50Hz的工频干扰噪声专门滤除。


三、数据处理中使用的三个模型

1.主成分分析(PCA):

主成分分析(principal component analysisPCA)通过旋转数据,找到方差最大、关联最小的方向。这样做的目的是找到数据最大的“分歧点”,以便对数据进行分类。

(图片来源:《Python机器学习基础教程完整电子版》)

结合上图解释PCA原理:通过数学方面的分析,确定数据点方差最大、关联最小的方位(Component1),即“跨度”最长的方位。通过旋转,将数据点重新排布在平行于X轴的带状区域中,最终投影在X轴上,于是实现了数据从二维降为一维的特征提取过程。与之类似,通过同样的原理,可以将数据从n维降为k维(k<n)。具体数学实现要用到矩阵理论,下面展示我在专业课程作业中使用的PCA代码:

要求:“对于data4.npy中给定 10000 个一维且Shape(128)的向量,将它们聚类成N类”。


import os

import numpy as np

import matplotlib as mpl


import matplotlib.pyplot as plt


Data = np.load(os.path.join('data', 'data4.npy'))


data = np.zeros_like(Data)


mean = np.array([np.mean(Data[:,i]) for i in range(128)])

data = Data - mean


cov = np.cov(np.transpose(data))

Evalue, Evector = np.linalg.eig(cov)


newData = np.transpose(np.dot(Evector, np.transpose(data)))


Epairs = [(np.abs(Evalue[i]), Evector[:,i]) for i in range(len(Evalue))]

Epairs.sort(reverse=True)


key = np.zeros((2, 128))

key[0] = Epairs[0][1]

key[1] = Epairs[1][1]


chip = np.transpose(np.dot(key, np.transpose(data)))


plt.scatter(chip[..., 0], chip[..., 1])

plt.show()


(代码参考资料:https://www.jianshu.com/p/4528aaa6dc48


第一步:中心化。求各维平均数,减平均数,使各维数据中心在原点。

第二步:求特征值、特征向量。通过协方差得到。

第三步:找到表征方向。找到绝对值最大的特征值对应的特征向量,与原数据点乘,即得降维后的数据。


2.非负矩阵分解(NMF):

非负矩阵分解(non-negative matrix factorizationNMF)类似于PCA,用于数据降维,本质是线性变换,将数据表示成基的线性组合。与PCA使用正交基不同,NMF中的基与系数非负,这样可以避免正负抵消带来的特征减少的问题。

(图片来源:https://blog.csdn.net/jeffery0207/article/details/84348117

所谓非负矩阵分解,就是把原来的数据矩阵分解为两个非负矩阵的矩阵乘积。V[m, n] = W[m, k]*H[k, n]V为原数据矩阵,W为基矩阵,H为权值矩阵。用H代替V,则实现了降维。


3. 分布随机邻域嵌入(t-SNE):

分布随机领域嵌入(t-Distributed Stochastic Neighbor Embeddingt-SNE)是流形学习算法中的一种算法。所谓流形学习算法,即用低维坐标表示高维数据,可以想象成将空间中的点用空间曲面串联,最后铺展在二维平面上。

(图片来自:https://zhuanlan.zhihu.com/p/64664346

t-SNE的目标是按照原空间中数据点之间的距离,使较近的数据更加靠近,较远的数据更加远离,最后表示在二维平面上。数学手段是用条件概率表示欧式空间距离、梯度下降等。


除了以上三种数据处理方法外,还有诸如叠加平均、陷波器滤波、独立成分分析等方法。但这些方法距离精确到每个神经元的最终目标还有一定距离,由于这样的算力局限,意识分析还不是近期能实现的目标。


参考文献:

1.李丽明教授《2022  神经科学前沿问题 第二讲 BCI分类及系统构成》PPT

2.Python机器学习基础教程完整电子版》


3.【放大、滤波部分的文本内容】张学军、温炜《脑电信号调理电路设计》

4.【主成分分析部分的代码】JxKingPCA(主成分分析)python实现》

5.【非负矩阵分析】jeffery0207《【机器学习】NMF(非负矩阵分解)

6.【分布随机邻域嵌入】马上科普《t-SNE:最好的降维方法之一》


致谢:

感谢李丽明老师的深入讲解!

感谢王凯灵组长的框架与组织!

感谢四组组员的相互帮助!


文章转载自黄尚民,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论