Я пытался использовать методы .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()
Вы можете заметить небольшую разницу между двумя методами. Я не уверен почему. Разве эти два метода не должны работать одинаково, используя одну и ту же группу уравнений?
Большое спасибо за помощь!