Kalman Filter là một quy mô Linear-Gaussian State Space Model thuộc đội thuật toán dự kiến chuỗi thời gian. Thuật toán được lấy tên theo Rudolf E. Kálmán, một đơn vị khoa học ảnh hưởng quan trọng trong thừa trình phát triển thuật toán.

Bạn đang xem: Bộ lọc kalman là gì

*

Nếu là 1 kỹ sư điều khiển và tinh chỉnh hệ thống, bạn hiểu rõ rằng điều khiển hệ thống không đối kháng thuần tức thị đo rồi tinh chỉnh những gì bản thân đo được. Đo lường chính xác nhường nào, khối hệ thống điều khiển càng chuyển động ổn định nhường nhịn nấy.

Hãy xoay ngược thời hạn về những năm 1960 với đa số khó khăn của rất nhiều kỹ sư xây dựng phi thuyền Apollo trong cách xử trí tín hiệu. Dữ liệu thô đo được từ lắp thêm tính, được đo từ các cảm biến như con quay hồi chuyển, tốc độ kế, tài liệu rađa vốn dĩ đầy nhiễu, đầy lỗi thiên nhiên và quan trọng đặc biệt lộn xộn không thiết yếu xác. Lúc lao về khía cạnh trăng ở vận tốc cao, ai mà chắc hẳn rằng rằng điều gì sẽ xẩy ra với đa số gì chúng ta điều khiển, các bạn sẽ không ước ao Apollo lao thẳng vào nhà mình đâu!

Kalman Filter là 1 công cụ mạnh bạo mẽ phối kết hợp thông tin không chắc chắn rằng ở thời điểm hiện nay cùng với thông tin đầy nhiễu loàn của môi trường thiên nhiên sang một dạng thông tin mới an toàn và đáng tin cậy hơn để ship hàng dự đoán tương lai. Điểm mạnh mẽ của Kalman Filter là chạy rất nhanh và tính định hình cao.

Một giữa những ứng dụng trước tiên của Kalman Filter là được áp dụng vào phi thuyền Apollo:

The Apollo computer used 2k of magnetic core RAM and 36k wire rope <…>. Clock speed was under 100 kHz <…>. The fact that the MIT engineers were able lớn pack such good software (one of the very first applications of the Kalman filter) into such a tiny computer is truly remarkable. — Phỏng vấn Jack Crenshaw bởi vì Matthew Reed, TRS-80.org (2009)

1. Ý tưởng cơ bạn dạng thuật toán

Thuật toán có khá nhiều ứng dụng vào các bài toán khác nhau. Tuy nhiên để dể hình dung, bây giờ chúng ta hãy tưởng tượng mình là 1 nhà sáng chế phi thuyền Thetalo (một phiên phiên bản lỗi trường đoản cú Apollo).

Phi thuyền đang gửi về thông tin trạng thái sau mỗi khoảng thời hạn nhất định thông qua bộ cảm biến, nhiệm vụ của họ là dự kiến trạng thái trên phi thuyền để ship hàng tác vụ tinh chỉnh và điều khiển hệ thống.

Gọi $mathbfx_t = left< eginarray*20c mathttposition \ mathttvelocity endarray ight> in mathbbR^2$ là trạng thái địa chỉ và gia tốc hiện trên của phi thuyền. Trên mỗi thời gian $t$, bạn không hề có thông tin đúng đắn về $mathbfx_t$.

Vì sao vậy? Hệ mà họ điều khiển không phía bên trong một môi trường lý tưởng, nhiều ảnh hưởng tác động từ môi trường xung xung quanh mà họ không đoán trước ở sẽ tác động những giám sát ban đầu.

Biết đâu được một cơn gió vô tình, một trận mưa ngang qua, một trận sấm sét cuồng phong sẽ làm mọi tính toán sai lầm. Trực cảm cho ta thấy nó đang nơi đâu đó trong không khí này, tại một số trong những vùng như thế nào đó kĩ năng xảy ra cao hơn, tại một trong những vùng làm sao đó tài năng xảy ra thấp hơn. Phân bố xác suất như một phiên bản đồ về việc chắc chắn, một tinh thần về phần đông sự kiện xảy ra.

Lựa chọn phân bố xác suất tương xứng là điều quan trọng như thể gạn lọc cho bản thân một niềm tin, trong mô hình Kalman Filter phân bố phần trăm được chọn là phân bố chuẩn chỉnh nhiều chiều. Cũng chính vì chọn phân bố chuẩn nhiều chiều là vì đó là phân cha liên tục tương xứng bài toán sẽ xét, một vài tính chất đặc biệt quan trọng của phân bố chuẩn chỉnh nhiều chiều dễ dàng cho tác vụ cầu lượng tham số.

Tại mỗi thời gian $t$, giả định vector tự dưng $x_t$ có phân bố chuẩn nhiều chiều tuyệt $x_t sim mathcalN(hatx_t, Sigma_t )$ với $hatx_t$ là hy vọng của $x_t$, $Sigma_t$ là ma trận hiệp phương không đúng với mỗi thành phần tại hàng $i$ cột $j$ miêu tả độ đổi thay thiên cùng mọi người trong nhà của nhì biến bất chợt thứ $i$ và $j$. Công thức tổng quát của hàm tỷ lệ xác suất vector tự dưng $x_t$ với hy vọng $hatx_t$, ma trận hiệp phương không nên $Sigma_t$ cùng với số chiều $D$ (trong ví dụ vẫn xét, $D=2$) là:

$$p(x_t) = frac1 Sigma_t ight extexpleft< -frac12 (x_t - hatx_t)^intercal Sigma_t^-1 (x_t - hatx_t) ight>$$

*

Lập luận theo phong cách trên lại sở hữu một ưu cố kỉnh nữa, trong vô số nhiều bài toán khoa học kỹ thuật, nhiều khi bạn cần biết xác suất xảy ra trong một vùng nào đấy, chẳng hạn:

Đôi lúc chúng ta chỉ suy nghĩ một vùng nào đó của một đại lượng, ví dụ điển hình từ $95$ đến $110$ độ C thì CPU máy tính phải tắt vì ánh nắng mặt trời vượt ngưỡng an toàn, phần trăm để nhiệt độ lâm vào hoàn cảnh vùng này là bao nhiêu nhỉ? tương tự với một tập đại lượng, bọn họ quan trọng điểm đến một vùng giá trị nào đó thật sự quan trọng trong vấn đề đang xét.Với hàm mật độ xác suất tiếp tục $p(x_t)$ chúng ta cũng có thể dể dàng tính xác suất xảy ra vào vùng $E$ bằng tích phân $int_E p(x_t) dx_t$, thật tiện lợi đúng không nào nào!

Giả định rằng tại thời điểm $t$ chiến thuyền có:

$$hatx_t = left< eginarray*20c -0.2 \ 0.1 endarray ight>$$

$$ Sigma_t = left< eginarray*20c 0.4 & 0.35 \ 0.35 và 0.6 endarray ight>$$

*

Thông tin mà chúng ta có không chỉ có có phần lớn gì bọn họ tiên lượng về nó (cách họ đoán về $x_t$). Trên chiến thuyền được gắn thêm một cảm biến đặc biệt cho phép đo trạng thái bây giờ và gửi thông tin về trụ sở.

Tuy nhiên, tuy nhiên vậy, cảm biến này lại không thiết yếu xác, bộ cảm biến cho chúng ta biết trạng thái lúc này là $y_t = left< eginarray*20c 2 \ -2 endarray ight>$

*

Trong trường vừa lòng này, chúng ta giả định rằng:$$y_t = G_t x_t + v_t $$với $v_t$ là 1 trong vector ngẫu nhiên nhiễu có phân bố chuẩn chỉnh nhiều chiều $v_t sim mathcalN(0,R_t)$, chúng ta gọi $v_t$ là nhiễu quy mô quan sát (observation noise).

Giả định trên có thể hiểu $y_t$ được xem như là “nhiễu quan giáp được tự $x_t$“, $y_t$ là hiệu quả của tổ hợp tuyến tính từng yếu tố $x_t$ dựa trên ma trận $G_t$ và bị tác động cộng thêm 1 lượng nhiễu môi trường xung quanh với vector thiên nhiên $v_t$. Fan ta gọi công thức trên là quy mô quan sát, nó thể hiện quy trình $x_t$ chuyển đổi thành $y_t$ đôi khi bị tác động nhiễu trường đoản cú môi trường.

Giờ đây, chúng ta có lòng tin của bọn họ về trạng thái chiến thuyền qua hàm mật độ xác suất $p(x_t)$ cùng một sự khiếu nại đã xẩy ra là thông tin thu được từ bỏ bộ cảm ứng - tinh thần $y_t$, liệu rằng chúng ta cũng có thể kết thích hợp cả hai thông tin đang xuất hiện thành một thông tin mới có ý nghĩa hơn, giúp bọn họ hiểu hơn về trạng thái hiện tại tại hệ thống hay không?

Biết $y_t$ vẫn giúp họ cập nhật lòng tin về $x_t$ như vậy nào? nếu bạn đang search một giải pháp như trên, có lẽ rằng định lý Bayes là một trong câu trả lời chúng ta đang tìm:

$$p(x_t | y_t) = frac x_t) p(x_t)p(y_t)$$

$p(x_t)$ hàm tỷ lệ xác suất tiên nghiệm, lòng tin của họ không dựa vào vào sự kiện $y_t$ xảy ra.$p(y_t | x_t)$ hàm mật độ xác suất khả dĩ, tỷ lệ xác suất có đk khi biết trạng thái $x_t$ xảy ra, vì bọn họ biết rằng $y_t$ là một vector ngẫu nhiên làm sao cho $y_t = G_t x_t + v_t $, lúc biết $x_t$ xảy ra nghĩa là $G_t x_t$ là 1 vector hằng, vector bất chợt $y_t$ được biểu diễn bằng một vector hằng thêm vào đó một vector ngẫu nhiên bao gồm phân bố chuẩn nhiều chiều $v_t sim mathcalN(0,R_t)$, hay nói theo một cách khác $y_t | x_t$ hiện tại tại là 1 trong những phân bố chuẩn nhiều chiều. Phân bổ $y_t | x_t sim mathcalN(G_t x_t ,R_t)$.$p(y_t)$ hàm mật độ xác suất biên không phụ thuộc vào vào $x_t$ vào vai trò như một hằng số chuẩn hóa.

Phân cha $x_t | y_t$ được tìm như thế nào? Trên gốc rễ Linear Gaussian Systems (LGS - quy mô phân bố chuẩn tuyến tính), giải thuật của định lý Bayes cho câu hỏi này như sau:

Định lý Bayes cho Linear Gaussian Systems
giả định bao gồm hai vector ngẫu nhiên $m in mathbbR^D_m$ và $n in mathbbR^D_n$ cùng với $m$ là vectơ ẩn, $n$ là vector nhiễu quan sát được từ $m$ với: $ m sim mathcalN(mu_m , Sigma_m )$ $ n | m sim mathcalN(C m + d, Sigma_n )$ phân bố hậu nghiệm $m | n$ khi biết $n$ là $m | n sim mathcalN(mu_m , Sigma_m )$ với: $ Sigma_ n = left( Sigma_m^-1 + C^intercal Sigma_n^-1 C ight)^-1$ $ mu_ n = Sigma_ n left< C^intercalSigma_n^-1(n-d) + Sigma_m^-1 mu_m ight> $ TL;DR: phần chứng minh định lý sẽ không còn được bàn sinh sống đây, trong một thời điểm nào đó nếu hoàn toàn có thể mình đang viết về các mô hình phân bố chuẩn nhiều chiều, các bạn đọc nhiệt tình có thể tham khảo thêm tài liệu lắp kèm. (Kevin p. Murphy phần 6 tài liệu <7>, Chris Bracegirdle tài liệu <6> phần hệ luận Corollary 5)

Tuy nhiên nếu tính toán trực tiếp ma trận hiệp phương không nên $Sigma_x_t $ như trên thì có lẽ rằng bạn vừa bỏ qua một vài “điều thú vị” trong đại số con đường tính khiến giải pháp của chúng ta thú vị hơn!

Trước khi giải thích ý nghĩa của nhất quán thức ma trận Woodbury trong Kalman Filter, chúng ta hãy bên nhau viết lại giải mã phân cha hậu nghiệm $x_t | y_t$ vừa tìm kiếm được, chúng ta gọi đấy là “phân cha lọc” (Filtering Distribution):

$$ x^mathttF_t sim x_t | y_t sim mathcalN(hatx^mathttF, Sigma^mathttF)$$

Với thông số kỳ vọng cùng ma trận hiệp phương không đúng của phân bố chuẩn nhiều chiều:

$colorWildStrawberrySigma^mathttF_t = left( Sigma_t^-1 + G_t^intercal R_t^-1 G_t ight)^-1 = Sigma_t - Sigma_t G_t^intercal left( R + G_t Sigma_t G_t^intercal ight)^-1 G_t Sigma_t$

$colorWildStrawberryhatx^mathttF_t = hatx_t + Sigma_t G_t^intercal left( G_t Sigma_t G_t^intercal + R_t ight)^-1 (y_t - G_t hatx_t)$

Ý nghĩa của đồng điệu thức ma trận Woodbury: trong tương đối nhiều ứng dụng theo thời hạn thực, thường thì chỉ có một số ít trạng bạn nhận được từ bộ cảm biến tại 1 thời điểm, hay có thể nói rằng số chiều của vector bỗng dưng $y_t$ vô cùng nhỏ, lúc này chi phí tìm ma trận nghịch hòn đảo của $left( R_t + G_t Sigma_t G_t^intercal ight)^-1$ kha khá nhỏ, đồng thời những ma trận khác đã bao gồm rồi, việc đo lường và tính toán còn lại chỉ cần nhân ma trận sẽ nhanh hơn tương đối nhiều so với vấn đề gốc nhân rồi tính một ma trận nghịch đảo rất lớn!

Giả định liên tục với lấy một ví dụ trên với:$$ R_t = left< eginarray*20c 0.26 và 0.2275 \ 0.2275 và 0.39 endarray ight> $$

$$ G_t = left< eginarray*20c 1 và 0 \ 0 & 1 endarray ight> $$

*

Cuối cùng bọn họ cũng phối kết hợp được hai tin tức thành một tin tức mới có lợi hơn để làm rõ về tinh thần của phi thuyển!

Ngay bây giờ chúng ta muốn dự kiến tương lai, trạng thái của phi thuyền sẽ đi đâu về đâu?

Trạng thái mới rất có thể biểu diễn dưới dạng trạng thái dịch rời và bị thêm một ít nhiễu từ tâm lý cũ:

$$x_t+1 = A_t x_t + B_t u_t + w_t$$

Với:

$A_t$: ma trận tế bào hình thay đổi trạng thái.$B_t$: ma trận mô hình điều khiễn nguồn vào (dùng nhằm kết hợp với $u_t$ từ bạn dùng).$u_t$: vector tinh chỉnh (người dùng nhập để kết phù hợp với $B_t$).$w_t$: vector ngẫu nhiên nhiễu hệ thống (system noise), tất cả phân bố chuẩn chỉnh nhiều chiều $w sim mathcalN(0, Q_t)$.

Thường thì $B_t$ với $u_t$ bị khuyết, $B_t u_t$ được xem là sửa lỗi hệ thống được thêm bởi tín đồ dùng, bài toán thêm vào cũng tương tự việc thêm 1 đại lượng không đổi vào những công thức, việc chuyển đổi với các tính chất kỳ vọng cùng hiệp phương sai không khó. Nên để gọn phần trình diễn dưới đây họ sẽ xem như $B_t u_t$ bị khuyết.

Vì vậy họ xem $x_t+1$ như là:

$$x_t+1 = A_t x_t + w_t$$

Tuy nhiên họ lại trực lưu giữ ra rằng, phần trăm tiên nghiệm của chúng ta đã được sửa chữa bằng một xác suất hậu nghiệm nhìn có vẻ phải chăng hơn, vì chưng đó họ biểu diễn $x_t+1$ dưới dạng:

$$x_t+1 = A_t x_t^mathttF + w_t$$

Vì tổng hợp tuyến tính của các phân bố chuẩn chỉnh là phân bổ chuẩn, buộc phải $x_t+1$ cũng là phân bổ chuẩn, nhưng là phân bố chuẩn nhiều chiều thì chúng ta cần tìm hai tham số, kỳ vọng với ma trận hiệp phương sai.

May mắn thay, dựa vào vào đặc thù kỳ vọng với ma trận hiệp phương sai với vector ngẫu nhiên, ta có:

$$hatx_t+1 = mathbbE left< A_t x_t^mathttF + w_t ight> = A_t mathbbE x_t^mathttF + mathbbE w_t = A_t hatx_t^mathttF $$$$Sigma_t+1 = extVar left< A_t x_t^mathttF + w_t ight> = A_t extVar left< x_t^mathttF ight> A_t^intercal + Q_t = A_t Sigma_t^mathttF A_t^intercal + Q_t $$

Đặt $colorWildStrawberry K_t = Sigma_t G_t^intercal (G_t Sigma_t G_t^intercal + R_t)^-1$ hệ số này được call là Kalman Gain, bạn cũng có thể viết phân bổ mới ở dạng gọn hơn:$$ x_t + 1 sim mathcalN(hatx_t+1, Sigma_t+1)$$

Viết gọn gàng lại:

$colorWildStrawberry hatx_t+1 = A_t colorViolet hatx_t^mathttF colorWildStrawberry = A_t colorViolet left( hatx_t + K_t (y_t - G_t hatx_t ) ight)$$colorWildStrawberry Sigma_t+1 = A_t colorViolet Sigma_t^mathttF colorWildStrawberry A_t^intercal + Q_t = A_t colorViolet (mathbfI - K_t G_t) Sigma_t colorWildStrawberry A_t^intercal + Q_t $

(với $mathbfI$ là ma trận 1-1 vị)

Giả định rằng ta có:

$$ A_t = left< eginarray*20c 1.25 và 0 \ 0 & -0.4 endarray ight> $$

$$ Q_t = left< eginarray*20c 0.12 & 0.105 \ 0.105 và 0.18 endarray ight> $$

Chúng ta có phân bố dự đoán tương lai như sau:

*

2. Tổng kết và thủ tục đệ quy:

*

Kalman Filter sẽ tiến hành thủ tục đệ quy như bao gồm 2 giấy tờ thủ tục “đo lường” và “dự đoán”:

Thủ tục cập nhật đo lường (Measurement):

Tính Kalman Gain: $colorWildStrawberry K_t = Sigma_t G_t^intercal (G_t Sigma_t G_t^intercal + R_t)^-1$Cập nhật trạng thái lúc này thành phân bố lọc: $ colorWildStrawberry hatx_t := hatx_t^mathttF $ cùng với $ hatx_t^mathttF = hatx_t + K_t (y_t - G_t hatx_t ) $ $colorWildStrawberry Sigma_t := Sigma_t^mathttF $ cùng với $Sigma_t^mathttF = (mathbfI - K_t G_t) Sigma_t $ (với $mathbfI$ là ma trận đơn vị)

Dự đoán tương lai (Prediction):

Cập nhật tâm lý tương lai: $colorWildStrawberry hatx_t+1 = A_t hatx_t + B_t u_t$ (trong các hệ điều khiển đơn giản $B_t u_t$ khuyết)Cập nhập ma trận hiệp phương sai: $colorWildStrawberry Sigma_t+1 = A_t Sigma_t A_t^intercal + Q_t$

*

3. Thiết lập thuật toán với những vấn đề tính toán

Chi phí thống kê giám sát của thuật toán đa số đến từ các việc nhân với lấy ma trận nghịch đảo, như đã trình diễn ở trên trường hợp như vector hốt nhiên quan ngay cạnh được $y_t$ bao gồm số chiều nhỏ tuổi hơn nhiều so với $x_t$ bạn cũng có thể tính toán bởi khai triển ma trận nghịch hòn đảo như trên để đo lường hiệu quả.

Việc tùy chỉnh cấu hình ma trận $A_t$, $Q_t$, $G_t$, $R_t$ thường là do kỹ sư thiết lập dựa trên đọc biết về dữ liệu của bản thân mình (các đại lượng thứ lý, kinh tế,… thường có mối quan hệ mật thiết với nhau). Mặc dù có siêu nhiều phương thức học tham số cho quy mô Kalman Filter mà các bạn đọc rất có thể tự bài viết liên quan (trong xã hội lý thuyết điều khiển thì vụ việc này được biết đến như systems identification, hay cách đơn giản và dễ dàng nhất là bạn sẽ thu thập dữ liệu, thi công hàm mất mát và giải bài toán bình phương buổi tối tiểu).

Nếu chú ý kĩ bạn sẽ thấy ma trận hiệp phương không nên $Sigma_t+1$ chỉ nhờ vào vào $Sigma_t$ không nhờ vào vào sự khiếu nại quan gần kề được trả về từ bỏ bộ cảm biến $y_t$, trong một số trường hợp đặc biệt, chúng ta cũng có thể tính toán ma trận này trước khi $y_t$ xuất hiện, việc này đòi hỏi bạn cần hiểu về việc hội tụ của ma trận $Sigma_t$ xảy ra như thế nào (bạn hiểu quan tâm tham khảo thêm về Ricatti equations).

Trong gần như ứng dụng thương mại lớn, Kalman Filter được thiết kế với “tương đối phức tạp” vày tính ổn định giám sát và đo lường số, thời gian chạy,… Nếu để ý đến những vụ việc này, các bạn đọc hoàn toàn có thể truy cập vào kho tài liệu béo phệ về Kalman Filter ở đây: http://www.cs.unc.edu/~welch/kalman/

Hiện tại có nhiều thư viện setup Kalman Filter sẳn như OpenCV (C/C++, Python), filterpy (Python), Matlab.

Xem thêm: Người Mẫu Trương Nam Thành Sinh Năm Bao Nhiêu, Người Mẫu Trương Nam Thành

Dưới đây là một bài mô phỏng đơn giản dễ dàng trên phân bố chuẩn 1 chiều dựa vào ví dụ của Greg Welch với Gary Bishop, mang sử có một nguồn tích điện với hiệu điện cụ không thay đổi theo thời hạn (cho hài lòng là vậy nhé, tức thị $x = 0.28$ volts mãi luôn). Chúng ta thực sự chần chờ giá trị hiệu điện ráng của điện áp nguồn này đâu, chúng ta quyết định đi kiếm giá trị này như một thú vui lúc rảnh rỗi. Như ý thay, bạn tìm kiếm được một chiếc vôn kế đời cũ không bao gồm xác. Cực kỳ may là bên sản xuất bao gồm để lại thông tin, vôn kế này bị nhiễu theo phân bổ $mathcalN(0, 0.01)$. Biết rằng mỗi lần đo kế tiếp, hiệu điện nuốm không đổi gì nhiều (thiết lập ma trận chuyển trạng thái $A$), quy mô quan tiếp giáp của được đo tự vôn kế bằng giá trị thực tế cộng thêm nhiễu (giả định ma trận $G$). Ko rõ độ lệch chuẩn chỉnh của nguồn điện áp phóng ra lúc sử dụng bình thường là bao nhiêu, các bạn tạm đoán là $1$ volt (thiết lập ma trận $Sigma$), tại thời điểm ban đầu chưa biết bạn đoán nguồn tích điện $0.5$ volt (thiết lập $hatx$).

Trong ví dụ này, bản thân sẽ thiết đặt phần mô rộp nhìn hơi dỏm một tí (vì đó là phân bố chuẩn 1 chiều không bắt buộc phải setup rườm soát như vậy, hơn nữa việc đưa lập $y$ rất có thể tạo luôn một lần thay vì chưng gọi từng lần). Tuy nhiên mình mong ước mã mối cung cấp này hoàn toàn có thể phản ánh được câu chữ trong bài viết, do thế họ cùng demo nhé:

# _______________________________________________________________________# |<> diyxaqaw.comShell |X>|!"|# |"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""|"|# | > diyxaqaw.com | |# | > ENV: Python 3.7.0 Anaconda | |# | > Kalman Filter (ví dụ đơn giản) | |# |_____________________________________________________________________|/import numpy as npimport matplotlib.pyplot as pltfrom matplotlib import stylestyle.use("bmh")def simulate_volts(x, G, R): """ Hàm lấy cực hiếm quan tiếp giáp y từ quy mô quan ngay cạnh y = Gx + v (với v là vector bất chợt v ~ N(0,R)) :param x: numpy.array - vector thực tiễn x :param G: ma trận quy mô quan gần cạnh :param R: ma trận hiệp phương không nên nhiễu quan cạnh bên :return y: numpy.array - vector đột nhiên quan gần kề được """ return G