1729112592
2024-10-16 20:17:00
kalmangrad は、不均一にサンプリングされた時系列データの自動化された滑らかな N 次導関数を計算する Python パッケージです。このアプローチは、ベイジアン フィルター技術を利用して、指定された次数まで微分値を計算し、ノイズの影響を受けやすい従来の数値微分法に代わる堅牢な代替手段を提供します。このパッケージは基盤となるものの上に構築されています ベイズフィルター パッケージ。
ノイズの多いデータから導関数を推定することは、信号処理、制御システム、データ分析などの分野で共通の課題です。従来の数値微分ではノイズが増幅され、結果が不正確になります。センサー データを区別しようと素朴に試みた人は誰でも、この問題に遭遇したことがあります。このリポジトリは、ベイジアン フィルタリング ベースの方法を実装して、任意の次数の導関数を推定し、ノイズや不均一なサンプリングが存在する場合でも、よりスムーズで正確な推定を提供します。
- 高次微分推定: 指定された次数までの導関数を計算します。
- ノイズに強い: ベイジアン フィルタリングを使用して、データ内のノイズの影響を軽減します。
- 柔軟な時間ステップ: 自動タイムステップ調整により、不均一にサンプリングされたデータを処理します。
- 簡単な統合: シンプルな API により、既存のプロジェクトに簡単に統合できます。
- 依存関係がほとんどない: NumPy と BayesFilter パッケージのみが必要です (NumPy のみが必要です)。
-
PyPIからインストール:
-
ソースからインストールする:
-
リポジトリのクローンを作成します。
-
パッケージをインストールします。
-
提供される主な機能は、 grad、入力データの導関数を推定します。 y 時々サンプリングされる t。
以下は、ノイズの多い正弦波データの 1 次導関数と 2 次導関数を推定する方法を示す例です。
import numpy as np
import matplotlib.pyplot as plt
# Import the grad function
from kalmangrad import grad # Replace with the actual module name
# Generate noisy sinusoidal data with random time points
np.random.seed(0)
t = sorted(np.random.uniform(0.0, 10.0, 100))
noise_std = 0.01
y = np.sin(t) + noise_std * np.random.randn(len(t))
true_first_derivative = np.cos(t)
true_second_derivative = -np.sin(t)
# Estimate derivatives using the Kalman filter
N = 2 # Order of the highest derivative to estimate
smoother_states, filter_times = grad(y, t, n=N)
# Extract estimated derivatives
estimated_position = [state.mean()[0] for state in smoother_states]
estimated_first_derivative = [state.mean()[1] for state in smoother_states]
estimated_second_derivative = [state.mean()[2] for state in smoother_states]
# Plot the results
plt.figure(figsize=(12, 9))
# Position
plt.subplot(3, 1, 1)
plt.plot(t, y, 'k.', label='Noisy Observations')
plt.plot(filter_times, estimated_position, 'b-', label='Estimated Position')
plt.plot(t, np.sin(t), 'r--', label='True Position')
plt.legend(loc='upper right')
plt.ylim(-1.5, 1.5)
plt.title('Position')
# First Derivative
plt.subplot(3, 1, 2)
plt.plot(filter_times, estimated_first_derivative, 'b-', label='Estimated First Derivative')
plt.plot(t, true_first_derivative, 'r--', label='True First Derivative')
plt.plot(
t,
np.gradient(y, t),
'k-',
label='np.gradient calculated derivative'
)
plt.legend(loc='upper right')
plt.ylim(-1.5, 1.5)
plt.title('First Derivative')
# Second Derivative
plt.subplot(3, 1, 3)
plt.plot(filter_times, estimated_second_derivative, 'b-', label='Estimated Second Derivative')
plt.plot(t, true_second_derivative, 'r--', label='True Second Derivative')
plt.legend(loc='upper right')
plt.ylim(-1.5, 1.5)
plt.title('Second Derivative')
plt.tight_layout()
plt.show()
説明:
- データ生成: 正弦波のノイズの多い観測を生成します。
- 微分推定: の
grad関数は次のように呼び出されますn=2二次導関数まで推定します。 - 結果の抽出: 位置と導関数の平均推定値はガウス状態から抽出されます。
- 視覚化: 真の関数と推定値が比較のためにプロットされています。
新しい状態ベクトルを一度に計算します t + delta_t 現在の状態ベクトルが与えられた場合 y 時に t、次数のカルマン フィルターの場合 n。
-
パラメータ:
y (np.ndarray): 現在の状態ベクトル[y, y', y'', ..., y^(n)]^T。delta_t (float): 時間ステップ。n (int): 導関数の順序。
-
返品:
new_y (np.ndarray): 時刻に更新された状態ベクトルt + delta_t。
状態遷移行列を返します。 A 次数のカルマン フィルターの場合 n。
-
パラメータ:
delta_t (float): 時間ステップ。n (int): 導関数の順序。
-
返品:
A (np.ndarray): サイズの遷移行列(n+1, n+1)。
状態ベクトルから観測値を抽出します。現在、最初の要素 (位置) のみを監視します。
-
パラメータ:
state (np.ndarray): 状態ベクトル。
-
返品:
np.ndarray: 観測ベクトル。
状態ベクトルに関する観測関数のヤコビアンを計算します。
-
パラメータ:
state (np.ndarray): 状態ベクトル。
-
返品:
np.ndarray: サイズのヤコビ行列(1, n+1)。
入力データの導関数を推定するメイン関数 y 注文まで n。
-
パラメータ:
y (np.ndarray): 観測されたデータ配列。t (np.ndarray): に対応する時点y。n (int): 推定する導関数の最大次数 (デフォルトは1)。delta_t (float, optional): カルマン フィルターの時間ステップ。もしNone、自動的に決定されます。obs_noise_std (float): 観測ノイズの標準偏差。
-
返品:
smoother_states (List[Gaussian]): 各タイム ステップの平均と共分散の推定値を含むガウス状態のリスト。filter_times (np.ndarray): 推定値に対応する時点。
-
Python 3.x
-
ナムピー: 数値計算用。
-
マットプロットリブ: 結果をプロットします。
-
ベイズフィルター: ベイジアン フィルタリングとスムージング用。
次の方法でインストールします。
pip install numpy matplotlib bayesfilter
このプロジェクトは MIT ライセンスに基づいてライセンスされています – を参照してください。 ライセンス 詳細については、ファイルを参照してください。
免責事項: このコードは、いかなる保証もなく、現状のまま提供されます。特定のコンテキストでコードをテストして検証してください。
#hugehadfieldkalmangrad #不均一にサンプリングされた時系列データの自動化されたスムーズな #次導関数