准备文件:
import pandas as pd
import numpy as np
import random
# 读取CSV文件
file_path = 'data02.csv' # 替换为你的CSV文件路径
data = pd.read_csv(file_path)
x_data = data.iloc[:, 0].values # 假设第一列是要平滑的数据
# 初始化卡尔曼滤波器参数
n_iter = len(x_data) # 迭代次数
sz = (n_iter,) # 数据尺寸
Q = 1e-5 # 过程噪声协方差
R = 0.005**2 # 观测噪声协方差
# 初始估计
xhat = np.zeros(sz) # 状态估计
P = np.zeros(sz) # 状态估计协方差
xhatminus = np.zeros(sz) # 预测估计
Pminus = np.zeros(sz) # 预测协方差
K = np.zeros(sz) # 卡尔曼增益
# 初始状态
xhat[0] = 0.0
P[0] = 1.0
# 卡尔曼滤波迭代
for k in range(1, n_iter):
# 预测
xhatminus[k] = xhat[k-1]
Pminus[k] = P[k-1] + Q
# 更新
K[k] = Pminus[k] / (Pminus[k] + R)
xhat[k] = xhatminus[k] + K[k] * (x_data[k] - xhatminus[k])
P[k] = (1 - K[k]) * Pminus[k]
# 使用 xhat 作为滤波后的数据
filtered_data = xhat
# 绘制原始数据和滤波后的数据进行对比
import matplotlib.pyplot as plt
plt.plot(x_data, label='Original Data')
plt.plot(filtered_data, label='Filtered Data', color='red')
plt.legend()
plt.show()
原始数据
266
145
183
119
180
168
231
224
192
122
336
185
194
149
210
273
191
287
226
303
289
421
264
342
339
440
315
439
401
437
575
407
682
475
581
646