CSP(共空间模式)的python实现

数据来源(bbci竞赛数据graz两分类)

链接:https://pan.baidu.com/s/1GVPp2UBDiIUng6PlVU23uw
提取码:7jal

代码

def csp_yx(EEGSignals_x_train,EEGSignals_y_train):
    
    EEG_Channels = 3
    EEG_Trials = 280
    EEG_Classes = 2
    class_labels = [1, 2]
    
    
    
    # 计算协方差矩阵 cov1 cov2
    trialCov = np.zeros((EEG_Channels,EEG_Channels,EEG_Trials))
    for i in range(280):
        E = EEGSignals_x_train[:,:,i].T
    #     print(E.shape)
        EE = np.dot(E,E.T)
        trialCov[:,:,i] = EE/np.trace(EE);    

    
    
    cov1 = np.zeros((EEG_Channels,EEG_Channels,140))
    cov2 = np.zeros((EEG_Channels,EEG_Channels,140))
    
    MatrixCov = np.zeros((3,3,2))
    k=0
    s=0
    for i in range(EEG_Channels):
        if EEGSignals_y_train[i] == 1:
            cov1[:,:,k] = trialCov[:,:,i]
            k=k+1
        if EEGSignals_y_train[i] == 2:
            cov2[:,:,s] = trialCov[:,:,i]
            s=s+1
            
    np.set_printoptions(precision=4)
    
    # 计算平均协方差矩阵之和 covTotal
    cov1 = np.mean(cov1,2)
    cov2 = np.mean(cov2,2)
    covTotal = cov1 + cov2
    print(covTotal)
    
    # 计算公共特征向量矩阵和特征值
    [Dt,Uc] = np.linalg.eigh(covTotal)
    # 降序排序
    Uc = Uc[:,Dt.argsort()[::-1]]
    Dt = sorted(Dt,reverse=True)
    
    # 矩阵白化
    Dt = np.diag(Dt)
    Dt = np.sqrt(1./Dt)
  
    # 去 inf值
    c = np.isinf(Dt)
    Dt[c] = 0
    print(Dt)
    P = np.dot(Dt,Uc.T)
    
#     print(P)
   
    # 将P作用于 cov1 cov2
    transformedCov1 = np.dot(np.dot(P,cov1),P.T)
    transformedCov2 = np.dot(np.dot(P,cov2),P.T)  # S1 = P*R1*P.T
   

    # 将 transformedCov1 按主分量分解得到公共特征向量矩阵 B
    
    [D1,U1] = np.linalg.eig(transformedCov1)
    # 降序
    U1 = U1[:,D1.argsort()]
    D1 = sorted(D1,reverse=True)

#     print(U1)
    
    [D2,U2] = np.linalg.eig(transformedCov2)
    # 升序
    U2 = U2[:,D2.argsort()]
    D2 = np.sort(D2)
#     print(U2)

    
    # 计算投影矩阵
    CSPMatrix = np.dot(U1.T,P)
    
    return CSPMatrix
import scipy.io as sio
import numpy as np
dataSetfile = "../L-R hand/dataset_BCIcomp1.mat"
testLabelfile = "../test/labels_data_set_iii.mat"
EEGSignals = sio.loadmat(dataSetfile)
LabelSet = sio.loadmat(testLabelfile)
EEGSignals_x_train = np.concatenate([EEGSignals['x_train'],EEGSignals['x_test']], axis=2)
EEGSignals_y_train = np.concatenate([EEGSignals['y_train'],LabelSet['y_test']])
W = csp_yx.csp_yx(EEGSignals_x_train,EEGSignals_y_train)
FilterPairs = 1       # CSP特征选择参数m
features_train = np.zeros((280, 2*FilterPairs))
# features_test = np.zeros((80, 2*FilterPairs))

m1 = W[0:FilterPairs]
m2 = W[3-FilterPairs:3]

Filter = np.concatenate([m1,m2])
Filter
data = np.concatenate([EEGSignals['x_train'],EEGSignals['x_test']],axis=2)

projectedTrial = np.zeros((2*FilterPairs,1152))
EEG_Trials = 280
for i in range(EEG_Trials):
    # 将源信号投影到 CSP空间上
    projectedTrial = np.dot(Filter,data[:,:,i].T)
        
    # 将投影信号的方差得对数作为特征
    variances_train = np.var(projectedTrial,1)
    for f in range(len(variances_train)):
        features_train[i,f] = np.log(variances_train[f])


CSP = features_train[0,:2]
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值