fix: 异常值裁剪 P1/P99 → P2/P98,避免边界垃圾值污染
- P1-P99 对 pH/DO 等参数不够保守:边界像素模型预测 pH=-22 导致 P1=-2.38,裁剪后仍保留物理上不可能的值 - 改为 P2-P98(4% 裁剪),IQR 8.3-8.5 的主体数据完全不受影响 - 两处同步:预测端 _clip_outliers + 插值端 _perform_interpolation
This commit is contained in:
@ -750,8 +750,8 @@ class WaterQualityInference:
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _clip_outliers(predictions: np.ndarray, lower_pct: float = 1.0,
|
def _clip_outliers(predictions: np.ndarray, lower_pct: float = 2.0,
|
||||||
upper_pct: float = 99.0) -> np.ndarray:
|
upper_pct: float = 98.0) -> np.ndarray:
|
||||||
"""百分位裁剪:将极端异常值裁剪到合理范围。
|
"""百分位裁剪:将极端异常值裁剪到合理范围。
|
||||||
|
|
||||||
水体边界/零值区域的光谱异常会导致模型外推到极端值
|
水体边界/零值区域的光谱异常会导致模型外推到极端值
|
||||||
@ -763,9 +763,9 @@ class WaterQualityInference:
|
|||||||
predictions : np.ndarray
|
predictions : np.ndarray
|
||||||
原始预测值
|
原始预测值
|
||||||
lower_pct : float
|
lower_pct : float
|
||||||
下百分位(默认 1%,低于此分位数的值被裁剪)
|
下百分位(默认 2%,低于此分位数的值被裁剪)
|
||||||
upper_pct : float
|
upper_pct : float
|
||||||
上百分位(默认 99%,高于此分位数的值被裁剪)
|
上百分位(默认 98%,高于此分位数的值被裁剪)
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
|
|||||||
@ -695,6 +695,19 @@ class ContentMapper:
|
|||||||
- IDW 作为首选回退:无需拟合变异函数,不会产生纯色图
|
- IDW 作为首选回退:无需拟合变异函数,不会产生纯色图
|
||||||
- scipy linear/nearest 作为最后兜底
|
- scipy linear/nearest 作为最后兜底
|
||||||
"""
|
"""
|
||||||
|
# ★ 百分位裁剪:去掉极端异常值,避免色阶被拉爆
|
||||||
|
# P2-P98:比 P1-P99 更保守,避免 pH/DO 等参数在边界区域
|
||||||
|
# 的模型预测垃圾值(pH=-22、DO=-20)污染裁剪下限
|
||||||
|
_lo = np.percentile(values, 2.0)
|
||||||
|
_hi = np.percentile(values, 98.0)
|
||||||
|
_n_lo = int(np.sum(values < _lo))
|
||||||
|
_n_hi = int(np.sum(values > _hi))
|
||||||
|
if _n_lo > 0 or _n_hi > 0:
|
||||||
|
print(f"[异常值裁剪] P1={_lo:.4f}, P99={_hi:.4f}, "
|
||||||
|
f"裁剪低端 {_n_lo} 个, 高端 {_n_hi} 个 "
|
||||||
|
f"({(_n_lo+_n_hi)/len(values)*100:.1f}%)")
|
||||||
|
values = np.clip(values, _lo, _hi)
|
||||||
|
|
||||||
print(f"插值输入检查:")
|
print(f"插值输入检查:")
|
||||||
print(f" - 数据点数量: {len(points)}")
|
print(f" - 数据点数量: {len(points)}")
|
||||||
print(f" - 数据值范围: {values.min():.4f} - {values.max():.4f}")
|
print(f" - 数据值范围: {values.min():.4f} - {values.max():.4f}")
|
||||||
|
|||||||
Reference in New Issue
Block a user