我是中科院计算所的博士研究生,以前做过一些行为识别方面的研究。这里提供几个链接:
一、我的github上关于机器学习及行为识别的资料,有课程有资料有论文,比较详细:GitHub - jindongwang/MachineLearning: 一些关于机器学习的学习资料与研究介绍 GitHub - jindongwang/activityrecognition: Information about activity recognition
二、关于提特征的问题,主要是
时域和频域
特征,用
滑动窗口
提取特征,比如平均数、方差、过零率等,还有傅里叶变换后的幅度、频率、均值等。
三、可用数据集:
来自UCI的一个行为识别数据集,可用来练手:UCI Machine Learning Repository: Daily and Sports Activities Data Set
四、我写的python和matlab提取特征代码,见文章最后
五、最近刚发现一个自动提取时间序列特征的库,可以省不少事,地址在这里:blue-yonder/tsfresh
Matlab版本的在这里:https:// github.com/benfulcher/h ctsa
下面以行为识别中最常用的加速度为例,分别从滑动窗口、时域特征、频域特征三部分做简单的分析。文章最后附有我写的python提取特征程序。
0.滑动窗口
滑动窗口由两个关键变量构成:窗口大小(windowssize)和滑动步长(step)。其中,窗口大小指的是一次处理的数据量。假设传感器采样频率为f\text{Hz}
,那么一个窗口大小通常设定为2f
,步长为f
。
在实际应用中,我们一般选择的窗口大小为2的指数次:
\text{windowsize}=2^{ceil({log_{2}(2*f)})}
这样能保证提取频域特征时,傅里叶变换的顺利进行。
1.合成加速度
加速度计通常有三轴读数(x,y,z)
,分别表示三个方向的加速度值。在实际应用中,除去一些特定的动作需要使用特定的单轴来辨别方向之外,通常我们是将三轴加速度
合成
为一个加速度值(合成加速度),之后的特征提取与分类全以合成加速度为初始数据进行。这样在确保精度的同时,减少了计算复杂性。
以a_i
表示合成加速度,a^x_i,a^y_i,a^z_i
分别表示三轴加速度计读数,i\in\{1,2,...,n\}
表示第i
条加速度计读数,合成加速度的计算方式为:
a_i=\sqrt{(a^x_i)^2 + (a^y_i)^2 +(a^z_i)^2}
2.时域特征
时域特征(time domain features)是指,在序列随时间变化的过程中,所具有的与时间相关的一些特征。我们用n
来表示一个时间窗口的大小(即窗口内数据的行数),用i
来表示第i
行数据,常用的时域特征如下:
2.1.均值mean
计算公式:mean=\frac{1}{n} \sum_{i=1}^{n}{a_i}
Matlab中可用的函数:mean()
Python中可用的函数:numpy.mean()
2.2.标准差std
计算公式:std = \sqrt{\frac{1}{n} \sum_{i=1}^{n}{(a_i - mean)^2} }
(根号下写成\frac{1}{n-1}
亦可).
Matlab中可用的函数:std()
Python中可用的函数:std()
2.3.众数mode
一般来说,一组数据中,出现次数最多的数就叫这组数据的众数。例如:1,2,3,3,4的众数是3。
但是,如果有两个或两个以上个数出现次数都是最多的,那么这几个数都是这组数据的众数。例如:1,2,2,3,3,4的众数是2和3。
还有,如果所有数据出现的次数都一样,那么这组数据没有众数。例如:1,2,3,4,5没有众数。
为了计算方便,如果有多个众数,我们取平均作为惟一的众数。
Matlab中可用的函数:mode()
Python中可用的函数:mode()
2.4.最大值max
一个窗口内的最大值。
计算公式:max=\max{(a_i)},i\in\{1,2,...,n\}
Matlab中可用的函数:max()
Python中可用的函数:max()
2.5.最小值min
一个窗口内的最小值。
计算公式:min=\min{(a_i)},i\in\{1,2,...,n\}
Matlab中可用的函数:min()
Python中可用的函数:min()
2.6.范围range
一个窗口内最大值与最小值的差。
计算公式:range=|max-min|
Matlab中可用的函数:abs(max()-min())
Python中可用的函数:abs(max()-min())
2.7.过均值点个数above\_mean
一个窗口内超过均值点的数据个数。
计算公式:above\_mean=\sum_{i=1}^{n}\mathbb{I}(a_i>mean)
,其中\mathbb{I}(\cdot)
是指示函数(indicator function),当括号里条件成立时取值为1,否则为0。
2.8.相关系数\rho
相关系数是指对于两个向量(比如x,y
这两轴读数)之间的相关性。一般用在辨别一个方向的运动较多,不是很常用。
计算公式:\rho_{x,y}=\frac{cov(x,y)}{\sigma_x \sigma_y}
其中,cov(x,y)
表示x,y
的皮尔逊相关系数,\sigma_x,\sigma_y
分别表示x,y
的标准差。
2.9.信号幅值面积SMA
信号幅值面积(Signal Magnitude Area,SMA)指x,y,z
三轴的加速度读数曲线分别与三个坐标轴围成的面积之和。一般来说,静止状态和运动状态下该特征比较明显。
计算公式:SMA=\frac{1}{t}\left(\int_{0}^{t}|x(t)|dt+\int_{0}^{t}|y(t)|dt+\int_{0}^{t}|z(t)|dt \right)
其中,t表示一个时间窗口的大小。由于涉及到积分运算,该特征一般不常用。
3.频域特征
频域特征(frequency domain features)通常被用来发现信号中的周期性信息。例如,跑步和走路都是典型的周期性运动。频域分析主要用快速傅里叶变换(Fast Fourier Transform,FFT)来计算。
Matlab中进行快速傅里叶变换的函数:FFT()
由于信号是一维的,对长度为n
的信号进行傅里叶变换后,得到n
个变换后的数值。频域特征就主要从这n
个变换后的数值得到。为了方便理解,下面举例说明。
举例:原数据有8个:1,2,3,4,5,6,7,8.
经过FFT后得到以下8个数:
36.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 + 1.6569i
-4.0000 + 0.0000i -4.0000 - 1.6569i -4.0000 - 4.0000i -4.0000 - 9.6569i
从这8 个数中可以很明显地看到,第1个数最大,剩下7个数以第5个数为中心是对称的。这是傅里叶变换所决定的。所以在实际计算中,除去单独取第1个数以外,剩下的数可以只取一半。
3.1.直流分量DC
直流分量(Direct Current,DC)是傅里叶变换后的第一个分量,是这些信号的均值,一般要比其他的数大得多。
3.2.幅度
幅度就是变换后数据的绝对值。
3.3.功率谱密度PSD
功率谱密度(Power Spectral Density,PSD)用来描述数据在频域的能量分布。
功率谱密度分为幅度统计特征和形状统计特征这两种特征。
3.3.1 幅度统计特征
设C(i)
是第i
个窗口的频率幅度值,N
表示窗口数,则幅度统计特征的几个量计算方式如下:
a.均值mean:
\mu_{amp}=\frac{1}{N}\sum_{i=1}^{N}C(i)
b.标准差standard deviation:
\sigma_{amp}=\sqrt{\frac{1}{N}\sum_{i=1}^{N}[C(i)-\mu_{amp}]^2}
c.偏度skewness:
\gamma_{amp}=\frac{1}{N}\sum_{i=1}^{N}[\frac{C(i)-\mu_{amp}}{\sigma_{amp}}]^3
d.峰度kurtosis:
\gamma_{amp}=\frac{1}{N}\sum_{i=1}^{N}[\frac{C(i)-\mu_{amp}}{\sigma_{amp}}]^4-3
3.3.2 形状统计特征
设C(i)
是第i
个窗口的频率幅度值,N
表示窗口数,S=\sum_{i=1}^{N}C(i)
,则形状统计特征的几个量计算方式如下:
a.均值mean:
\mu_{shape}=\frac{1}{S}\sum_{i=1}^{N}iC(i)
b.标准差standard deviation:
\sigma_{shape}=\sqrt{\frac{1}{S}\sum_{i=1}^{N}(i-\mu_{shape})^2C(i)}
c.偏度skewness:
【感谢@Tang指正,此处写错了下标】
\gamma_{shape}=\frac{1}{S}\sum_{i=1}^{N}\left(\frac{i-\mu_{shape}}{\sigma_{shape}}\right)^3 C(i)
d.峰度kurtosis:
\gamma_{shape}=\frac{1}{S}\sum_{i=1}^{N}[\frac{i-\mu_{shape}}{\sigma_{shape}}]^4C(i)-3
我写的滑动窗口提特征代码(Matlab+Python)见这里:jindongwang/activityrecognition