KALMAN FILTER LÀ GÌ
Bạn đang xem: Kalman filter là gì

Nếu là một trong 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 nghĩa là đo rồi tinh chỉnh những gì mình đo được. Đo lường chính xác nhường nào, hệ thống điều khiển càng vận động ổn định nhường nhịn nấy.
Hãy xoay ngược thời gian về trong thời điểm 1960 với hầu như khó khăn của những kỹ sư xây đắp phi thuyền Apollo trong cách xử trí tín hiệu. Dữ liệu thô đo được từ trang bị tính, được đo tự các cảm biến như nhỏ quay hồi chuyển, vận tốc kế, tài liệu rađa vốn dĩ đầy nhiễu, đầy lỗi ngẫu nhiên và đặc biệt quan trọng lộn xộn không chủ yếu xác. Lúc lao về phương diện trăng ở tốc độ cao, ai mà chắc chắn rằng rằng điều gì sẽ xảy ra với những gì bạn điều khiển, các bạn sẽ không mong mỏi Apollo lao thẳng vào nhà mình đâu!
Kalman Filter là 1 trong công cụ mạnh khỏe mẽ kết hợp thông tin không chắc chắn ở thời điểm này cùng với thông tin đầy nhiễu loàn của môi trường xung quanh sang một dạng thông tin mới an toàn và tin cậy hơn để phục vụ dự đoán tương lai. Điểm mạnh của Kalman Filter là chạy rất nhanh và tính ổn định cao.
Một trong những ứng dụng đầu 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 tốc độ was under 100 kHz <…>. The fact that the MIT engineers were able to 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 vày Matthew Reed, TRS-80.org (2009)
1. Ý tưởng cơ bản thuật toán
Thuật toán có tương đối nhiều ứng dụng vào những bài toán khác nhau. Mặc dù để dể hình dung, bây giờ chúng ta hãy tưởng tượng mình là một trong những nhà trí tuệ sáng tạo phi thuyền Thetalo (một phiên bản lỗi trường đoản cú Apollo).
Phi thuyền sẽ gửi về tin tức trạng thái sau mỗi khoảng thời hạn nhất định trải qua bộ cảm biến, trách nhiệm của bọn họ là dự đoán trạng thái trên con thuyền để giao 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 điểm và tốc độ hiện tại của phi thuyền. Trên mỗi thời điểm $t$, bạn không thể có thông tin đúng đắn về $mathbfx_t$.
Vì sao vậy? Hệ mà chúng ta điều khiển không bên trong một môi trường thiên nhiên lý tưởng, nhiều ảnh hưởng tác động từ môi trường xung quanh xung xung quanh mà chúng ta không dự đoán ở sẽ ảnh hưởng những thống kê giám sát ban đầu.
Biết đâu được một cơn gió vô tình, một cơn mưa ngang qua, một trận sấm sét cuồng phong sẽ làm mọi đo lường sai lầm. Trực cảm mang lại ta thấy nó đang chỗ nào đó trong không khí này, tại một trong những vùng nào đó kỹ năng xảy ra cao hơn, tại một số vùng làm sao đó khả năng xảy ra tốt hơn. Phân bố tỷ lệ như một phiên bản đồ về việc chắc chắn, một tinh thần về đa số sự khiếu nại 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ể chọn lựa cho mình một niềm tin, trong mô hình Kalman Filter phân bố tỷ lệ được chọn là phân bố chuẩn nhiều chiều. Bởi vì chọn phân bố chuẩn chỉnh nhiều chiều là vì đây là phân tía liên tục tương xứng bài toán đã xét, một vài tính chất quan trọng đặc biệt của phân bố chuẩn nhiều chiều thuận tiện cho tác vụ cầu lượng tham số.
Tại mỗi thời điểm $t$, trả định vector tự dưng $x_t$ gồm phân bố chuẩn chỉnh nhiều chiều tốt $x_t sim mathcalN(hatx_t, Sigma_t )$ với $hatx_t$ là mong muốn của $x_t$, $Sigma_t$ là ma trận hiệp phương không nên với mỗi thành phần tại sản phẩm $i$ cột $j$ mô tả độ phát triển thành thiên cùng cả nhà của nhì biến tình cờ thứ $i$ và $j$. Công thức tổng thể của hàm mật độ xác suất vector hốt nhiên $x_t$ với kỳ vọng $hatx_t$, ma trận hiệp phương không đúng $Sigma_t$ cùng với số chiều $D$ (trong ví dụ đã xét, $D=2$) là:
$$p(x_t) = frac1left( 2 pi ight)^D/2 left 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 có một ưu nạm nữa, trong vô số nhiều bài toán kỹ thuật kỹ thuật, nhiều khi bạn nên biết xác suất xẩy ra trong một vùng như thế nào đấy, chẳng hạn:
Đôi lúc bọn họ chỉ để ý đến một vùng nào đó của một đại lượng, ví dụ điển hình từ $95$ mang lại $110$ độ C thì CPU laptop phải tắt vì ánh nắng mặt trời vượt ngưỡng an toàn, phần trăm để sức nóng độ rơi vào tình thế vùng này là bao nhiêu nhỉ? tựa như với một tập đại lượng, họ quan trung tâm đến một vùng giá trị nào đó thật sự quan trọng đặc biệt trong bài toán đang xét.Với hàm tỷ lệ xác suất liên tiếp $p(x_t)$ chúng ta cũng có thể dể dàng tính tỷ lệ xảy ra trong vùng $E$ bởi tích phân $int_E p(x_t) dx_t$, thật nhân tiện lợi đúng không ạ nào!Giả định rằng tại thời điểm $t$ phi thuyền có:
$$hatx_t = left< eginarray*20c -0.2 \ 0.1 endarray ight>$$
$$ Sigma_t = left< eginarray*20c 0.4 và 0.35 \ 0.35 & 0.6 endarray ight>$$

Thông tin mà bọn họ có không chỉ 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 phi thuyền được lắp một cảm ứng đặc biệt chất nhận được đo trạng thái bây giờ và gửi tin tức về trụ sở.
Tuy nhiên, tuy vậy vậy, cảm biến này lại không chính xác, bộ cảm biến cho bọn họ biết trạng thái bây giờ là $y_t = left< eginarray*20c 2 \ -2 endarray ight>$

Trong trường đúng theo này, bọn họ giả định rằng:$$y_t = G_t x_t + v_t $$với $v_t$ là một trong vector bỗng dưng nhiễu có phân bố chuẩn nhiều chiều $v_t sim mathcalN(0,R_t)$, bọn họ gọi $v_t$ là nhiễu mô hình quan giáp (observation noise).
Xem thêm: Có Nên Làm Nhân Viên Kinh Doanh Bất Đông Sản Làm Gì ? Lương Nhiều Không?
Giả định trên rất có thể hiểu $y_t$ được xem như là “nhiễu quan tiếp giáp được từ bỏ $x_t$“, $y_t$ là kết quả của tổng hợp tuyến tính từng thành phần $x_t$ dựa trên ma trận $G_t$ cùng bị ảnh hưởng cộng thêm một lượng nhiễu môi trường xung quanh với vector bất chợt $v_t$. Bạn ta gọi cách làm trên là mô hình quan sát, nó thể hiện quá trình $x_t$ biến đổi thành $y_t$ đồng thời bị tác động nhiễu từ môi trường.
Giờ đây, bọn họ có tinh thần của bọn họ về trạng thái phi thuyền qua hàm mật độ xác suất $p(x_t)$ với một sự kiện đã xảy ra là thông tin thu được tự bộ cảm biến - trạng thái $y_t$, liệu rằng bạn cũng có thể kết thích hợp cả nhị thông tin đang có thành một thông tin mới có ý nghĩa hơn, giúp bọn họ hiểu rộng về trạng thái hiện tại tại khối hệ thống hay không?
Biết $y_t$ đã giúp họ cập nhật tinh thần về $x_t$ như thế nào? nếu khách hàng đang search một phương án như trên, có lẽ định lý Bayes là 1 câu trả lời bọn họ đang tìm:
$$p(x_t | y_t) = fracp(y_t p(y_t)$$
$p(x_t)$ hàm tỷ lệ xác suất tiên nghiệm, ý thức của bọn họ không dựa vào vào sự khiếu nại $y_t$ xảy ra.$p(y_t | x_t)$ hàm tỷ lệ xác suất khả dĩ, mật độ xác suất có điều kiện khi biết trạng thái $x_t$ xảy ra, vì bọn họ biết rằng $y_t$ là 1 trong vector ngẫu nhiên 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à một trong những vector hằng, vector tự nhiên $y_t$ được màn biểu diễn bằng một vector hằng thêm vào đó một vector ngẫu nhiên 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 phân bố chuẩn chỉnh nhiều chiều. Phân bố $y_t | x_t sim mathcalN(G_t x_t ,R_t)$.$p(y_t)$ hàm tỷ lệ xác suất biên không nhờ vào vào $x_t$ đóng vai trò như 1 hằng số chuẩn chỉnh hóa.Phân tía $x_t | y_t$ được tìm như vậy nào? Trên căn cơ Linear Gaussian Systems (LGS - quy mô phân bố chuẩn tuyến tính), lời giải của định lý Bayes cho việc này như sau:
trả định tất cả hai vector hốt nhiên $m in mathbbR^D_m$ cùng $n in mathbbR^D_n$ cùng với $m$ là vectơ ẩn, $n$ là vector nhiễu quan ngay cạnh đượ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$ lúc biết $n$ là $m | n sim mathcalN(mu_m , Sigma_ n)$ với: $ Sigma_ n = left( Sigma_m^-1 + C^intercal Sigma_n^-1 C ight)^-1$ $ mu_m = 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 rất có thể mình sẽ viết về các mô hình phân bố chuẩn chỉnh nhiều chiều, bạn đọc thân thương có thể xem thêm tài liệu lắp kèm. (Kevin p. Murphy phần 6 tư 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 đúng $Sigma_ y_t$ như bên trên thì có lẽ rằng bạn vừa bỏ qua 1 vài “điều thú vị” trong đại số đường tính khiến chiến thuật của họ thú vị hơn!
Trước khi giải thích ý nghĩa sâu sắc của đồng hóa thức ma trận Woodbury vào Kalman Filter, chúng ta hãy cùng cả nhà viết lại lời giải phân bố hậu nghiệm $x_t | y_t$ vừa search được, bọn họ gọi đấy là “phân bố 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 với ma trận hiệp phương không nên 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 bộ thức ma trận Woodbury: trong nhiều ứng dụng theo thời gian thực, thường thì chỉ có một trong những ít trạng bạn nhận được từ bộ cảm biến tại 1 thời điểm, hay nói theo cách khác số chiều của vector bất chợt $y_t$ rất nhỏ, từ bây giờ 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ông giống đã có rồi, việc giám sát và đo lường còn lại chỉ cần nhân ma trận sẽ nhanh hơn rất nhiều so với việc gốc nhân rồi tính một ma trận nghịch đảo rất lớn!
Giả định tiếp 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 & 0.39 endarray ight> $$
$$ G_t = left< eginarray*20c 1 và 0 \ 0 và 1 endarray ight> $$

Cuối cùng chúng ta cũng kết hợp được hai tin tức thành một thông tin mới hữu dụng hơn để hiểu rõ về tâm trạng của phi thuyển!
Ngay hiện nay chúng ta muốn dự kiến tương lai, tâm lý của chiến thuyền sẽ đi đâu về đâu?
Trạng thái mới hoàn toàn có thể biểu diễn bên dưới dạng trạng thái dịch rời và bị thêm một ít nhiễu từ tinh thần cũ:
$$x_t+1 = A_t x_t + B_t u_t + w_t$$
Với:
$A_t$: ma trận mô 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 để kết hợp với $u_t$ từ người dùng).$u_t$: vector tinh chỉnh (người dùng nhập nhằm kết phù hợp với $B_t$).$w_t$: vector thốt nhiên nhiễu hệ thống (system noise), có phân bố chuẩn chỉnh nhiều chiều $w sim mathcalN(0, Q_t)$.Thường thì $B_t$ và $u_t$ bị khuyết, $B_t u_t$ được xem là sửa lỗi khối hệ thống được thêm bởi tín đồ dùng, việc thêm vào tương tự như 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 và hiệp phương không nên không khó. đề xuất để gọn phần trình bày dưới đây họ sẽ xem như $B_t u_t$ bị khuyết.
Vì vậy bọn họ xem $x_t+1$ như là:
$$x_t+1 = A_t x_t + w_t$$
Tuy nhiên bọn họ lại trực ghi nhớ ra rằng, xác suất tiên nghiệm của bọn họ đã được sửa chữa thay thế bằng một xác suất hậu nghiệm nhìn tất cả vẻ hợp lý và phải chăng hơn, do đó họ biểu diễn $x_t+1$ bên dưới dạng:
$$x_t+1 = A_t x_t^mathttF + w_t$$
Vì tổ hợp tuyến tính của những phân bố chuẩn chỉnh là phân bổ chuẩn, cần $x_t+1$ cũng là phân bố chuẩn, cơ mà là phân bố chuẩn nhiều chiều thì bọn họ cần tìm nhị tham số, kỳ vọng và ma trận hiệp phương sai.
May mắn thay, nhờ vào tính chất kỳ vọng cùng ma trận hiệp phương không đúng 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$ thông số này được gọi là Kalman Gain, chúng ta cũng có thể viết phân bổ mới nghỉ ngơi dạng gọn hơn:$$ x_t + 1 sim mathcalN(hatx_t+1, Sigma_t+1)$$
Viết gọn 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 solo vị)
Giả định rằng ta có:
$$ A_t = left< eginarray*20c 1.25 & 0 \ 0 & -0.4 endarray ight> $$
$$ Q_t = left< eginarray*20c 0.12 & 0.105 \ 0.105 & 0.18 endarray ight> $$
Chúng ta tất cả phân bố dự kiến tương lai như sau:

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

Kalman Filter sẽ thực hiện thủ tục đệ quy như gồm 2 thủ tục “đo lường” và “dự đoán”:
Thủ tục update đ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 $ với $Sigma_t^mathttF = (mathbfI - K_t G_t) Sigma_t $ (với $mathbfI$ là ma trận đối chọi vị)Dự đoán sau này (Prediction):
Cập nhật tâm trạng tương lai: $colorWildStrawberry hatx_t+1 = A_t hatx_t + B_t u_t$ (trong những hệ điều khiển đơn giản và dễ dàng $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$

Chi phí đo lường và tính toán của thuật toán đa số đến từ các việc nhân cùng lấy ma trận nghịch đảo, như đã trình diễn ở trên ví như như vector hốt nhiên quan cạnh bên được $y_t$ gồm số chiều bé dại hơn các so với $x_t$ chúng ta có thể tính toán bởi khai triển ma trận nghịch hòn đảo như trên để thống kê giám sát hiệu quả.
Việc thiết lập cấu hình ma trận $A_t$, $Q_t$, $G_t$, $R_t$ thường là vì kỹ sư thiết lập cấu hình dựa trên phát âm biết về dữ liệu của bản thân mình (các đại lượng đồ lý, kinh tế,… hay có mối quan hệ mật thiết với nhau). Tuy nhiên có siêu nhiều cách thức học thông số cho mô hình Kalman Filter mà các bạn đọc rất có thể tự tham khảo thêm (trong xã hội lý thuyết tinh chỉnh và điều khiển thì sự việc này được nghe biết như systems identification, hay cách đơn giản dễ dàng nhất là các bạn sẽ thu thập dữ liệu, thành lập hàm mất mát cùng giải bài toán bình phương về tối tiểu).
Nếu chăm chú kĩ bạn sẽ thấy ma trận hiệp phương không nên $Sigma_t+1$ chỉ phụ thuộc vào $Sigma_t$ không phụ thuộc vào vào sự kiện quan liền kề được trả về tự bộ cảm ứng $y_t$, trong một số trong những trường hợp đặc biệt, bạn 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ề sự việc hội tụ của ma trận $Sigma_t$ xảy ra như thế nào (bạn đọc quan tâm xem thêm về Ricatti equations).
Trong những ứng dụng thương mại dịch vụ lớn, Kalman Filter có thiết kế “tương đối phức tạp” vày tính ổn định giám sát và đo lường số, thời hạn chạy,… Nếu để ý đến những vấn đề này, bạn đọc hoàn toàn có thể truy cập vào kho tài liệu đồ sộ về Kalman Filter nghỉ ngơi đây: http://www.cs.unc.edu/~welch/kalman/
Hiện tại có khá nhiều thư viện setup Kalman Filter sẳn như OpenCV (C/C++, Python), filterpy (Python), Matlab.
Xem thêm: Đặng Lê Nguyên Vũ Tiểu Sử - Chi Tiết Tiểu Sử “Vua Cà Phê” Đặng Lê Nguyên Vũ
Dưới đây là một bài xích 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ử gồm một nguồn điện áp với hiệu điện cụ không biến hóa theo thời gian (cho hài lòng là vậy nhé, nghĩa là $x = 0.28$ volts mãi luôn). Các bạn thực sự phân vân giá trị hiệu điện núm của nguồn tích điện này đâu, các bạn quyết định đi tìm kiếm giá trị này như một điều vui lúc nhàn rỗi rỗi. May mắn thay, bạn tìm kiếm được một loại vôn kế đời cũ không chủ yếu xác. Khôn xiết may là công ty sản xuất có để 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 thế không thay đổi gì nhiều (thiết lập ma trận đưa trạng thái $A$), mô hình quan sát của được đo tự vôn kế bằng giá trị thực tiễn cộng thêm nhiễu (giả định ma trận $G$). Không rõ độ lệch chuẩn chỉnh của nguồn tích điện phóng ra lúc sử dụng thông thường là bao nhiêu, chúng ta tạm đoán là $1$ volt (thiết lập ma trận $Sigma$), tại thời điểm lúc đầu chưa biết các bạn đoán điện áp nguồn $0.5$ volt (thiết lập $hatx$).
Trong lấy một 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ì đấy là phân bố chuẩn chỉnh 1 chiều không đề nghị phải thiết đặt rườm rà soát như vậy, hơn nữa việc trả lập $y$ hoàn toàn có thể tạo luôn một lần thay vày gọi từng lần). Tuy nhiên mình ước muốn mã nguồn này hoàn toàn có thể phản ánh được văn bản trong bài bác viết, vị thế họ cùng test nhé:
# _______________________________________________________________________# |<> 90namdangbothanhhoa.vnShell |X>|!"|# |"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""|"|# | > 90namdangbothanhhoa.vn | |# | > ENV: Python 3.7.0 Anaconda | |# | > Kalman Filter (ví dụ đối kháng 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 cạnh bên y từ quy mô quan liền kề y = Gx + v (với v là vector bất chợt v ~ N(0,R)) :param x: numpy.array - vector thực tế x :param G: ma trận quy mô quan ngay cạnh :param R: ma trận hiệp phương không nên nhiễu quan liền kề :return y: numpy.array - vector thốt nhiên quan gần kề được """ return G