用python编程建立N个带有噪声的数据,分为若干组并找出中位值,用加权滤波法计算出真实值
时间: 2024-10-21 07:08:18 浏览: 9
AD处理-递推中位值平均一阶滤波
在Python中,我们可以使用numpy库来创建包含噪声的数据,并利用pandas处理数据分组以及计算中位数。同时,可以借助scipy的filter模块来进行加权滤波。以下是大致步骤:
1. 导入所需库:
```python
import numpy as np
import pandas as pd
from scipy.signal import butter, lfilter
```
2. 创建N个带有随机噪声的数据:
```python
N = 1000 # 数据点数量
data_size_per_group = 100 # 每组数据的数量
groups = 5 # 分成的组数
# 创建各组数据,添加噪声
group_data = []
for _ in range(groups):
group = np.random.rand(data_size_per_group) * 100 # 假设每个组有范围在0到100之间的数据
noise_level = 0.2 # 噪声水平
noisy_group = group + np.random.normal(0, noise_level*group.std(), data_size_per_group)
group_data.append(noisy_group)
```
3. 将数据整理成DataFrame,方便分组和计算中位数:
```python
df = pd.DataFrame({'Group': list(range(1, groups+1)), 'Value': np.concatenate(group_data)})
```
4. 对每组数据计算中位数:
```python
median_values = df.groupby('Group')['Value'].transform('median')
```
5. 使用加权滤波法(这里假设我们想要使用线性低通滤波):
- 定义滤波器参数(例如,采样频率、截止频率等)
```python
fs = 1 # 假设我们的数据是实时更新的,所以采样频率为1
nyquist_freq = 0.5 * fs
lowcut = 0.1 # 我们想保留0.1的低频成分
highcut = 0.9 # 高频部分需要滤除
filter_order = 3 # 滤波器阶数
```
- 应用滤波器:
```python
def apply_weighted_filter(series, window_len=10, alpha=0.8):
weights = np.array([alpha ** i for i in range(window_len)])
series_filtered = lfilter(butter(filter_order, [lowcut, highcut] / nyquist_freq), 1, series, axis=0, zi=None, output='ba')[0]
return series_filtered * np.convolve(weights[::-1], series, mode='same')
filtered_median_values = median_values.rolling(window_len=window_len).apply(apply_weighted_filter, raw=True)
```
6. 结果分析:
最后,`filtered_median_values`将是经过加权滤波后的中位数值。你可以查看这个序列,看看过滤效果如何。
阅读全文