环形数据(0~360°角度类)的异常值识别与剔除方法咨询
环形角度数据异常值识别方法
核心逻辑是使用**方向统计(圆形统计)**的规则替代普通算术统计,避开0°和360°的环形衔接问题,具体实现步骤如下:
1. 角度转单位向量
把每个角度先转换为弧度,再映射为二维平面上的单位向量,消除环形边界的影响:
- 对角度$\theta$(单位:°),转弧度:$rad = \theta \times \pi / 180$
- 计算向量分量:$x = cos(rad)$,$y = sin(rad)$
以示例数据[350, 0, 10]为例,转换后的x值分别约为0.9848、1、0.9848,y值分别约为-0.1736、0、0.1736。
2. 计算圆形均值
对所有向量的x、y分量分别取算术平均,再反推得到真实的环形均值:
- 平均分量:$\bar{x} = mean(x)$,$\bar{y} = mean(y)$
- 圆形均值(转角度后取0~360模):$\bar{\theta} = arctan2(\bar{y}, \bar{x}) \times 180 / \pi % 360$
刚才的示例中$\bar{x}≈0.9899$,$\bar{y}=0$,计算得到的均值就是0°,符合预期。
3. 计算圆形标准差
先计算所有向量的平均合向量长度$R$,再推导离散度:
- 合向量长度:$R = \sqrt{\bar{x}^2 + \bar{y}^2}$,取值范围0~1,值越大说明数据越集中
- 圆形标准差(转角度单位):$\sigma = \sqrt{-2 \times ln(R)} \times 180 / \pi$
4. 异常值判定
对每个角度计算它和圆形均值的最小环形差,结合类似3σ的规则判定异常:
- 最小环形差公式:$\Delta = min(|\theta - \bar{\theta}|, 360 - |\theta - \bar{\theta}|)$
- 判定规则:如果$\Delta > k \times \sigma$则判定为异常值,$k$一般取2或3,对应95%/99.7%的置信区间,可根据业务容忍度调整
Python实现示例
import numpy as np def clean_circular_data(angles, k=2): # angles为0~360范围内的角度数组 radians = np.deg2rad(angles) x, y = np.cos(radians), np.sin(radians) x_mean, y_mean = np.mean(x), np.mean(y) # 计算圆形均值 mean_rad = np.arctan2(y_mean, x_mean) mean_deg = np.rad2deg(mean_rad) % 360 # 计算圆形标准差 R = np.sqrt(x_mean**2 + y_mean**2) std_rad = np.sqrt(-2 * np.log(R)) if R > 1e-6 else np.inf std_deg = np.rad2deg(std_rad) # 筛选非异常值 diff = np.abs(angles - mean_deg) circ_diff = np.minimum(diff, 360 - diff) return angles[circ_diff <= k * std_deg] # 测试 data = np.array([350, 0, 10, 90, 180, 270]) print(clean_circular_data(data, k=2)) # 输出:[350 0 10]
适用前提
该方法仅适合你提到的「大部分取值相近」的单峰分布场景,如果数据分布均匀(R<0.1)或者存在多个明显的聚类,需要先做聚类再按组处理。
内容的提问来源于stack exchange,提问作者jeandemeusy
相关产品推荐
相关产品推荐

