python实现基于TNDADATASET的人体行为识别

news2025/2/27 1:50:34

首先来看下TNDADATASET:

 随便打开一个文件简单看下如下所示:

 可以大概推测出来,这里面不同维度的数据集应该是由不同的穿戴式传感器采集得到的,最后一列的class表示的是当前的行为类型。

在我之前的博文里面已经做过了相关的工作了,如下:

《人体行为姿势识别数据集WISDM实践》

《UCI行为识别——Activity recognition with healthy older people using a batteryless wearable sensor Data Set》

所以这里我就不再赘述相关的背景内容性质的东西了,参考前面的文章就懂得这里应该如何来处理数据集了,首先是数据集加载解析处理:

def loadData(path):
    """
    加载解析数据
    """
    all_subject_data = []
    for i in os.listdir(path):
        subject_path = path + i
        subject_data = pd.read_csv(subject_path)
        subject_data.drop(
            index=list(subject_data[subject_data["class"] <= 3].index), inplace=True
        )
        all_subject_data.append(subject_data)
    all_subject_data = pd.concat(all_subject_data, axis=0)
    all_subject_data.drop(
        index=list(all_subject_data[all_subject_data["class"] == 0].index), inplace=True
    )
    X = all_subject_data[
        [
            "wri_Acc_X",
            "wri_Acc_Y",
            "wri_Acc_Z",
            "wri_Gyr_X",
            "wri_Gyr_Y",
            "wri_Gyr_Z",
            "wri_Mag_X",
            "wri_Mag_Y",
            "wri_Mag_Z",
            "ank_Acc_X",
            "ank_Acc_Y",
            "ank_Acc_Z",
            "ank_Gyr_X",
            "ank_Gyr_Y",
            "ank_Gyr_Z",
            "ank_Mag_X",
            "ank_Mag_Y",
            "ank_Mag_Z",
            "bac_Acc_X",
            "bac_Acc_Y",
            "bac_Acc_Z",
            "bac_Gyr_X",
            "bac_Gyr_Y",
            "bac_Gyr_Z",
            "bac_Mag_X",
            "bac_Mag_Y",
            "bac_Mag_Z",
        ]
    ]
    y = all_subject_data["class"]
    return X, y

因为原始数据集中类别不均衡的存在,这里我丢掉了1 2 3这几种类别的行为动作,保留了4 5 6 7 8这五种行为动作的数据。

当然了也是可以全部保留的,本质都是一个多分类的问题。

接下来是特征提取部分,这里我们主要实现了包括:李雅普诺夫指数、递归图特征、庞加莱图特征、拓扑特征、近似熵特征、样本熵特征、模糊熵特征等在内的众多特征提取计算方法,后期可以综合使用。

这里以李雅普诺夫指数为例,看下对应的核心特征提取实现如下:

def lypnf_feature(data):
    """
    李雅普诺夫指数  nolds库
    """
    featuress = []
    for j in tqdm(range(data.shape[0])):
        fea = []
        for i in range(data.shape[2]):
            data_ = data[j, :, i]
            feature = nolds.lyap_e(data_)
            fea = np.hstack((fea, feature))
        if j == 0:
            featuress = np.concatenate((featuress, fea))
        else:
            featuress = np.vstack((featuress, fea))
    return featuress

整体特征工程融合提取存储实现如下:

def buildFeature(dataDir="./TNDADATASET/"):
    """
    特征工程
    """
    data, label = load_data(dataDir)
    data_processed, label_processed = data_preprocesssing(data, label, 128, 64)
    # 特征提取
    in_data_rec = rec_feature(data_processed)
    print("in_data_rec shape:", in_data_rec.shape)
    in_data_poincare = poincare_feature(data_processed)
    print("in_data_poincare shape:", in_data_poincare.shape)
    in_data_topo = topo_feature(data_processed, 5, 5)
    print("in_data_topo shape:", in_data_topo.shape)
    in_data_lypnf = lypnf_feature(data_processed)
    print("in_data_lypnf shape:", in_data_lypnf.shape)
    m = 2
    in_data_apx = apx_feature(data_processed, m)
    print("in_data_apx shape:", in_data_apx.shape)
    m, n = 2, 2
    in_data_fuz = fuz_feature(data_processed, m, n)
    print("in_data_fuz shape:", in_data_fuz.shape)
    m = 1
    in_data_samp = samp_feature(data_processed, m)
    print("in_data_samp shape:", in_data_samp.shape)
    feature = {}
    feature["rec_feature"] = in_data_rec.tolist()
    feature["poincare_feature"] = in_data_poincare.tolist()
    feature["topo_feature"] = in_data_topo.tolist()
    feature["lypnf_feature"] = in_data_lypnf.tolist()
    feature["apx_feature"] = in_data_apx.tolist()
    feature["fuz_feature"] = in_data_fuz.tolist()
    feature["samp_feature"] = in_data_samp.tolist()
    feature["label"] = label_processed.tolist()
    with open("feature.json", "w") as f:
        f.write(json.dumps(feature))
    sample_num = in_data_rec.shape[0]
    rec = in_data_rec.tolist()
    poincare = in_data_poincare.tolist()
    topo = in_data_topo.tolist()
    lypnf = in_data_lypnf.tolist()
    apx = in_data_apx.tolist()
    fuz = in_data_fuz.tolist()
    samp = in_data_samp.tolist()
    labels = label_processed.tolist()
    result = []
    for i in range(sample_num):
        one_vec = rec[i] + poincare[i] + topo[i] + lypnf[i] + apx[i] + fuz[i] + samp[i]
        one_label = labels[i]
        one_vec.append(one_label)
        result.append(one_vec)
    print("result_shape: ", np.array(result).shape)
    with open("allfeature.json", "w") as f:
        f.write(json.dumps(result))

执行耗时较长,输出如下:

 得到所需的特征数据之后就可以构建模型来进行训练测试计算了。

这里的机器学习模型主要是基于sklearn库来进行快速地搭建使用,主要选择了:LR、RF、GBDT、SVM这四种经典的模型进行试验对比分析,如下所示:

 以LR模型为例,看下核心完整构建流程实现如下:

def lrModel(data='feature.json',rationum=0.30,model_path='lr.model'):
    '''
    逻辑回归模型
    '''
    with open(data) as f:
        data_list=json.load(f)
    x_list,y_list=[],[]
    for i in range(len(data_list)):
        y_list.append(data_list[i][-1]) 
        x_list.append(data_list[i][:-1])
    label=list(set(y_list))
    print('y_list: ',label)
    X_train,X_test,y_train,y_test=splitData(x_list, y_list,ratio=rationum)
    model=LogisticRegression()
    model=DecisionTreeClassifier()
    model.fit(X_train,y_train)
    #预测、分析
    y_pred=model.predict(X_test).tolist()
    plotConfusionMatrix(y_test,y_pred,label,save_path=saveDir+'LR.png')
    #计算模型在测试集上的得分
    accuracy=model.score(X_test,y_test)
    print('logisticRegressionModel model_score: ',accuracy)
    Precision,Recall,F1=calThree(y_test,y_pred)
    saveModel(model,save_path=model_path)
    result={}
    result['accuracy'],result['F_value']=accuracy,F1
    result['precision'],result['recall']=Precision,Recall
    print('type: ', type(y_test), type(y_pred))
    result['y_true'],result['y_pred']=y_test,y_pred
    return result

看下对比混淆矩阵,如下所示:

 可以看到:四种不同的模型整体的效果都是很不错的。

之后为了对比深度学习模型与机器学习模型的优劣,我又依次开发了:LSTM、CNN-LSTM、BILSTM三种模型库,时间问题就不再一一解释了,直接看最终的结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕设Python+Vue养老机构管理信息系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Sigrity常见问题解决方法(持续更新)

Sigrity常见问题解决方法&#xff08;持续更新&#xff09; 1.使用SpeedEM仿真时&#xff0c;报placement error 错误信息如下&#xff1a; 该问题是因为Mesh设置的过大&#xff0c;导致via和note在同一个mesh网格上存在粘连 解决方法是&#xff1a;将mesh进行auto设置 2…

鲍鱼年龄预测 knn svm 逻辑回归

数据&#xff1a; M,0.455,0.365,0.095,0.514,0.2245,0.101,0.15,15 M,0.35,0.265,0.09,0.2255,0.0995,0.0485,0.07,7 F,0.53,0.42,0.135,0.677,0.2565,0.1415,0.21,9 M,0.44,0.365,0.125,0.516,0.2155,0.114,0.155,10 I,0.33,0.255,0.08,0.205,0.0895,0.0395,0.055,7 I,0.425…

基于pytorch搭建CNN 人像口罩识别检测项目

项目介绍 我们将使用 CNN (卷积神经网络)和机器学习分类器创建一个检测一个人是否戴着口罩的分类器。它将检测一个人是否戴着口罩。 我们将从头开始学习,我将对每一步进行解释。我需要你对机器学习和数据科学有基本的了解。我已经在本地 Windows 10 机器上实现了它,如果你…

深入浅出JVM(七)之执行引擎的解释执行与编译执行

执行引擎 hotspot执行引擎结构图 执行引擎分为解释器、JIT即时编译器以及垃圾收集器 执行引擎通过解释器/即时编译器将字节码指令解释/编译为对应OS上的的机器指令 本篇文章主要围绕解释器与即时编译器&#xff0c;垃圾收集器将在后续文章解析 解释执行与编译执行 Java虚拟机…

方向图与天线增益

目录 一、方向图 二、增益 一、方向图 天线的方向性是指天线向一定方向辐射电磁波的能力。对于接收天线而言&#xff0c;方向性表示天线对不同方向传来的电磁波具有不同的接收能力。天线的方向性通常用方向图来表示。 在数学里&#xff0c;球坐标系是一种利用球坐标表示一个点…

Linux学习-90-Tomcat下载安装(tar压缩包)

17.20 Tomcat下载安装&#xff08;tar压缩包&#xff09; 访问apache官网下载tomcat压缩包。访问以下链接进行下载tomcat-8.5.83版本&#xff0c;高版本的tomcat存在一些问题影响使用&#xff0c;然后使用 Xftp 上传到/usr/local/src目录中或者使用wget命令直接到/usr/local/s…

SpringBoot:模块探究之spring-boot-cli

Spring Boot CLI 是运行 SpringBoot 命令的命令行工具&#xff0c;能够帮助你快速的构建 Spring Boot 项目。只需要编写简单的 groovy 脚本&#xff0c;即可用最少的代码构建并运行一个完整的 Spring Boot 项目。 Spring Boot CLI 为 SpringCloud 提供了 SpringBoot 命令行功能…

Java面试--CAS

这里写目录标题一、概念二、CAS 如何保证原子性2.1、总线锁定2.2、缓存锁定二、底层原理三、CAS典型应用四、CAS问题4.1、循环时间长&#xff0c;开销很大4.2、只能保证一个共享变量的原子操作4.3、引出来 ABA 问题一、概念 判断内存中某个位置的值是否为预期值&#xff0c;如…

Bootstrap5 表单浮动标签

默认情况下&#xff0c;标签内容一般显示在 input 输入框的上方&#xff1a; 使用浮动标签&#xff0c;可以在 input 输入框内插入标签&#xff0c;在单击 input 输入框时使它们浮动到上方 Bootstrap 实例 <div class"form-floating mb-3 mt-3"> <input ty…

uni.requestPayment使用

前言&#xff1a;由于uni.requestPayment没有封装H5支付方法&#xff0c;我自己封装了统一方法可以多端适用。 代码如下&#xff1a; 有两种方法&#xff1a; 方法1&#xff1a;安装 jweixin-module 包&#xff0c;我的是1.6.0版本->引入->使用 方法2&#xff1a;使用微…

51单片机实训day2——创建Keil工程(一)

以管理员身份打开软件&#xff01;&#xff01;&#xff01;以管理员身份打开软件&#xff01;&#xff01;&#xff01;以管理员身份打开软件&#xff01;&#xff01;&#xff01; 内 容&#xff1a;Keil工程创建 学 时&#xff1a;2学时 知识点&#xff1a;开发固件库介绍…

【Linux】进程替换与shell的模拟实现

目录 一、进程替换 1.1 进程替换的概念 1.2 替换函数 二、命令行解释器-Shell 2.1 shell的实现与运行 2.2 步骤讲解 一、进程替换 1.1 进程替换的概念 当我们使用 fork 函数创建子进程后&#xff0c;父子进程各自执行父进程代码的一部分。那如果创建的子进程想要执行一…

UG/NX二次开发Siemens官方NXOPEN实例解析—2.4 File2Points

列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer UG/NX二次开发Siemens官方NXOPEN实例解析—2.2 Selection UG/NX二次开发Siemens官方NXOPEN实例解析—2.3 Selection_UIStyler UG/NX二次开发Siemens官方NXOPEN实例解析—2.4 File2Points 前言 随着…

Python开发的编译神器PyCharm----测试从业来编写Python脚本最钟意的工具

目录 前言&#xff1a; 一、PyCharm简介 二、PyCharm下载与安装 1、下载 2、安装 三、PyCharm新增Python项目 步骤1、新增 步骤2、路径配置 步骤3、环境选择 步骤4、 项目运行 四、画圣诞树 前言&#xff1a; 本文将为大家介绍PyCharm下载安装与初步的使用&#xff0c;初…

外汇天眼:美国11月独栋房屋建设跌至两年半低点!

美国商务部周二公布了这份令人沮丧的报告&#xff0c;此前周一有消息称&#xff0c;12月份房屋建筑商信心连续第12个月出现创纪录的下滑。美国11月独栋房屋建设跌至两年半低点&#xff0c;未来建筑许可大幅下滑&#xff0c;因抵押贷款利率上升继续打压楼市活动。 具体数据显示&…

(十九)Vue之组件和模块概念

文章目录传统编程组件化编程模块模块化组件化Vue学习目录 上一篇&#xff1a;&#xff08;十八&#xff09;Vue之生命周期 传统编程 一个html引入大量的CSS、JS文件&#xff0c;使得结构混乱、代码复用率低 传统方式编写应用存在的问题&#xff1a; 1.依赖关系混乱、不好维护…

某讯滑块验证码反汇编分析-第三章

某讯滑块验证码反汇编分析-第三章collect明文处理vData明文处理collect明文处理 上一篇已经跟到明文的拼接函数&#xff0c;接下来看看get函数的返回值&#xff0c;对什么进行拼接。 在这一次运行中&#xff0c;第一次get返回的是一个10&#xff0c;是怎么计算出来的呢&#x…

[XCTF]red_green(难度2)

得到一个乱码的图片&#xff0c;查看信息&#xff0c;联系“red_green” 目录 前言 一、题目重述 二、解题思路 1.套路来一遍 2.过程中注意到以下两点&#xff1a; &#xff08;1)stegsolve图层中只有red/green&#xff0c;与题目暗合 &#xff08;2)zsteg查看隐写信息发…

springboot+jsp实验室管理系统fu1ju-

目录 第一章 绪论 5 1.1 研究背景 5 1.2系统研究现状 5 1.3 系统实现的功能 6 1.4系统实现的特点 6 1.5 本文的组织结构 6 第二章开发技术与环境配置 7 2.1 Java语言简介 7 2.2JSP技术 8 2.3 MySQL环境配置 8 2.4 MyEclipse环境配置 9 2.5 mysql数据库介绍 9 2.6 B/S架构 9 第三…