Метод pykalman .filter и метод .filter_update дают несколько разные результаты - PullRequest
0 голосов
/ 30 апреля 2020

Я пытался использовать методы .filter и .filter_update для работы с одними и теми же данными, но они приводили к несколько разному результату. Я не уверен, почему, помогите, пожалуйста!

Вот мой код:

from pykalman import KalmanFilter
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_style('darkgrid')

tau = 0.1

kf = KalmanFilter(
    initial_state_mean=[30, 10],
    initial_state_covariance=np.eye(2),
    transition_matrices=[[1, tau],[0, 1]],
    observation_matrices=[[1, 0]],
    transition_covariance=np.zeros((2, 2)),
    observation_covariance=3,
    transition_offsets=[-4.9 * tau **2, -9.8 * tau]
)

times = np.arange(40)
times = times * tau

actual = -4.9 * times ** 2

sim = actual + 3 * np.random.randn(40) # Consider random noise

# Using .filter method
state_means, state_covs = kf.filter(sim)

# Generate figure
fig, ax = plt.subplots(figsize=(20, 10))
ax.plot(times, state_means[:, 0])
ax.plot(times, sim)
ax.plot(times, actual)
ax.set_xlim(0.0, 4.0)
ax.set_ylim(-80, 40)
ax.xaxis.set_tick_params(labelsize=14)
ax.yaxis.set_tick_params(labelsize=14)
ax.legend(['Filter estimate', 'Camera data', 'Actual'], fontsize=14)
ax.set_xlabel('Time', fontsize=14)
ax.set_ylabel('Height', fontsize=14)
plt.show()

# Using .filter_update method
filtered_state_means = kf.initial_state_mean
filtered_state_covariances = kf.initial_state_covariance

observations = sim

results = []
for observation in observations:
    filtered_state_means, filtered_state_covariances = kf.filter_update(
        filtered_state_means,
        filtered_state_covariances,
        observation=observation
    )
    results.append(filtered_state_means[0])

# Generate figure
fig, ax = plt.subplots(figsize=(20, 10))
ax.plot(times, results)
ax.plot(times, sim)
ax.plot(times, actual)
ax.set_xlim(0.0, 4.0)
ax.set_ylim(-80, 40)
ax.xaxis.set_tick_params(labelsize=14)
ax.yaxis.set_tick_params(labelsize=14)
ax.legend(['Filter estimate', 'Camera data', 'Actual'], fontsize=14)
ax.set_xlabel('Time', fontsize=14)
ax.set_ylabel('Height', fontsize=14)
plt.show()

# Plot two results together
fig, ax = plt.subplots(figsize=(20, 10))
ax.plot(times, state_means[:, 0])
ax.plot(times, results)
plt.show()

Вы можете заметить небольшую разницу между двумя методами. Я не уверен почему. Разве эти два метода не должны работать одинаково, используя одну и ту же группу уравнений?

Большое спасибо за помощь!

...