當前位置: 華文星空 > 知識

行為辨識常用哪種特征提取?

2016-03-06知識

我是中科院計算所的博士研究生,以前做過一些行為辨識方面的研究。這裏提供幾個連結:
一、我的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