手勢識別演算法: 資料濾波演算法、資料分演算法——KNN

星河幾重發表於2020-12-09

資料濾波演算法設計介紹

資料濾波演算法是去除噪音干擾的有效方法,此次採用使用廣泛的濾波演算法——卡爾曼濾波演算法。 這樣計算量小,利於計算機實現等特點。將極板上採集的資料進行實時的處理,將資料中的噪音清除,把誤差降到最小。

資料分類演算法介紹

KNN是以一種資料分類演算法,在學習模式下,將多次手勢進行取樣濾波,之後進入判定模式,系統會實時取樣,當資料穩定後,得到其特徵向量,計算其特徵向量與樣本資料之間的歐式距離,找到相距最短的k個樣本,判斷其型別,即可手勢識別。
在這裡插入圖片描述

卡爾曼濾波演算法的原理 和簡單實現

簡介:

卡爾曼濾波(Kalman filtering)一種利用線性系統狀態方程,通過系統輸入輸出觀測資料,對系統狀態進行最優估計的演算法。由於觀測資料中包括系統中的噪聲和干擾的影響,所以最優估計也可看作是濾波過程。

- 被觀測的系統

首先我們需要用方程來描述被觀測的系統,因為後面濾波器的方程要用到這裡的一些引數。卡爾曼濾波器適用於線性系統,設該系統的狀態方程和觀測方程為:

x(k) = A · x(k-1) + B · u(k) + w(k)
z(k) = H · x(k) + y(k)

x(k) —— k時刻系統的狀態
u(k) —— 控制量
w(k) —— 符合高斯分佈的過程噪聲,其協方差在下文中為Q(我理解的噪聲 就是誤差的意思)
z(k) —— k時刻系統的觀測值
y(k) —— 符合高斯分佈的測量噪聲,其協方差在下文中為R
A、B、H —— 系統引數,多輸入多輸出時為矩陣,單輸入單輸出時就是幾個常數

注意在後面濾波器的方程中我們將不會再直接面對兩個噪聲w(k)和y(k),而是用到他們的協方差Q和R。至此,A、B、H、Q、R這幾個引數都由被觀測的系統本身和測量過程中的噪聲確定了。

  • 濾波器

工程中用到的卡爾曼濾波是一個迭代的過程,每得到一個新的觀測值迭代一次,來回來去地更新兩個東西:“系統狀態”(x)和“誤差協方差”§。由於每次迭代只用到上一次迭代的結果和新的測量值,這樣濾波對計算資源的佔用是很小的。

每一次迭代,兩個步驟:預測和修正。預測是根據前一時刻迭代的結果,即x(k-1|k-1)和P(k-1|k-1),來預測這一時刻的系統狀態和誤差協方差,得到x(k|k-1)和P(k|k-1):

x(k|k-1) = A · x(k-1|k-1) + B · u(k)
P(k|k-1) = A · P(k-1|k-1) · AT + Q

(這裡用到的A、B、H、Q、R就是從前面的狀態/觀測方程中拿來的)
然後計算卡爾曼增益K(k)(不知道咋來的),和這一次的實際測量結果z(k)一起,用於修正系統狀態x(k|k-1)及誤差協方差P(k|k-1),得到最新的x(k|k)和P(k|k):

K(k) = P(k|k-1) · HT · (H · P(k|k-1) · HT + R)-1
x(k|k) = x(k|k-1) + K(k) · (z(k) - H · x(k|k-1))
P(k|k) = (I - K(k) · H) · P(k|k-1)

x(k|k)就是我們要的濾波後的值,它和P(k|k)將會作為x(k-1|k-1)和P(k-1|k-1)用在下一時刻的迭代裡

- 定義一個簡單場景

先看狀態方程和觀測方程。假設我們是在測溫度、加速度,此時控制量是沒有的,即:

B · u(k) ≡ 0

另外,引數A和H也簡單地取1。現在濾波器的預測方程簡化為:

① x(k|k-1) = x(k-1|k-1)
② P(k|k-1) = P(k-1|k-1) + Q

同時修正方程變成:

③ K(k) = P(k|k-1) / (P(k|k-1) + R)
④ x(k|k) = x(k|k-1) + K(k) · (z(k) - x(k|k-1))
⑤ P(k|k) = (1 - K(k)) · P(k|k-1)

①對②、③無影響,於是④可以寫成:

x(k|k) = x(k-1|k-1) + K(k) · (z(k) - x(k-1|k-1))

在程式中,該式寫起來更簡單:

x = x + K * (新觀測值 - x);
觀察②,對這一時刻的預測值不就是上一時刻的修正值+Q嘛,不妨把它合併到上一次迭代中,即⑤改寫成:

P(k+1|k) = (1 - K(k)) · P(k|k-1) + Q

這一時刻的P(k+1|k),會作為下一時刻的P(k|k-1),剛好是③需要的。於是整個濾波過程只用這三個式子來迭代即可:

K(k) = P(k|k-1) / (P(k|k-1) + R)
x(k|k) = x(k-1|k-1) + K(k) · (z(k) - x(k-1|k-1))
P(k+1|k) = (1 - K(k)) · P(k|k-1) + Q

經過前面的推導,我們發現在程式中只需要不斷重複這一小段即可實現卡爾曼濾波:

while(新觀測值)
{
    K = P / (P + R);
    x = x + K * (新觀測值 - x);
    P = (1 - K) · P + Q;
}

我們發現這一堆字母中,x和P只需要賦初值,每次迭代會產生新值;K用不著賦初值;Q和R賦值以後在之後的迭代中也可以改
x和P的初值是可以隨便設的,強大的卡爾曼濾波器馬上就能抹除不合理之處。但需注意,P的初值不能為0,否則濾波器會認為已經沒有誤差了

剩下的也就是Q和R了。他倆的物理意義是噪聲的協方差,他們的值是需要我們試出來的
因此應該根據具體的使用場景收集到的資料來決定Q和R的取值
全程最難的地方莫過於確定協方差R和Q的值。R的值我們或許能較好的確定,因為一般情況下我們能較清楚的知道儀器的測量誤差,所以這是需要自己去猜測計算的,而Q超出了我的能力範圍,此處也就不去講怎麼調了

相關文章