در دنیایی که دقت امری کلیدی است، مدیریت موثر داده های پر سر و صدا برای حل مشکلات پیچیده بسیار مهم است.

چه بخواهید یک موشک را کنترل کنید یا بازار سهام را پیش بینی کنید، توانایی به دست آوردن داده های خوب از یک محیط نامشخص مهم است.

این دقیقاً همان مشکلی است که فیلترهای کالمن به حل آن کمک می کنند. فیلترهای کالمن راه حلی را ارائه می دهند که به شما کمک می کند با داده های نویز در بسیاری از زمینه ها مقابله کنید.

در این مقاله به بحث خواهیم پرداخت:

  • رانندگی در مه: کالمن به عنوان چراغ های جلو شما فیلتر می شود
  • فیلترهای کالمن چیست؟
  • فیلترهای کالمن در عمل: نمونه کد گام به گام
  • نتیجه گیری: پیمایش داده های غیرخطی با تکنیک های پیشرفته

رانندگی در مه: کالمن به عنوان چراغ های جلو شما فیلتر می شود

pexels-eberhardgross-1287075
عکس از eberhard grossgasteiger: https://www.pexels.com/photo/forest-under-clouds-1287075/

تصور کنید در حال رانندگی در یک مه غلیظ با دید محدود هستید.

برای رسیدن به مقصد، تکیه می کنید روی حواس شما و سیستم ناوبری ماشین شما که داده های بلادرنگ را با یک نقشه از پیش تعیین شده ترکیب می کند.

در حین حرکت، سیستم ناوبری خودرو همیشه برای رسیدن به مقصد در حال تنظیم است و شما همیشه متکی هستید روی حواس خود را برای رانندگی خوب ماشین.

این process بسیار شبیه به روش عملکرد فیلتر کالمن است.

به طور مداوم در حال به روز رسانی است، و بر اساس برآوردها را اصلاح می کند روی داده های دریافتی حتی اگر این داده ها پر از نویز و عدم قطعیت باشد.

با ادغام اطلاعات گذشته با اطلاعات فعلی، یک فیلتر Kalman تصویر واضحی از جایی که هستید و به کجا می‌روید به شما می‌دهد.

فیلترهای کالمن چیست؟

pexels-mikebirdy-170811
عکس مایک برد روی پیکسل ها

فیلتر کالمن یک الگوریتم ریاضی است که برای یافتن وضعیت یک سیستم پویا از اندازه‌گیری‌های پر سر و صدا استفاده می‌شود.

اغلب برای سیستم هایی استفاده می شود که در طول زمان تغییر می کنند – مانند ردیابی موقعیت یک جسم متحرک.

فیلتر کالمن چگونه کار می کند؟

فیلتر کالمن وضعیت فعلی شما را بر اساس پیش بینی می کند روی داده های گذشته، مانند نقشه و مکان قبلی شما.

هنگامی که داده های جدید ظاهر می شود، مانند سیگنال های جدید GPS، فیلتر داده های جدید را با پیش بینی خود مقایسه می کند و تخمین خود را تنظیم می کند.

حتی اگر داده ها دارای نویز باشند، فیلتر Kalman از میانگین گیری هوشمند استفاده می کند process برای بهبود برآورد مانند روش تعادل بین آنچه سیستم ناوبری به شما می گوید و آنچه می بینید روی جاده.

با ادغام همیشه داده های جدید با داده های گذشته، فیلترهای Kalman به شما کمک می کند تا بدانید کجا هستید و به کجا می روید. به این ترتیب حتی در شرایط نامطمئن نیز می توان موارد را پیش بینی کرد.

چرا از فیلترهای کالمن در مهندسی استفاده می شود؟

از آنجایی که فیلترهای کالمن قادر به مدیریت داده های ناقص هستند، به طور گسترده ای برای پیش بینی های خوب حتی زمانی که اندازه گیری ها قطعی نیست استفاده می شود.

این باعث می شود آنها برای موارد زیر بسیار مفید باشند:

  • سیستم های ناوبری: تخمین موقعیت و سرعت وسایل نقلیه.
  • رباتیک: کمک به ربات ها برای درک محیط و موقعیت خود.
  • دارایی، مالیه، سرمایه گذاری: فیلتر کردن نویز از داده های قیمت سهام برای پیش بینی روند.

به این ترتیب، آنها بسیار سازگار هستند و می توانند process اطلاعات بلادرنگ

فیلتر کالمن چه مشکلی را حل کرد؟

فیلترهای کالمن توسط رودولف کالمن در اوایل دهه 1960 برای حل مشکل مدیریت عدم قطعیت و نویز در داده ها توسعه یافت.

پیشنهاد می‌کنیم بخوانید:  یادگیری پایتون برای علم داده – Hands-روی پروژه هایی با EDA، AB تست و هوش تجاری

امروزه آنها برای استخراج اطلاعات معنی دار از داده های پر سر و صدا عالی هستند.

از نظر ریاضی، فیلترهای کالمن را برآوردگرهای درجه دوم خطی می نامند.

این به این دلیل است که، در process برآورد آینده بر اساس روی داده های فعلی و گذشته، فیلترهای Kalman از موارد زیر استفاده می کنند:

  • جبر خطی: مطالعه بردارها و ماتریس های مورد استفاده برای حل معادلات خطی.
  • بهینه‌سازی درجه دوم: یافتن راه‌حل بهینه برای مسائل با عبارت مربع

فیلترهای کالمن در عمل: آموزش گام به گام کد

pexels-captainsopon-3402846
عکس از capt.sopon: https://www.pexels.com/photo/gray-airplane-control-panel-3402846/

فیلترهای کالمن برای مدیریت سیستم های خطی ایجاد شدند – یعنی سیستم هایی که از الگوهای قابل پیش بینی پیروی می کنند.

در این مثال کد، یک 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)
1-2
کد کامل

بیایید بلوک به بلوک کد را ببینیم.

واردات کتابخانه ها

import numpy as np
from filterpy.kalman import ExtendedKalmanFilter as EKF
from filterpy.common import Q_discrete_white_noise
2-2
واردات کتابخانه ها

در این قسمت از کد ما import کتابخانه های پایتون که نیاز داریم:

  • 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]])
3-3
روش عملکرد سیستم را تعریف کنید

در این کد روش عملکرد سیستم را تعریف می کنیم:

  • 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]])
4-2
روش عملکرد سیستم را تعریف کنید

در این کد روش تأثیر تغییرات بر سیستم را تعریف می کنیم:

  • 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)
5-2
فیلتر کالمن را تنظیم کنید

در این قسمت از کد یک فیلتر کالمن بسیار ساده ایجاد می کنیم:

  • 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): این راهی است که می گوییم ما در مورد حدس های اولیه خود مطمئن نیستیم. مثل این است که بگوییم «از اینجا شروع کنیم، اما ما آماده تغییرات هستیم».
پیشنهاد می‌کنیم بخوانید:  بیت کوین چیست؟ هر آنچه باید در سال 1402 بدانید

چاپ می کند:

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)
6-2
عدم قطعیت در سیستم را شرح دهید
  • 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)
7-2
شبیه سازی داده ها و حالت اولیه
  • 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)
8-1
شبیه سازی تغییرات واقعی سیستم
  • شبیه سازی حالت های واقعی: این قسمت با استفاده از روش کار سیستم، موقعیت واقعی را در طول زمان محاسبه می کند (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)
9
فیلتر مراحل برای تخمین وضعیت

حلقه از طریق اندازه گیری: این حلقه هر اندازه گیری جعلی را یکی یکی طی می کند.

  • پیش بینی مرحله (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]]

نتیجه گیری: پیمایش داده های غیرخطی با تکنیک های پیشرفته

pexels-noellegracephotos-906055
عکس نوئل اتو روی پیکسل ها

فیلترهای کالمن ابزاری قدرتمند برای استخراج تخمین های دقیق از داده های پر سر و صدا و ناقص است.

انواع مختلفی مانند Extended Kalman Filter (EKF) و Unscented Kalman Filter (UKF) برای رسیدگی به غیر خطی بودن داده ها توسعه یافته اند.

با این حال، این گونه‌ها هنوز هم می‌توانند با چالش‌های مربوط به پایداری و دقت در هنگام اعمال سیستم‌های غیرخطی پیچیده مواجه شوند.

این به دلیل اعتماد آنهاست روی تقریب های خطی، که ممکن است دینامیک کامل فرآیندهای بسیار غیرخطی را نشان ندهند.

برای غلبه بر این محدودیت‌ها، روش‌های جایگزین مانند رویکردهای مبتنی بر شبکه عصبی مورد توجه قرار گرفته‌اند.

شبکه‌های عصبی می‌توانند الگوهای پیچیده را مستقیماً از داده‌ها یاد بگیرند و راه‌حلی قوی برای سناریوهای بسیار غیرخطی ارائه دهند.

علیرغم این پیشرفت ها، فیلترهای کالمن به دلیل سادگی، کارایی و کارایی در طیف وسیعی از کاربردها، ابزار مهمی در زمینه های مختلف علم و اقتصاد هستند.

همانطور که تکنولوژی به تکامل خود ادامه می‌دهد، ادغام فیلترهای کالمن با سایر تکنیک‌های پیشرفته احتمالاً توانایی آن‌ها را برای هدایت چالش‌های داده‌های غیرخطی موثرتر افزایش می‌دهد.

اینم کد کامل:

GitHub – tiagomonteiro0715/freecodecamp-my-articles-source-code: این مخزن کدی را که من در مقاله‌های خبری freecodecamo خود استفاده می‌کنم در خود نگه می‌دارد.
این مخزن کدی را که در مقاله‌های خبری freecodecamo خود استفاده می‌کنم، نگه می‌دارد. – tiagomonteiro0715/freecodecamp-my-articles-source-code
freecodecamp-my-articles-source-code