人体运动状态预測-实例分析

Posted llguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了人体运动状态预測-实例分析相关的知识,希望对你有一定的参考价值。

背景介绍 :

? 可穿戴式设备的流行。让我们能够更便利地使用传感器获取人体的各项数据, 甚至生理数据。

? 当传感器採集到大量数据后。我们就能够通过对数据进行分析和建模。通过 各项特征的数值进行用户状态的推断。依据用户所处的状态提供给用户更加 精准、便利的服务。

数据介绍:

? 我们如今收集了来自 A, B, C, D, E 5 位用户的可穿戴设备上的传感器数据, 每位用户的数据集包括一个特征文件 (a.feature) 和一个标签文件 (a.label)。

? 特征文件里每一行相应一个时刻的全部传感器数值。标签文件里每行记录了 和特征文件里相应时刻的标记过的用户姿态。两个文件的行数同样。同样行 之间互相相应。

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

任务介绍

? 假设如今出现了一个新用户。但我们仅仅有传感器採集的数据。那么该怎样得到 这个新用户的姿态呢?

? 又或者对同一用户假设传感器採集了新的数据。怎么样依据新的数据推断当前 用户处于什么样的姿态呢?

在明白这是一个分类问题的情况下,我们能够选定某种分类模型(或者说是
算法),通过使用训练数据进行模型学习。然后对每一个測试样本给出相应的分类
结果。

机器学习的分类算法众多,在接下来的学习中我们将会具体介绍经典的分类 算法,如K近邻、决策树和朴素贝叶斯的原理和实现。

基本分类模型:

K近邻分类器(KNN)

KNN:通过计算待分类数据点。与 已有数据集中的全部数据点的距离。

取 距离最小的前K个点,依据“少数服从 多数“的原则,将这个数据点划分为出 现次数最多的那个类别。

技术分享图片

sklearn 中的 K 近邻分类器

在 sklearn 库中,能够使用 sklearn.neighbors.KNeighborsClassifier 创建一个 K 近邻分类器,主要參数有:

? n_neighbors : 用于指定分类器中K的大小(默认值为 5,注意与 kmeans 的差别)

? weights : 设置选中的K个点对分类结果影响的权重( 默认值为平均 权重 “uniform”,能够选择 “distance” 代表越近的点权重越高, 或者传入自己编写的以距离为參数的权重计算函数 )

? algorithm : 设置用于计算临近点的方法,由于当数据量非常大的情况
下计算当前点和全部点的距离再选出近期的k各点,这个计算量是非常 费时的。所以(选项中有 ball_tree、kd_tree 和 brute,分别代表不 同的寻找邻居的优化算法,默认值为 auto,依据训练数据自己主动选择)

KNN的使用经验

在实际使用时,我们能够使用全部训练数据构成特征 X 和标签 y,使用 fit() 函数进行训练。在正式分类时。通过一次性构造測试集或者一个一个输入 样本的方式,得到样本相应的分类结果。有关 K 的取值:

? 假设较大。相当于使用较大邻域中的训练实例进行预測。能够减小预计误差,
可是距离较远的样本也会对预測起作用,导致预測错误。

? 相反地,假设 K 较小,相当于使用较小的邻域进行预測,假设邻居恰好是噪

? 普通情况下。K 会倾向选取较小的值,并使用交叉验证法选取最优 K 值。

决策树

决策树是一种树形结构的分类器,通过顺序询问分类点的属性决定分类点终于的类别。通常依据特征的信息增益或其它指标,构建一颗决策树。在分类时,仅仅须要依照决策树中的结点依次进行推断,就可以得到样本所属类别。

比如。依据下图这个构造好的分类决策树, 一个无房产。单身。年收入 55K 的人的会被归入无法偿还信用卡这个类别。

技术分享图片

sklearn 中的决策树

在 sklearn 库中,能够使用 sklearn.tree.DecisionTreeClassifier 创建一个决策树用于分类,其主要參数有:

? criterion : 用于选择属性的准则。能够传入 “gini” 代表基尼 系数,或者 “entropy” 代表信息增益。

? max_features : 表示在决策树结点进行分裂时,从多少个特征 中选择最优特征。能够设定固定数目、百分比或其它标准。

它 的默认值是使用全部特征个数。

? 决策树本质上是寻找一种对特征空间上的划分,旨在构建一个训练数据拟合的 好,而且复杂度小的决策树。

? 在实际使用中,须要依据数据情况,调整 DecisionTreeClassifier 类中传入的 參数。比方选择合适的 criterion,设置随机变量等。

朴素贝叶斯

朴素贝叶斯分类器是一个以贝叶斯定理为基础的多分类的分类器。

对于给定数据。首先基于特征的条件独立性假设,学习输入输出的联合概率分布,然后基于此模型,对给定的输入 x。利用贝叶斯定理求出后验概率最大的输出 y。

sklearn 中的朴素贝叶斯

技术分享图片

在 sklearn 库中,能够使用 sklearn.naive_bayes.GaussianNB 创建一个高斯朴素贝叶斯分类器,其參数有:

? priors : 给定各个类别的先验概率。假设为空,则按训练数据的实际情况 进行统计; 假设给定先验概率,则在训练过程中不能更改。

朴素贝叶斯是典型的生成学习方法,由训练数据学习联合概率分布,并求得
后验概率分布。

朴素贝叶斯一般在小规模数据上的表现非常好,适合进行多分类任务。

程序编写

技术分享图片

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat May 27 07:52:08 2017

@author: xiaolian
"""

import pandas as pd
import numpy as np  

from sklearn.preprocessing import Imputer
from sklearn.cross_validation import train_test_split 
from sklearn.metrics import classification_report

from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB

def load_datasets(feature_paths, label_paths):

    feature = np.ndarray(shape = (0, 41))
    label = np.ndarray(shape = (0, 1))

    for file in feature_paths:
        df = pd.read_table(file, delimiter = ‘,‘, na_values = ‘?

‘, header = None) #print(df) imp = Imputer(missing_values = ‘NaN‘, strategy = ‘mean‘, axis = 0) imp.fit(df) #print(df) df = imp.transform(df) # print(‘df type :‘, type(df)) #print(df) feature = np.concatenate((feature, df)) #print(‘feature‘) #print(feature) for file in label_paths: df = pd.read_table(file, header = None) #print(‘df :‘, df) label = np.concatenate((label, df)) #print(‘label‘, label) label = np.ravel(label) #print(‘label‘, label) return feature, label if __name__ == ‘__main__‘: ‘‘‘data path‘‘‘ featurePaths = [‘A/A.feature‘, ‘B/B.feature‘, ‘C/C.feature‘, ‘D/D.feature‘, ‘E/E.feature‘] labelPaths = [‘A/A.label‘,‘B/B.label‘, ‘C/C.label‘, ‘D/D.label‘, ‘E/E.label‘] load_datasets(featurePaths[:4], labelPaths[:4]) ‘‘‘ load data ‘‘‘ x_train, y_train = load_datasets(featurePaths[:4],labelPaths[:4]) x_test, y_test = load_datasets(featurePaths[4:],labelPaths[4:]) x_train, x_, y_train, y_ = train_test_split(x_train, y_train, test_size = 0.0) print(‘Start training knn‘) knn = KNeighborsClassifier().fit(x_train, y_train) print(‘Training done‘) answer_knn = knn.predict(x_test) print(‘Prediction done‘) print(‘Start training DT‘) dt = DecisionTreeClassifier().fit(x_train, y_train) print(‘Training done‘) answer_dt = dt.predict(x_test) print(‘Prediction done‘) print(‘Start training Bayes‘) gnb = GaussianNB().fit(x_train, y_train) print(‘Training done‘) answer_gnb = gnb.predict(x_test) print(‘Prediction done‘) print(‘\n\nThe classification report for knn:‘) print(classification_report(y_test, answer_knn)) print(‘\n\nThe classification report for DT:‘) print(classification_report(y_test, answer_dt)) print(‘\n\nThe classification report for Bayes:‘) print(classification_report(y_test, answer_gnb))

技术分享图片

技术分享图片

技术分享图片






以上是关于人体运动状态预測-实例分析的主要内容,如果未能解决你的问题,请参考以下文章

运动人体姿态提取基于GA优化的从二维关节点坐标中估计三维人体姿势的MATLAB仿真

有氧运动 && 无氧运动

基于人体姿态识别的AI健身系统(浅谈

Cocoa|北体运动人体科学考研 · 启

一步步开发AI运动小程序五帧图像人体识别

基于Mediapipe与Unity的人体姿态捕捉系统