Оценка доверительных интервалов вокруг фильтра Калмана

Я работал над внедрением фильтра Калмана для поиска аномалий в двумерном наборе данных. Очень похоже на отличный пост, который я нашел здесь. В качестве следующего шага я хотел бы предсказать доверительные интервалы (например, 95% достоверности для значений пола и потолка) для того, что, как я предсказываю, попадут следующие значения. Поэтому в дополнение к строке ниже я хотел бы быть может генерировать две дополнительные линии, которые представляют 95% уверенность в том, что следующее значение будет выше пола или ниже потолка.

Я предполагаю, что хочу использовать ковариационную матрицу неопределенности (P), которая возвращается с каждым прогнозом, сгенерированным фильтром Калмана, но я не уверен, что это правильно. Любое руководство или ссылка на то, как это сделать, будут высоко оценены!

фильтр Kalman 2d в python

Код в посте выше генерирует набор измерений с течением времени и использует фильтр Калмана для сглаживания результатов.

import numpy as np
import matplotlib.pyplot as plt

def kalman_xy(x, P, measurement, R,
              motion = np.matrix('0. 0. 0. 0.').T,
              Q = np.matrix(np.eye(4))):
    """
Parameters:    
x: initial state 4-tuple of location and velocity: (x0, x1, x0_dot, x1_dot)
P: initial uncertainty convariance matrix
measurement: observed position
R: measurement noise 
motion: external motion added to state vector x
Q: motion noise (same shape as P)
"""
return kalman(x, P, measurement, R, motion, Q,
              F = np.matrix('''
                  1. 0. 1. 0.;
                  0. 1. 0. 1.;
                  0. 0. 1. 0.;
                  0. 0. 0. 1.
                  '''),
              H = np.matrix('''
                  1. 0. 0. 0.;
                  0. 1. 0. 0.'''))

def kalman(x, P, measurement, R, motion, Q, F, H):
    '''
    Parameters:
    x: initial state
    P: initial uncertainty convariance matrix
    measurement: observed position (same shape as H*x)
    R: measurement noise (same shape as H)
    motion: external motion added to state vector x
    Q: motion noise (same shape as P)
    F: next state function: x_prime = F*x
    H: measurement function: position = H*x

    Return: the updated and predicted new values for (x, P)

    See also http://en.wikipedia.org/wiki/Kalman_filter

    This version of kalman can be applied to many different situations by
    appropriately defining F and H 
    '''
    # UPDATE x, P based on measurement m    
    # distance between measured and current position-belief
    y = np.matrix(measurement).T - H * x
    S = H * P * H.T + R  # residual convariance
    K = P * H.T * S.I    # Kalman gain
    x = x + K*y
    I = np.matrix(np.eye(F.shape[0])) # identity matrix
    P = (I - K*H)*P

    # PREDICT x, P based on motion
    x = F*x + motion
    P = F*P*F.T + Q

    return x, P

def demo_kalman_xy():
    x = np.matrix('0. 0. 0. 0.').T 
    P = np.matrix(np.eye(4))*1000 # initial uncertainty

    N = 20
    true_x = np.linspace(0.0, 10.0, N)
    true_y = true_x**2
    observed_x = true_x + 0.05*np.random.random(N)*true_x
    observed_y = true_y + 0.05*np.random.random(N)*true_y
    plt.plot(observed_x, observed_y, 'ro')
    result = []
    R = 0.01**2
    for meas in zip(observed_x, observed_y):
        x, P = kalman_xy(x, P, meas, R)
        result.append((x[:2]).tolist())
    kalman_x, kalman_y = zip(*result)
    plt.plot(kalman_x, kalman_y, 'g-')
    plt.show()

demo_kalman_xy()

person Alex    schedule 25.06.2014    source источник


Ответы (3)


Двухмерное обобщение интервала 1-сигма представляет собой доверительный эллипс, который характеризуется уравнение (x-mx).T P^{-1}.(x-mx)==1, где x — параметр 2D-вектора, mx — 2D-среднее значение или центр эллипса, а P^{-1} — матрица обратной ковариации. См. этот ответ о том, как его нарисовать. Как и сигма-интервалы, площадь эллипсов соответствует фиксированной вероятности того, что истинное значение находится внутри. Масштабирование с коэффициентом n (масштабирование длины интервала или радиусов эллипса) может обеспечить более высокую достоверность. Обратите внимание, что Факторы n имеют разные вероятности в одном и двух измерениях:

|`n` | 1D-Intverval | 2D Ellipse |
==================================
  1  |  68.27%      |  39.35%    
  2  |  95.5%       |  86.47%
  3  |  99.73%      |  98.89%

Вычисление этих значений в 2D немного сложнее, и, к сожалению, у меня нет публичной ссылки на него.

person Dietrich    schedule 28.06.2014

Если вы хотите, чтобы 95-процентный интервал предсказывал попадание следующих значений, вам нужен интервал прогнозирования, а не доверительный интервал (http://en.wikipedia.org/wiki/Prediction_interval).

Для двумерных (трехмерных) данных полуоси эллипса (эллипсоида) можно найти путем вычисления собственных значений ковариационной матрицы данных и корректировки размера полуосей с учетом необходимого прогноза. вероятность.

См. Эллипс прогнозирования и эллипсоид прогнозирования для Python. код для расчета эллипса или эллипсоида предсказания 95%. Это может помочь вам рассчитать эллипс предсказания для ваших данных.

person Marcos    schedule 21.07.2014

Поскольку ваша статистика, конечно, получена из выборки, вероятность того, что статистика населения больше, чем стандартное отклонение 2 сигма, составляет 0,5. Поэтому я бы подумал о важности рассмотрения того, есть ли у вас хороший прогноз значения, которое, как вы ожидаете, будет ниже следующей меры с вероятностью 0,95, если вы не применили верхний доверительный фактор 2-кратного стандартного отклонения. Величина этого фактора будет зависеть от размера выборки, используемой для получения вероятности 0,5 населения. Чем меньше размер выборки, используемой для получения ковариационной матрицы, тем больше коэффициент для получения вероятности 0,95, что статистика населения 0,95 меньше, чем факторизованная статистика выборки.

person user4465045    schedule 17.01.2015