Фильтр Калмана. Первый взгляд

в 11:25, , рубрики: python, Алгоритмы, математика, программирование под windows, Промышленное программирование, разработка под windows
Фильтр Калмана. Первый взгляд - 1

Введение

Эта публикация дает простое и интуитивно понятное введение к вопросу об использовании фильтра Калмана. Публикация рассчитана на тех, кто слышал о фильтре Калмана, но не знает, как он работает, а также на тех, кто знает уравнения фильтра Калмана, но не знает, откуда они берутся.

Требуемые знания: знакомство с матричной алгеброй, нормальным многомерным распределением, ковариацией матриц и т. д.

Постановка задачи

Фильтр Калмана имеет множество применений в технике и экономике. Выберем не тривиальную задачу – отслеживание местоположения ракеты запущенyой из страны Y. Обозначим текущее местоположение ракеты Фильтр Калмана. Первый взгляд - 2 как пару координат широты – a и долготы – b, на контурной карте это Фильтр Калмана. Первый взгляд - 3.

На данный момент времени, точные координаты х неизвестны, но мы можем определить вероятность нахождения ракеты в данной точке Фильтр Калмана. Первый взгляд - 4 исходя из двумерной плотности вероятности Фильтр Калмана. Первый взгляд - 5. Предполагая гауссовским закон распределения, значение плотности вероятности в точке можно записать в виде:

Фильтр Калмана. Первый взгляд - 6 (1)

где: Фильтр Калмана. Первый взгляд - 7 — распределение вероятности местоположения ракеты;
Σ – ковариационная матрица 2×2.

В рассматриваемой модели:

Фильтр Калмана. Первый взгляд - 8 (2)

Используем следующий листинг для построения на плоскости эллиптической области распределения вероятности с центром красного цвета.

Листинг решения

from scipy import linalg
import numpy as np
import matplotlib.cm as cm
from matplotlib.mlab import bivariate_normal
import matplotlib.pyplot as plt
# == Настройка гостовской плотности р == #
Σ = [[0.4, 0.3], [0.3, 0.45]]
Σ = np.matrix(Σ)
x_hat = np.matrix([0.2, -0.2]).T
# ==Определим матрицы G и R из уравнения y = G x + N(0, R) == #
G = [[1, 0], [0, 1]]
G = np.matrix(G)
R = 0.5 * Σ
# == Матрицы A и Q== #
A = [[1.2, 0], [0, -0.2]]
A = np.matrix(A)
Q = 0.3 * Σ
# == Матрицы A и Q == #
y = np.matrix([2.3, -1.9]).T
# == Настройка сетки для построения графика== #
x_grid = np.linspace(-1.5, 2.9, 100)
y_grid = np.linspace(-3.1, 1.7, 100)
X, Y = np.meshgrid(x_grid, y_grid)
def gen_gaussian_plot_vals(μ, C):
"µTorrent.lnk "
m_x, m_y = float(μ[0]), float(μ[1])
s_x, s_y = np.sqrt(C[0, 0]), np.sqrt(C[1, 1])
s_xy = C[0, 1]
return bivariate_normal(X, Y, s_x, s_y, m_x, m_y, s_xy)
#Построить график
fig, ax = plt.subplots(figsize=(8,6))
ax.grid()
Z = gen_gaussian_plot_vals(x_hat, Σ)
ax.contourf(X, Y, Z, 6, alpha=0.6, cmap=cm.jet)
cs = ax.contour(X, Y, Z, 6, colors="black")
ax.clabel(cs, inline=1, fontsize=10)
plt.show()

Получим:

Фильтр Калмана. Первый взгляд - 9

Определение шага фильтрации

Датчики, установленные на ракете, сообщают координаты её текущего положения Фильтр Калмана. Первый взгляд - 10. Поместим эту точку на график с помощью следующего листинга.

Листинг решения

fig, ax = plt.subplots(figsize=(8, 6))
ax.grid()
Z = gen_gaussian_plot_vals(x_hat, Σ)
ax.contourf(X, Y, Z, 6, alpha=0.6, cmap=cm.jet)
cs = ax.contour(X, Y, Z, 6, colors="black")
ax.clabel(cs, inline=1, fontsize=10)
ax.text(float(y[0]), float(y[1]), "$y$", fontsize=20, color="black")
plt.show()

Получим:
Фильтр Калмана. Первый взгляд - 11
Датчики неточны поэтому мы должны интерпретировать выход нашего датчика не как Фильтр Калмана. Первый взгляд - 12, а следующим образом:
Фильтр Калмана. Первый взгляд - 13 (3)
Здесь матрицы G и R имеют размерность 2×2, а матрица R содержит только положительные элементы. Помеха в виде шумов – Фильтр Калмана. Первый взгляд - 14, не зависит от измеряемых координат – Фильтр Калмана. Первый взгляд - 15.
Для объединения плотности вероятности Фильтр Калмана. Первый взгляд - 16 и полученного соотношения для y воспользуемся уравнением Байеса используя безусловную Фильтр Калмана. Первый взгляд - 17 и условную Фильтр Калмана. Первый взгляд - 18 вероятности:
Фильтр Калмана. Первый взгляд - 19
где: Фильтр Калмана. Первый взгляд - 20

Для определения Фильтр Калмана. Первый взгляд - 21 воспользуемся следующими соотношениями и условиями:

  • Фильтр Калмана. Первый взгляд - 22;
  • с учётом соотношения (3), относительная вероятность Фильтр Калмана. Первый взгляд - 23 равна Фильтр Калмана. Первый взгляд - 24;
  • Фильтр Калмана. Первый взгляд - 25 не зависит от Фильтр Калмана. Первый взгляд - 26 и входит в вычисления только как нормализующая постоянная.

Поскольку мы находимся в линейной и гауссовой структуре, обновленная плотность может быть вычислена путем вычисления линейных регрессий; в частности, известно решение [1]:
Фильтр Калмана. Первый взгляд - 27
где:
Фильтр Калмана. Первый взгляд - 28
Фильтр Калмана. Первый взгляд - 29 (4)
где: Фильтр Калмана. Первый взгляд - 30 — матрица коэффициентов регрессии.

Эта новая плотность Фильтр Калмана. Первый взгляд - 31 показана на следующем рисунке через контурные линии и цветовую карту. Первоначальная плотность оставлена в виде контурных линий для сравнения.

Листинг решения

fig, ax = plt.subplots(figsize=(8, 6))
ax.grid()
Z = gen_gaussian_plot_vals(x_hat, Σ)
cs1 = ax.contour(X, Y, Z, 6, colors="black")
ax.clabel(cs1, inline=1, fontsize=10)
M = Σ * G.T * linalg.inv(G * Σ * G.T + R)
x_hat_F = x_hat + M * (y - G * x_hat)
Σ_F = Σ - M * G * Σ
new_Z = gen_gaussian_plot_vals(x_hat_F, Σ_F)
cs2 = ax.contour(X, Y, new_Z, 6, colors="black")
ax.clabel(cs2, inline=1, fontsize=10)
ax.contourf(X, Y, new_Z, 6, alpha=0.6, cmap=cm.jet)
ax.text(float(y[0]), float(y[1]), "$y$", fontsize=20, color="black")
plt.show()

Получим:

Фильтр Калмана. Первый взгляд - 32
Наша новая плотность «закручивает» предыдущую Фильтр Калмана. Первый взгляд - 33 в направлении, определяемом новой информацией Фильтр Калмана. Первый взгляд - 34.
При генерации фигуры мы устанавливаем G как единичную матрицу и Фильтр Калмана. Первый взгляд - 35
, матрица для Фильтр Калмана. Первый взгляд - 36 согласно соотношению (2).

Прогноз на шаг вперёд

Подведём промежуточные итоги. Нами получено вероятное текущее положение ракеты с использованием информации о начальном и текущем её положении. Это имеет название фильтрация, но не прогнозирование, поскольку фильтруем от шума, но не можем предсказать местоположение ракеты в следующий момент времени.

Давайте предположим, что нам поставлена другая задача: предсказать местоположение ракеты после истечения единицы времени, не имея никакой информации о новом её местоположении.

Для решения этой задачи используем линейную гауссовою модель вида:

Фильтр Калмана. Первый взгляд - 37 (5)

Наша цель – объединить этот закон движения и наше текущее распределение Фильтр Калмана. Первый взгляд - 38, чтобы придумать новое предсказательное распределение для местоположения ракеты за одну единицу времени.

Ввиду (5) все, что нам нужно сделать, – ввести случайный вектор Фильтр Калмана. Первый взгляд - 39 и выработать распределение Фильтр Калмана. Первый взгляд - 40, где w не зависит от Фильтр Калмана. Первый взгляд - 41 и имеет распределение Фильтр Калмана. Первый взгляд - 42

Поскольку в (5) используются линейные комбинации случайных переменных с гауссовыми распределениями, то и Фильтр Калмана. Первый взгляд - 43 также является гауссовой переменной.

После преобразований соотношений (4) с учётом введенных переменных получим:

Фильтр Калмана. Первый взгляд - 44

Фильтр Калмана. Первый взгляд - 45

Фильтр Калмана. Первый взгляд - 46

Матрица Фильтр Калмана. Первый взгляд - 47 часто записывается как Фильтр Калмана. Первый взгляд - 48 и называется усилением Кальмана. Добавлен индекс Фильтр Калмана. Первый взгляд - 49, напоминающий нам, что Фильтр Калмана. Первый взгляд - 50 зависит от Фильтр Калмана. Первый взгляд - 51, но не зависит от Фильтр Калмана. Первый взгляд - 52 или Фильтр Калмана. Первый взгляд - 53

Используя эти обозначения, мы можем суммировать наши результаты следующим образом. Наше обновленное предсказание – имеет плотность вероятности Фильтр Калмана. Первый взгляд - 54, где:

Фильтр Калмана. Первый взгляд - 55
Фильтр Калмана. Первый взгляд - 56 (6)

Плотность Фильтр Калмана. Первый взгляд - 57 называется прогностическим распределением. Прогностическое распределение – это новая плотность, показанная на следующем рисунке, где использованы обновлённые параметры:

Фильтр Калмана. Первый взгляд - 58

Листинг решения

fig, ax = plt.subplots(figsize=(8,6))
ax.grid()
# Плотность 1
Z = gen_gaussian_plot_vals(x_hat, Σ)
cs1 = ax.contour(X, Y, Z, 6, colors="black")
ax.clabel(cs1, inline=1, fontsize=10)
# Плотность 2
M = Σ * G.T * linalg.inv(G * Σ * G.T + R)
x_hat_F = x_hat + M * (y - G * x_hat)
Σ_F = Σ - M * G * Σ
Z_F = gen_gaussian_plot_vals(x_hat_F, Σ_F)
cs2 = ax.contour(X, Y, Z_F, 6, colors="black")
ax.clabel(cs2, inline=1, fontsize=10)
# Плотность 3
new_x_hat = A * x_hat_F
new_Σ = A * Σ_F * A.T + Q
new_Z = gen_gaussian_plot_vals(new_x_hat, new_Σ)
cs3 = ax.contour(X, Y, new_Z, 6, colors="black")
ax.clabel(cs3, inline=1, fontsize=10)
ax.contourf(X, Y, new_Z, 6, alpha=0.6, cmap=cm.jet)
ax.text(float(y[0]), float(y[1]), "$y$", fontsize=20, color="black")
plt.show()

Получим:

Фильтр Калмана. Первый взгляд - 59

Рекурсивная процедура

Давайте посмотрим на то, что мы сделали. Мы начали текущий период с Фильтр Калмана. Первый взгляд - 60 для размещения координат Фильтр Калмана. Первый взгляд - 61 ракеты. Затем мы использовали текущее измерение для обновления вероятности до. Наконец, мы использовали закон движения (5) для Фильтр Калмана. Первый взгляд - 62 обновить до Фильтр Калмана. Первый взгляд - 63.

Если мы сейчас переходим к следующему периоду, мы снова готовы взять Фильтр Калмана. Первый взгляд - 64 в качестве предшествующего периода. Обозначая Фильтр Калмана. Первый взгляд - 65 для Фильтр Калмана. Первый взгляд - 66 и Фильтр Калмана. Первый взгляд - 67 для Фильтр Калмана. Первый взгляд - 68, полная рекурсивная процедура состоит:

  1. Начинаем текущий период с предшествующего Фильтр Калмана. Первый взгляд - 69
  2. Получаем текущее измерение Фильтр Калмана. Первый взгляд - 70
  3. Вычислить распределение фильтрации Фильтр Калмана. Первый взгляд - 71 изФильтр Калмана. Первый взгляд - 72 иФильтр Калмана. Первый взгляд - 73, применяя правило Байеса и условное распределение (3) ;
  4. Вычислить прогностическое распределение Фильтр Калмана. Первый взгляд - 74 из фильтрационного распределения (5);
  5. Приращение t на единицу и переход к шагу 1.

Повторяя (6), динамика для Фильтр Калмана. Первый взгляд - 75 и Фильтр Калмана. Первый взгляд - 76 выглядит следующим образом:

Фильтр Калмана. Первый взгляд - 77
Фильтр Калмана. Первый взгляд - 78 (7)

Это стандартные динамические уравнения для фильтра Калмана (см., например, [2], с. 58)

Конвергенция

Матрицa Фильтр Калмана. Первый взгляд - 79 является мерой неопределенности нашего предсказания Фильтр Калмана. Первый взгляд - 80 из Фильтр Калмана. Первый взгляд - 81. Помимо особых случаев, эта неопределенность никогда не будет полностью решена, независимо от того, сколько времени истекает.

Одна из причин заключается в том, что наше предсказание Фильтр Калмана. Первый взгляд - 82 составлено на основе информации, доступной в t-1, а не t. Даже если мы знаем точное значение Фильтр Калмана. Первый взгляд - 83 (чего мы не делаем), из уравнения перехода (5) следует, что:

Фильтр Калмана. Первый взгляд - 84

Поскольку Фильтр Калмана. Первый взгляд - 85 не наблюдается при t-1, в любое время предсказание Фильтр Калмана. Первый взгляд - 86 повлечет за собой некоторую ошибку (если Фильтр Калмана. Первый взгляд - 87 не вырождается).

Однако, конечно, возможно, что Фильтр Калмана. Первый взгляд - 88 сходится к постоянной матрице при Фильтр Калмана. Первый взгляд - 89. Чтобы изучить эту тему, давайте разберем второе уравнение в (7):

Фильтр Калмана. Первый взгляд - 90 (8)

Это нелинейное разностное уравнение для Фильтр Калмана. Первый взгляд - 91. Фиксированная точка (8) является постоянной матрицей Σ такой, что:

Фильтр Калмана. Первый взгляд - 92

Уравнение (8) известно, как разностное уравнение Риккати дискретного времени. Уравнение (9) называется дискретным временным алгебраическим уравнением Риккати.

Условия, при которых существует неподвижная точка и сходящаяся к ней последовательность Фильтр Калмана. Первый взгляд - 93, обсуждаются в [3] и [4], глава 4.

Достаточным (но не необходимым) условием является то, что все собственные значения Фильтр Калмана. Первый взгляд - 94 матрицы A удовлетворяют Фильтр Калмана. Первый взгляд - 95 (см., например, [4], стр. 77). Это сильное условие гарантирует, что безусловное распределение Фильтр Калмана. Первый взгляд - 96 сходится при Фильтр Калмана. Первый взгляд - 97.

В этом случае для любого начального выбора Фильтр Калмана. Первый взгляд - 98, неотрицательного и симметричного, последовательность Фильтр Калмана. Первый взгляд - 99 в (8) сходится к неотрицательной симметрической матрице Фильтр Калмана. Первый взгляд - 100, которая является решением (9).

Реализация

Класс Kalman из пакета QuantEcon.py реализует фильтр Kalman на основе линейной модели пространства состояний следующего вида:

Фильтр Калмана. Первый взгляд - 101
Фильтр Калмана. Первый взгляд - 102

Приведём переход переменных к принятым в публикации обозначениям:

Фильтр Калмана. Первый взгляд - 103

Класс Kalman из пакета QuantEcon.py [5] имеет ряд методов, приведём те, которые относятся к данной публикации:

  • before_to_filtered, метод обновляет Фильтр Калмана. Первый взгляд - 104 до Фильтр Калмана. Первый взгляд - 105;
  • filter_to_forecast, метод обновляет распределение фильтрации до прогнозирующего распределения – которое становится новым ранее Фильтр Калмана. Первый взгляд - 106;
  • update, обновление, которое сочетает в себе последние два метода;
  • stationary_values, метод вычисляет решение уравнения (9) и соответствующее (стационарное) усиление Кальмана.

Примеры использования класса Kalman из пакета QuantEcon.py

Пример 1

Рассмотрим следующее простое применение фильтра Калмана взятое из [2], раздел 2.9.2. Предположим, что все переменные являются скалярами, скрытое состояние Фильтр Калмана. Первый взгляд - 107 фактически является постоянным, равным некоторому значению Фильтр Калмана. Первый взгляд - 108. Динамика состояний отражена в выражении (5) сФильтр Калмана. Первый взгляд - 109, Фильтр Калмана. Первый взгляд - 110 и Фильтр Калмана. Первый взгляд - 111. Уравнение измерения: Фильтр Калмана. Первый взгляд - 112, где Фильтр Калмана. Первый взгляд - 113 равно Фильтр Калмана. Первый взгляд - 114.

Задача этого примера с использованием kalman.py построить первые пять предсказательных плотностей Фильтр Калмана. Первый взгляд - 115. При моделировании использовать следующие значения переменных Фильтр Калмана. Первый взгляд - 116.

Листинг решения

from quantecon import Kalman
import numpy as np
from quantecon import LinearStateSpace
import matplotlib.pyplot as plt
from scipy.stats import norm
# == параметры == #
θ = 10 # Постоянное значение состояния x_t
A, C, G, H = 1, 0, 1, 1
ss = LinearStateSpace(A, C, G, H, mu_0=θ)
# ==задание до инициализации фильтра Калмана == #
x_hat_0, Σ_0 = 8, 1
kalman = Kalman(ss, x_hat_0, Σ_0)
# == наблюдение за измерением в модели пространства состояний== #
N = 5
x, y = ss.simulate(N)
y = y.flatten()
# == настроить график == #
fig, ax = plt.subplots(figsize=(8,6))
xgrid = np.linspace(θ - 5, θ + 2, 200)
for i in range(N):
# == записать текущее прогнозируемое среднее и дисперсию== #
m, v = [float(z) for z in (kalman.x_hat, kalman.Sigma)]
# =обновление фильтра == #
ax.plot(xgrid, norm.pdf(xgrid, loc=m, scale=np.sqrt(v)), label=f'$t={i}$')
kalman.update(y[i])
ax.set_title(f'Первые {N} распределений плотности вероятности n при $\theta = {θ:.1f}$')
ax.legend(loc='upper left')
plt.show()

Получим:

Фильтр Калмана. Первый взгляд - 117

Как показано в [2], в разделах 2.9.1-2.9.2, эти распределения асимптотически приближаются к неизвестному значению Фильтр Калмана. Первый взгляд - 118.

Пример 2

На предыдущем графике приведена некоторая поддержка идеи о том, что интеграл плотности вероятности сходится к Фильтр Калмана. Первый взгляд - 119.
Чтобы проверить идею, нужно выбрать небольшое Фильтр Калмана. Первый взгляд - 120 и вычислить интеграл:
Фильтр Калмана. Первый взгляд - 121
для Фильтр Калмана. Первый взгляд - 122.

Листинг решения

from quantecon import Kalman
from numpy import*
from quantecon import LinearStateSpace
from scipy.stats import norm
import matplotlib.pyplot as plt
from scipy.integrate import quad
ϵ = 0.1
θ = 10  # Постоянное значение состояния x_t
A, C, G, H = 1, 0, 1, 1
ss = LinearStateSpace(A, C, G, H, mu_0=θ)
x_hat_0, Σ_0 = 8, 1
kalman = Kalman(ss, x_hat_0, Σ_0)
T = 600
z = empty(T)
x, y = ss.simulate(T)
y = y.flatten()
for t in range(T):
# Запись текущего предсказанного среднего, дисперсии  их плотности распределения
m, v = [float(temp) for temp in (kalman.x_hat, kalman.Sigma)]
f = lambda x: norm.pdf(x, loc=m, scale=sqrt(v))
integral, error = quad(f, θ - ϵ, θ + ϵ)
z[t] = 1 - integral
kalman.update(y[t])
fig, ax = plt.subplots(figsize=(8, 6))
ax.set_ylim(0, 1)
ax.set_xlim(0, T)
ax.plot(range(T), z)
ax.fill_between(range(T), zeros(T), z, color="blue", alpha=0.2)
plt.show()

Получим:

Фильтр Калмана. Первый взгляд - 123

Пример 3

Как обсуждалось выше, последовательность Фильтр Калмана. Первый взгляд - 124 не вырождена, то в общем случае невозможно предсказать Фильтр Калмана. Первый взгляд - 125 без ошибок в момент времени t-1 (и это было бы так, даже если бы мы могли наблюдать Фильтр Калмана. Первый взгляд - 126). Давайте теперь сравним предсказание Фильтр Калмана. Первый взгляд - 127, сделанное фильтром Калмана, против конкурента, которому разрешено наблюдать Фильтр Калмана. Первый взгляд - 128.

Этот конкурент будет использовать условное ожидание Фильтр Калмана. Первый взгляд - 129, которое в этом случае является Фильтр Калмана. Первый взгляд - 130.. Известно, что условное ожидание является оптимальным методом прогнозирования с точки зрения минимизации среднеквадратической ошибки. (Точнее, минимизатор Фильтр Калмана. Первый взгляд - 131 по g равен Фильтр Калмана. Первый взгляд - 132).

Таким образом, мы сравниваем фильтр Калмана с конкурентом, который имеет больше информации (в смысле возможности наблюдать скрытое состояние) и ведет себя оптимально с точки зрения минимизации квадратичной ошибки. Наши переходы будут оцениваться по квадрату ошибки.

В частности, ваша задача состоит в том, чтобы генерировать график, отображающий наблюдения как Фильтр Калмана. Первый взгляд - 133, так и Фильтр Калмана. Первый взгляд - 134 против t при t=1,...,50.

Для параметров задайте Фильтр Калмана. Первый взгляд - 135, Фильтр Калмана. Первый взгляд - 136 и Фильтр Калмана. Первый взгляд - 137, где I — тождество 2 × 2.

Задать

Фильтр Калмана. Первый взгляд - 138.

Чтобы инициализировать предыдущую плотность, следует установить:

Фильтр Калмана. Первый взгляд - 139.

и Фильтр Калмана. Первый взгляд - 140.

Наконец, установите Фильтр Калмана. Первый взгляд - 141.

Листинг решения

from scipy.linalg import eigvals
from quantecon import Kalman
import numpy as np
from quantecon import LinearStateSpace
import matplotlib.pyplot as plt
# === Определение A, C, G, H === #
G = np.identity(2)
H = np.sqrt(0.5) * np.identity(2)
A = [[0.5, 0.4],
      [0.6, 0.3]]
C = np.sqrt(0.3) * np.identity(2)
# === Настроить модель пространства состояний, начальное значение x_0 установить на ноль=== #
ss = LinearStateSpace(A, C, G, H, mu_0 = np.zeros(2))
# === Определить предыдущую плотность=== #
Σ = [[0.9, 0.3],
      [0.3, 0.9]]
Σ = np.array(Σ)
x_hat = np.array([8, 8])
# === Инициализировать фильтр Калмана === #
kn = Kalman(ss, x_hat, Σ)
# == Печатать собственные значения A == #
print("Собственные значения A:")
print(eigvals(A))
# == Печать стационарная Σ== #
S, K = kn.stationary_values()
print("Дисперсия ошибки стационарного прогноза:")
print(S)
# === Создать сюжет=== #
T = 50
x, y = ss.simulate(T)
e1 = np.empty(T-1)
e2 = np.empty(T-1)
for t in range(1, T):
kn.update(y[:,t])
e1[t-1] = np.sum((x[:, t] - kn.x_hat.flatten())**2)
e2[t-1] = np.sum((x[:, t] - A @ x[:, t-1])**2)
fig, ax = plt.subplots(figsize=(9,6))
ax.plot(range(1, T), e1, 'k-', lw=2, alpha=0.6, label='Ошибка фильтра Калмана')
ax.plot(range(1, T), e2, 'g-', lw=2, alpha=0.6, label='Условная математическая ошибка')
ax.legend()
plt.show()

Получим:

Собственные значения A:
[ 0.9+0.j -0.1+0.j]
Дисперсия ошибки стационарного прогноза:
[[0.40329108 0.1050718 ]
[0.1050718 0.41061709]]

Фильтр Калмана. Первый взгляд - 142

Пример 4

Попробуйте изменить коэффициент 0.3 в Q=0.3I вверх и вниз. Для Q=0.5I получим:

Собственные значения A:

[ 0.9+0.j -0.1+0.j]

Дисперсия ошибки стационарного прогноза:
[[0.62286148 0.12527948]
[0.12527948 0.63270989]]

Фильтр Калмана. Первый взгляд - 143

Для Q=0.1I получим:

Собственные значения A:
[ 0.9+0.j -0.1+0.j]
Дисперсия ошибки стационарного прогноза:
[[0.16433113 0.06508848]
[0.06508848 0.16752408]]

Фильтр Калмана. Первый взгляд - 144

Заметим, как диагональные значения в стационарном решении Фильтр Калмана. Первый взгляд - 145 (см. (9)) возрастают и убывают в соответствии с этим коэффициентом.

Интерпретация заключается в том, что большая случайность в законе движения для приводит к большей (постоянной) неопределенности в прогнозировании.

  1. C. M. Bishop. Pattern Recognition and Machine Learning. Springer, 2006.
  2. L Ljungqvist and T J Sargent. Recursive Macroeconomic Theory. MIT Press, 4 edition, 2018.
  3. E. W. Anderson, L. P. Hansen, E. R. McGrattan, and T. J. Sargent. Mechanics of Forming and Estimating Dynamic Linear Economies. In Handbook of Computational Economics. Elsevier, vol 1 edition, 1996.
  4. D. B. O. Anderson and J. B. Moore. Optimal Filtering. Dover Publications, 2005.
  5. kalman.py.https://github.com/QuantEcon/QuantEcon.py/blob/master/quantecon/kalman.py

Автор: Юрий Тараненко

Источник

Поделиться

* - обязательные к заполнению поля