手勢識別演算法: 資料濾波演算法、資料分演算法——KNN
資料濾波演算法設計介紹
資料濾波演算法是去除噪音干擾的有效方法,此次採用使用廣泛的濾波演算法——卡爾曼濾波演算法。 這樣計算量小,利於計算機實現等特點。將極板上採集的資料進行實時的處理,將資料中的噪音清除,把誤差降到最小。
資料分類演算法介紹
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超出了我的能力範圍,此處也就不去講怎麼調了
相關文章
- 資料探勘——KNN演算法(手寫數字分類)KNN演算法
- 濾波演算法——十大濾波演算法程式大全演算法
- 機器學習演算法-K近鄰(KNN)演算法(三):馬絞痛資料--kNN資料預處理+kNN分類pipeline(程式碼附詳細註釋)機器學習演算法KNN
- KNN演算法的資料歸一化--Feature ScalingKNN演算法
- scikit-learn中KNN演算法資料歸一化的分裝KNN演算法
- KNN 演算法-實戰篇-如何識別手寫數字KNN演算法
- 空域濾波演算法演算法
- KNN演算法——分類部分KNN演算法
- 資料結構:初識(資料結構、演算法與演算法分析)資料結構演算法
- 演算法偏見就怪資料集?MIT糾偏演算法自動識別「弱勢群體」演算法MIT
- 資料結構與演算法-kd二叉樹(kNN)資料結構演算法二叉樹KNN
- 資料探勘演算法跟資料結構中的演算法有區別嗎演算法資料結構
- 【資料結構與演算法】二分鐘初識樹資料結構演算法
- 演算法(八):圖解KNN演算法演算法圖解KNN
- 最基礎的分類演算法(KNN)演算法KNN
- [資料結構與演算法] 排序演算法資料結構演算法排序
- KNN演算法實驗KNN演算法
- 資料結構&演算法資料結構演算法
- 常用資料探勘演算法演算法
- 基於小波神經網路的資料分類演算法matlab模擬神經網路演算法Matlab
- 演算法實踐:KNN分類(day08)演算法KNN
- 資料結構與演算法:查詢演算法資料結構演算法
- 資料結構與演算法——貪心演算法資料結構演算法
- python機器學習演算法——KNN演算法Python機器學習演算法KNN
- python演算法與資料結構-演算法和資料結構介紹(31)Python演算法資料結構
- 演算法與資料結構系列 ( 一 ) - 演算法的級別區分理解演算法資料結構
- 資料結構——Floyd演算法資料結構演算法
- 基本資料結構演算法資料結構演算法
- 資料結構演算法題資料結構演算法
- 前端演算法 - 資料結構前端演算法資料結構
- 09.Java資料演算法Java演算法
- 資料結構及演算法資料結構演算法
- 資料結構與演算法資料結構演算法
- 資料結構和演算法資料結構演算法
- 演算法金 | 再見!!!KNN演算法KNN
- js資料結構和演算法(9)-排序演算法JS資料結構演算法排序
- 資料結構與演算法(十一)——演算法-遞迴資料結構演算法遞迴
- 資料結構與演算法——十個排序演算法資料結構演算法排序