眼动和脑波相关性分析和回归分析

import numpy as np
import pandas as pd
from sklearn.linear_model import BayesianRidge, LinearRegression, ElasticNet
from sklearn.svm import SVR
from sklearn.ensemble.gradient_boosting import GradientBoostingRegressor   # 集成算法
from sklearn.model_selection import cross_val_score    # 交叉验证
from sklearn.metrics import explained_variance_score, mean_absolute_error, mean_squared_error, r2_score
import matplotlib.pyplot as plt
import seaborn as sns
import os

def mkdir(path_3):
    folder = os.path.exists(path_3)
    if not folder:  # 判断是否存在文件夹如果不存在则创建为文件夹
        os.makedirs(path_3)  # makedirs 创建文件时如果路径不存在会创建这个路径
        print("---  new folder...  ---")
        print("---  OK  ---")
    else:
        print("---  There is this folder!  ---")

def read_csv(gaze_path, gaze_csv, eeg_path, eeg_csv):
    # 数据导入
    gaze_data = pd.DataFrame(pd.read_csv(gaze_path + gaze_csv, encoding="utf-8", engine='python'))
    Clpd = np.array(gaze_data['clpd'])
    brain_data = pd.DataFrame(pd.read_csv(eeg_path + eeg_csv, encoding="utf-8", engine='python'))
    Delta = np.array(brain_data['Delta'])
    Theta = np.array(brain_data['Theta'])
    Alpha = np.array(brain_data['Alpha'])
    Beta = np.array(brain_data['Beta'])
    print(gaze_csv,eeg_csv)
    print(len(gaze_data))
    print(len(brain_data))
    Corr_data = []
    if int(len(Clpd)) >= int(len(Delta)):
        print('brain')

        for i in range(len(Delta)):
            delta = Delta[i];theta = Theta[i];alpha = Alpha[i];beta = Beta[i];clpd = Clpd[i]
            corr_data = [delta,theta,alpha,beta,clpd]
            Corr_data.append(corr_data)


    else:

        for i in range(len(Clpd)):
            delta = Delta[i];theta = Theta[i];alpha = Alpha[i];beta = Beta[i];clpd = Clpd[i]
            corr_data = [delta, theta, alpha, beta, clpd]
            Corr_data.append(corr_data)


    Corr_data = pd.DataFrame(Corr_data,columns=['Delta','Theta','Alpha','Beta','Clpd'])

    # 可视化数据关系
    sns.set(style='whitegrid', context='notebook')   #style控制默认样式,context控制着默认的画幅大小
    sns.pairplot(Corr_data, size=2)

    return Corr_data
def corr():
    # 相关度
    corr = Corr_data.corr()
    # 相关度热力图
    sns.heatmap(corr, cmap='GnBu_r', square=True, annot=True)
    Correlation_coefficient = corr['Clpd']

    # plt.show()
    return Correlation_coefficient
def regr():
    # 自变量
    X = Corr_data[['Delta','Theta','Alpha','Beta']].values
    # 因变量
    y = Corr_data[['Clpd']].values

    # 设置交叉验证次数
    n_folds = 5

    # 建立贝叶斯岭回归模型
    br_model = BayesianRidge()

    # 普通线性回归
    lr_model = LinearRegression()

    # 弹性网络回归模型
    etc_model = ElasticNet()

    # 支持向量机回归
    svr_model = SVR()

    # 梯度增强回归模型对象
    gbr_model = GradientBoostingRegressor()

    # 不同模型的名称列表
    model_names = ['BayesianRidge', 'LinearRegression', 'ElasticNet', 'SVR', 'GBR']
    # 不同回归模型
    model_dic = [br_model, lr_model, etc_model, svr_model, gbr_model]
    # 交叉验证结果
    cv_score_list = []
    # 各个回归模型预测的y值列表
    pre_y_list = []

    # 读出每个回归模型对象
    for model in model_dic:
        # 将每个回归模型导入交叉检验
        scores = cross_val_score(model, X, y, cv=n_folds)
        # 将交叉检验结果存入结果列表
        cv_score_list.append(scores)
        # 将回归训练中得到的预测y存入列表
        pre_y_list.append(model.fit(X, y).predict(X))
    ### 模型效果指标评估 ###
    # 获取样本量,特征数
    n_sample, n_feature = X.shape
    # 回归评估指标对象列表
    model_metrics_name = [explained_variance_score, mean_absolute_error, mean_squared_error, r2_score]
    # 回归评估指标列表
    model_metrics_list = []
    # 循环每个模型的预测结果
    for pre_y in pre_y_list:
        # 临时结果列表
        tmp_list = []
        # 循环每个指标对象
        for mdl in model_metrics_name:
            # 计算每个回归指标结果
            tmp_score = mdl(y, pre_y)
            # 将结果存入临时列表
            tmp_list.append(tmp_score)
        # 将结果存入回归评估列表
        model_metrics_list.append(tmp_list)
    df_score = pd.DataFrame(cv_score_list, index=model_names)
    df_met = pd.DataFrame(model_metrics_list, index=model_names, columns=['ev', 'mae', 'mse', 'r2'])

    # 各个交叉验证的结果
    print(df_score,df_met)

    ### 可视化 ###
    # 创建画布
    plt.figure(figsize=(9, 6))
    # 颜色列表
    color_list = ['r', 'g', 'b', 'y', 'c']
    # 循环结果画图
    for i, pre_y in enumerate(pre_y_list):
        # 子网络
        plt.subplot(2, 3, i+1)
        # 画出原始值的曲线
        plt.plot(np.arange(X.shape[0]), y, color='k', label='y')
        # 画出各个模型的预测线
        plt.plot(np.arange(X.shape[0]), pre_y, color_list[i], label=model_names[i])
        plt.title(model_names[i])
        plt.legend(loc='lower left')
    plt.savefig(path_figure + gaze_csv.split('_')[0]+'.png')
    # plt.show()

def csv_head_add(csv_path,gaze):

    df = pd.read_csv(csv_path + gaze, header=None, names=["crpd"],encoding='CP949', engine='python')
    df.to_csv(csv_path + gaze,index=False)
path = 'E:/ffmpeg-latest-win64-static/1_biyelunwenshiyan/1_experiment/python_project/gaze_processing/realtime_gaze_data/feature/'
path_2 = './real_time_eeg_ratio/'
feature_list = os.listdir(path)
for f in range(len(feature_list)):
    feature = feature_list[f]
    if feature == str('CLPD'):
        mid_path = path + feature + '/'
        video_list = os.listdir(mid_path)
        for v in range(len(video_list)):
            video = video_list[v]
            gaze_path = mid_path + video +'/'
            eeg_path_ = path_2 +  video +'/'

            gaze_list = os.listdir(gaze_path)
            eeg_ch_list = os.listdir(eeg_path_)
            for g in range(len(gaze_list)):
                gaze_csv = gaze_list[g]
                # csv_head_add(csv_path,gaze)
                for ch in range(len(eeg_ch_list)):
                    channel = eeg_ch_list[ch]
                    eeg_path = eeg_path_ + channel +'/'
                    eeg_list = os.listdir(eeg_path)
                    path_figure = './eeg_gaze_synchronization/figure/'+ str(video) + '/'+str(channel) +'/'
                    path_corr = './eeg_gaze_synchronization/csv/'+ str(video) + '/'+str(channel) +'/'
                    mkdir(path_corr)
                    mkdir(path_figure)

                    for e in range(len(eeg_list)):
                        eeg_csv = eeg_list[e]
                        if gaze_csv.split('_')[0] == eeg_csv.split('.')[0]:
                            Corr_data = read_csv(gaze_path, gaze_csv, eeg_path, eeg_csv)
                            print(len(Corr_data))
                            Correlation_coefficient = corr()
                            Correlation_coefficient =pd.DataFrame(Correlation_coefficient)
                            Correlation_coefficient.to_csv(path_corr + gaze_csv.split('_')[0]+ '.csv')
                            regr()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值