فیلتر کالمن چیست؟ چگونه داده های پر سر و صدا را در ناوبری و امور مالی ساده کنیم
در دنیایی که دقت امری کلیدی است، مدیریت موثر داده های پر سر و صدا برای حل مشکلات پیچیده بسیار مهم است.
چه بخواهید یک موشک را کنترل کنید یا بازار سهام را پیش بینی کنید، توانایی به دست آوردن داده های خوب از یک محیط نامشخص مهم است.
این دقیقاً همان مشکلی است که فیلترهای کالمن به حل آن کمک می کنند. فیلترهای کالمن راه حلی را ارائه می دهند که به شما کمک می کند با داده های نویز در بسیاری از زمینه ها مقابله کنید.
در این مقاله به بحث خواهیم پرداخت:
رانندگی در مه: کالمن به عنوان چراغ های جلو شما فیلتر می شود
فیلترهای کالمن در عمل: نمونه کد گام به گام
نتیجه گیری: پیمایش داده های غیرخطی با تکنیک های پیشرفته
رانندگی در مه: کالمن به عنوان چراغ های جلو شما فیلتر می شود
تصور کنید در حال رانندگی در مه غلیظ با دید محدود هستید.
برای رسیدن به مقصد، به حواس خود و سیستم ناوبری ماشین خود تکیه می کنید که داده های زمان واقعی را با یک نقشه از پیش تعیین شده ترکیب می کند.
در حین حرکت، سیستم ناوبری خودرو همیشه برای رسیدن به مقصد در حال تنظیم است و شما همیشه به حواس خود متکی هستید تا ماشین را به خوبی هدایت کنید.
این فرآیند بسیار شبیه به نحوه عملکرد فیلتر کالمن است.
دائماً در حال به روز رسانی است و برآوردها را بر اساس داده های دریافتی اصلاح می کند. حتی اگر این داده ها پر از نویز و عدم قطعیت باشد.
با ادغام اطلاعات گذشته با اطلاعات فعلی، یک فیلتر Kalman تصویر واضحی از جایی که هستید و به کجا میروید به شما میدهد.
فیلترهای کالمن چیست؟
فیلتر کالمن یک الگوریتم ریاضی است که برای یافتن وضعیت یک سیستم پویا از اندازهگیریهای پر سر و صدا استفاده میشود.
اغلب برای سیستم هایی استفاده می شود که در طول زمان تغییر می کنند - مانند ردیابی موقعیت یک جسم متحرک.
فیلتر کالمن چگونه کار می کند؟
فیلتر Kalman وضعیت فعلی شما را بر اساس داده های گذشته، مانند نقشه و مکان قبلی شما، پیش بینی می کند.
هنگامی که داده های جدید ظاهر می شوند، مانند سیگنال های جدید GPS، فیلتر داده های جدید را با پیش بینی خود مقایسه می کند و تخمین خود را تنظیم می کند.
حتی اگر داده ها دارای نویز باشند، فیلتر Kalman از یک فرآیند میانگین گیری هوشمند برای بهبود تخمین استفاده می کند. مانند نحوه تعادل بین آنچه سیستم ناوبری به شما می گوید و آنچه در جاده می بینید.
با ادغام همیشه داده های جدید با داده های گذشته، فیلترهای Kalman به شما کمک می کند تا بدانید کجا هستید و به کجا می روید. به این ترتیب حتی در شرایط نامطمئن نیز می توان موارد را پیش بینی کرد.
چرا از فیلترهای کالمن در مهندسی استفاده می شود؟
از آنجایی که فیلترهای کالمن قادر به مدیریت داده های ناقص هستند، به طور گسترده ای برای پیش بینی های خوب حتی زمانی که اندازه گیری ها قطعی نیست استفاده می شود.
این باعث می شود آنها برای موارد زیر بسیار مفید باشند:
سیستم های ناوبری : تخمین موقعیت و سرعت وسایل نقلیه.
رباتیک : کمک به ربات ها برای درک محیط و موقعیت خود.
امور مالی : فیلتر کردن نویز از داده های قیمت سهام برای پیش بینی روند.
به این ترتیب، آنها بسیار سازگار هستند و می توانند اطلاعات بلادرنگ را پردازش کنند
فیلتر کالمن چه مشکلی را حل کرد؟
فیلترهای کالمن توسط رودولف کالمن در اوایل دهه 1960 برای حل مشکل مدیریت عدم قطعیت و نویز در داده ها توسعه یافت.
امروزه آنها برای استخراج اطلاعات معنی دار از داده های پر سر و صدا عالی هستند.
از نظر ریاضی، فیلترهای کالمن را برآوردگرهای درجه دوم خطی می نامند.
زیرا در فرآیند تخمین آینده بر اساس داده های فعلی و گذشته، فیلترهای کالمن از موارد زیر استفاده می کنند:
جبر خطی: مطالعه بردارها و ماتریس های مورد استفاده برای حل معادلات خطی.
بهینهسازی درجه دوم: یافتن راهحل بهینه برای مسائل با عبارت مربع
فیلترهای کالمن در عمل: آموزش گام به گام کد
فیلترهای کالمن برای مدیریت سیستم های خطی ایجاد شده اند - یعنی سیستم هایی که از الگوهای قابل پیش بینی پیروی می کنند.
در این مثال کد، یک Extended Kalman Filter را پیاده سازی می کنیم. این گونهای است که برای مدیریت دادههای غیرخطی (به عبارت دیگر، سیستمهایی که الگوهای غیرقابل پیشبینی یا متغیری دارند) ایجاد شده است.
این کد کامل است (که در زیر به آن می پردازیم):
import numpy as np from filterpy.kalman import ExtendedKalmanFilter as EKF from filterpy.common import Q_discrete_white_noise def fx(x, dt): """ State transition function for the nonlinear system. """ # Example: x' = [x[0] + x[1]*dt, x[1]] F = np.array([x[0] + x[1]*dt, x[1]]) return F def hx(x): """ Measurement function for the nonlinear system. """ # Example: z = [x[0]] return np.array([x[0]]) def jacobian_F(x, dt): """ Jacobian of the state transition function. """ return np.array([[1, dt], [0, 1]]) def jacobian_H(x): """ Jacobian of the measurement function. """ return np.array([[1, 0]]) # Initialize EKF ekf = EKF(dim_x=2, dim_z=1) # Initial state ekf.x = np.array([0, 1]) # Initial state covariance ekf.P = np.eye(2) # Process noise covariance ekf.Q = Q_discrete_white_noise(dim=2, dt=1, var=0.1) # Measurement noise covariance ekf.R = np.array([[0.1]]) # Define the state transition and measurement functions ekf.F = jacobian_F ekf.H = jacobian_H # Control input dt = 1.0 # time step # Simulated measurements measurements = [1, 2, 3, 4, 5] for z in measurements: # Predict step ekf.predict_update(z, HJacobian=jacobian_H, Hx=hx, Fx=fx, args=(dt,), hx_args=()) # Print the current state estimate print("Estimated state:", ekf.x)
بیایید بلوک به بلوک کد را ببینیم.
واردات کتابخانه ها
import numpy as np from filterpy.kalman import ExtendedKalmanFilter as EKF from filterpy.common import Q_discrete_white_noise
در این قسمت از کد، کتابخانه های پایتون مورد نیاز خود را وارد می کنیم:
import numpy as np
: این ابزار ابزاری به نام NumPy را وارد میکند که به ما کمک میکند با اعداد و فهرست های اعداد (مانند صفحهگسترده) کار کنیم.
from filterpy .kalman import ExtendedKalmanFilter as EKF
: این ابزار ابزاری به نام ExtendedKalmanFilter
را از کتابخانه filterpy
وارد می کند. ما از این ابزار که در اینجا EKF
نام دارد، برای ردیابی چیزهایی که در طول زمان تغییر میکنند، استفاده میکنیم، به روشی که ساده نیست.
from filterpy .common import Q_discrete_white_noise
: این تابعی را وارد میکند که به ما کمک میکند نویز را تنظیم کنیم، که مانند "فازی" یا عدم قطعیت طبیعی در سیستم ما است.
نحوه عملکرد سیستم را تعریف کنید
def fx(x, dt): """ State transition function for the nonlinear system. """ # Example: x' = [x[0] + x[1]*dt, x[1]] return np.array([x[0] + x[1]*dt, x[1]]) def hx(x): """ Measurement function for the nonlinear system. """ # Example: z = [x[0]] return np.array([x[0]])
در این کد نحوه عملکرد سیستم را تعریف می کنیم:
fx(x, dt)
: این تابع نحوه تغییر سیستم ما در طول زمان را توضیح می دهد. می گوید موقعیت جدید موقعیت قدیمی به اضافه زمان سرعت است ( x[0] + x[1]*dt
). سرعت ( x[1]
) ثابت می ماند.
hx(x)
: این تابع به ما می گوید که چه چیزی را می توانیم از سیستم اندازه گیری کنیم. در اینجا، می گوید ما می توانیم موقعیت ( x[0]
) را اندازه گیری کنیم.
تعریف کنید که تغییرات چگونه بر سیستم تأثیر می گذارد
def jacobian_F(x, dt): """ Jacobian of the state transition function. """ return np.array([[1, dt], [0, 1]]) def jacobian_H(x): """ Jacobian of the measurement function. """ return np.array([[1, 0]])
در این کد نحوه تأثیر تغییرات بر سیستم را تعریف می کنیم:
jacobian_F(x, dt)
: این تابع به ما نشان می دهد که چقدر سیستم نسبت به تغییرات زمان و موقعیت حساس است. این به فیلتر کمک می کند تا با در نظر گرفتن این حساسیت ها، تغییرات را با دقت بیشتری پیش بینی کند.
jacobian_H(x)
: این تابع به ما می گوید که اندازه گیری ما چقدر نسبت به تغییرات موقعیت حساس است. این به فیلتر کمک می کند تا پیش بینی را بر اساس اندازه گیری های جدید تنظیم کند.
فیلتر کالمن را تنظیم کنید
# Initialize EKF ekf = EKF(dim_x=2, dim_z=1) # Initial state ekf.x = np.array([0, 1]) print("Initial state:", ekf.x) # Initial state covariance ekf.P = np.eye(2) print("Initial state covariance:\n", ekf.P)
در این قسمت از کد یک فیلتر کالمن بسیار ساده ایجاد می کنیم:
ekf = EKF(dim_x=2, dim_z=1)
: این یک فیلتر کالمن توسعه یافته ایجاد می کند که دو چیز (موقعیت و سرعت) و یک اندازه گیری (موقعیت) را ردیابی می کند.
ekf.x = np.array([0, 1])
: این حالت شروع را روی 0
و سرعت را روی 1
تنظیم می کند.
چاپ می کند:
Initial state: [0 1]
ekf.P = np.eye(2)
: این راهی است که می گوییم ما در مورد حدس های اولیه خود مطمئن نیستیم. مثل این است که بگوییم «از اینجا شروع کنیم، اما آماده تغییرات هستیم».
چاپ می کند:
Initial state covariance: [[1. 0.] [0. 1.]]
عدم قطعیت در سیستم را شرح دهید
# Process noise covariance ekf.Q = Q_discrete_white_noise(dim=2, dt=1, var=0.1) print("Process noise covariance:\n", ekf.Q) # Measurement noise covariance ekf.R = np.array([[0.1]]) print("Measurement noise covariance:\n", ekf.R)
ekf.Q = Q_discrete_white_noise(dim=2, dt=1, var=0.1)
: این مقدار تصادفی یا غیرقابل پیش بینی بودن ما در خود سیستم را تعیین می کند. مثل این است که بگوییم "شاید ممکن است دقیقاً آنطور که فکر می کنیم حرکت نکنند."
چاپ می کند:
Process noise covariance: [[0.025 0.05 ] [0.05 0.1 ]]
ekf.R = np.array([[0.1]])
: این تنظیم میکند که چقدر به اندازهگیریهای خود اعتماد داریم. تعداد کمتر به این معنی است که ما بیشتر به آنها اعتماد داریم.
Measurement noise covariance: [[0.1]]
شبیه سازی داده ها و حالت اولیه
# Control input dt = 1.0 # time step # Simulated measurements measurements = [1, 2, 3, 4, 5] # True initial state for comparison (not used in the EKF) true_state = np.array([0, 1]) print("\nTrue initial state:", true_state)
dt = 1.0
: این زمان بین هر مرحله از شبیه سازی ما است.
measurements = [1, 2, 3, 4, 5]
: این ها اندازه گیری های وانمودی هستند که ما برای آزمایش فیلتر استفاده خواهیم کرد.
true_state = np.array([0, 1])
: این موقعیت شروع واقعی و سرعت سیستم ما است که برای مقایسه استفاده می شود.
می دهد:
True initial state: [0 1]
شبیه سازی تغییرات واقعی سیستم
# Simulate the true state evolution (for comparison) true_states = [true_state[0]] for _ in range(len(measurements) - 1): true_state = fx(true_state, dt) true_states.append(true_state[0]) print("\nSimulated true states (for reference):", true_states)
شبیه سازی حالت های واقعی : این قسمت با استفاده از روشی که سیستم کار می کند ( fx
) موقعیت واقعی را در طول زمان محاسبه می کند. این مانند داشتن یک GPS عالی برای تحلیل در برابر برآوردهای ما است.
Simulated true states (for reference): [0, 1.0, 2.0, 3.0, 4.0]
فیلتر مراحل تخمین وضعیت
for i, z in enumerate(measurements): print(f"\nStep {i+1}:") print("Measurement:", z) # Predict step ekf.predict(u=0) # Use predict_x if you need to customize the prediction print("Predicted state before update:", ekf.x) # Update step ekf.update(z, HJacobian=jacobian_H, Hx=hx, args=(), hx_args=()) print("Updated state after measurement:", ekf.x) print("State covariance after update:\n", ekf.P)
Loop Through Measurements : این حلقه هر اندازه گیری جعلی را یکی یکی انجام می دهد.
مرحله پیش بینی ( ekf.predict(u=0)
) : قبل از اینکه به اندازه گیری جدید نگاه کنید، فیلتر حدس می زند که موقعیت و سرعت در حال حاضر کج است.
مرحله بهروزرسانی ( ekf.update
) : پس از حدس زدن، فیلتر اندازهگیری جدید را میبیند و حدس خود را تنظیم میکند تا به این اندازهگیری نزدیکتر باشد و اطلاعات جدید را با آنچه قبلاً پیشبینی کرده بود متعادل کند.
در اینجا نتایج آمده است:
Step 1: Measurement: 1 Predicted state before update: [0. 1.] Updated state after measurement: [0.91111111 1.04444444] State covariance after update: [[0.09111111 0.00444444] [0.00444444 1.09777778]] Step 2: Measurement: 2 Predicted state before update: [0.91111111 1.04444444] Updated state after measurement: [1.49614396 1.31876607] State covariance after update: [[0.05372751 0.0251928 ] [0.0251928 1.1840617 ]] Step 3: Measurement: 3 Predicted state before update: [1.49614396 1.31876607] Updated state after measurement: [2.15857605 1.95145631] State covariance after update: [[0.0440489 0.0420712 ] [0.0420712 1.25242718]] Step 4: Measurement: 4 Predicted state before update: [2.15857605 1.95145631] Updated state after measurement: [2.91071524 2.95437384] State covariance after update: [[0.04084552 0.05446424] [0.05446424 1.30228131]] Step 5: Measurement: 5 Predicted state before update: [2.91071524 2.95437384] Updated state after measurement: [3.74022237 4.27039095] State covariance after update: [[0.03970292 0.06298888] [0.06298888 1.33648045]]
نتیجه گیری: پیمایش داده های غیرخطی با تکنیک های پیشرفته
فیلترهای کالمن ابزاری قدرتمند برای استخراج تخمین های دقیق از داده های پر سر و صدا و ناقص است.
انواع مختلفی مانند Extended Kalman Filter (EKF) و Unscented Kalman Filter (UKF) برای رسیدگی به غیر خطی بودن داده ها توسعه یافته اند.
با این حال، این گونهها هنوز میتوانند با چالشهای مربوط به ثبات و دقت در هنگام اعمال سیستمهای غیرخطی پیچیده مواجه شوند.
این به دلیل اتکای آنها به تقریب های خطی است، که ممکن است دینامیک کامل فرآیندهای بسیار غیرخطی را نشان ندهد.
برای غلبه بر این محدودیتها، روشهای جایگزین مانند رویکردهای مبتنی بر شبکه عصبی مورد توجه قرار گرفتهاند.
شبکههای عصبی میتوانند الگوهای پیچیده را مستقیماً از دادهها یاد بگیرند و راهحلی قوی برای سناریوهای بسیار غیرخطی ارائه دهند.
علیرغم این پیشرفت ها، فیلترهای کالمن به دلیل سادگی، کارایی و کارایی در طیف وسیعی از کاربردها، ابزار مهمی در زمینه های مختلف علم و اقتصاد هستند.
همانطور که تکنولوژی به تکامل خود ادامه میدهد، ادغام فیلترهای کالمن با سایر تکنیکهای پیشرفته احتمالاً توانایی آنها را برای هدایت چالشهای دادههای غیرخطی موثرتر افزایش میدهد.
این هم کد کامل:
ارسال نظر