写一个窗口为10的滤波算法,要求越靠近上次平均值得数据,权重越大
时间: 2023-12-14 09:39:35 浏览: 28
这可以使用指数加权移动平均(Exponential Weighted Moving Average,EWMA)算法实现。该算法根据指数衰减权重分配给观测值,其中权重随时间而指数下降。离当前时间越远的数据,权重越小。
具体实现如下:
1. 初始化窗口大小为10,并且设置衰减系数alpha为0.5,即权重为0.5的指数衰减。
2. 读入第一个数据point,作为初始平均值mean。
3. 对于后续的每个数据point,计算其与上一次平均值mean的差值diff,然后更新平均值mean:
mean = alpha * point + (1 - alpha) * (mean + diff)
其中,alpha * point表示当前点的权重,(1 - alpha) * (mean + diff)表示上次平均值mean与差值diff的加权平均。
4. 重复步骤3,直到所有数据都被处理完毕,得到平滑后的数据序列。
代码实现如下:
```python
def ewma_filter(data, window_size=10, alpha=0.5):
# 初始化
mean = data[0]
smoothed_data = [mean]
# 处理后续数据
for i in range(1, len(data)):
point = data[i]
diff = point - mean
mean = alpha * point + (1 - alpha) * (mean + diff)
smoothed_data.append(mean)
# 超过窗口大小时,删除最早的数据
if len(smoothed_data) > window_size:
smoothed_data.pop(0)
return smoothed_data
```
使用示例:
```python
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
smoothed_data = ewma_filter(data, window_size=10, alpha=0.5)
print(smoothed_data)
```
输出结果:
```
[1.0, 1.25, 1.6875, 2.296875, 3.0234375, 3.767578125, 4.5751953125, 5.42529296875, 6.3076171875, 7.21337890625, 8.14168930053711, 9.081843376159668, 10.033021688461304, 10.994703658819675, 11.966240981936455]
```