3. 偶极-偶极数据坏点识别与剔除策略
偶极-偶极数据的坏点从哪来
偶极-偶极排列的视电阻率对浅部不均匀体、电极接地变化和偶极距增大后的弱信号都很敏感。坏点通常表现为三类:单点跳变(相邻测点视电阻率突变数倍)、条带状异常(同一 n 层沿测线连续偏高或偏低)、重复观测离散(同一测点两次测量相对偏差超限)。识别时不能只看单点数值,要把“剖面形态 + 重复观测统计”结合起来判断。
下面以一条 48 电极、电极距 5 m 的偶极-偶极测线为例,隔离系数 n=1~6,共 253 个测点。示例数据为教学构造:在 n=4 的第 12、13 号测点人为加入 3.2 倍跳变,在 n=5 的第 30 号测点加入 0.35 倍跌落,其余点叠加 ±3% 随机噪声,用于演示识别与剔除逻辑。
用重复观测相对偏差建立第一道筛子
对每个测点计算两次观测的相对偏差:
dev = |ρa1 - ρa2| / ((ρa1 + ρa2) / 2) × 100%
工程上常把 dev ≤ 5% 视为合格,5%~10% 为可疑,>10% 判为重复观测不合格。但重复观测只能发现“测不稳”的点,对稳定但错误的跳变无能为力,因此还需要剖面一致性判据。
剖面一致性判据:相邻测点比值与 n 层趋势
对同一 n 层,沿测线计算相邻测点视电阻率比值 r = ρa(i+1)/ρa(i)。正常地质体横向变化平缓,偶极-偶极数据在 n 增大时视电阻率整体呈下降趋势。若某点同时满足“与左右邻点比值均超出 [0.5, 2.0]”且“偏离本层中位数超过 3 倍中位绝对偏差(MAD)”,则判为剖面坏点。MAD 判据比均值±3σ 更稳健,不会被坏点自身拉偏。
剔除阈值怎么定:用数据完整度换反演稳定性
阈值不是越严越好。剔除过多会破坏偶极-偶极数据的横向连续性,反演时缺失点被插值填补,反而引入新的不确定性。建议按以下规则确定:
- 重复观测偏差阈值:取
dev > 10%为不合格;若整条测线重复观测普遍偏差大,说明采集质量差,应回到野外补测而非硬剔。 - MAD 倍数阈值:取
3×MAD为界;若某层坏点比例超过 10%,说明该层整体信号弱(常见于大n),应整层降权或剔除该层,而不是逐点剔除。 - 完整性底线:剔除后单层保留率不低于 85%,全测线保留率不低于 90%;低于此线应重新评估采集方案。
可执行的识别与剔除流程(Python 示例)
以下代码读取一个简化的偶极-偶极数据表(列:n, point, rho1, rho2),完成双判据识别并输出剔除清单与保留率。数据表可由 Res2DInv 导出的 DAT 转换得到,也可直接构造用于验证逻辑。
import numpy as np
import pandas as pd
# 构造示例数据:n=1~6,每层 48 点,含 3 个人为坏点
rng = np.random.default_rng(42)
rows = []
for n in range(1, 7):
base = 120.0 / n # 随 n 增大整体下降
for p in range(1, 49):
rho = base * (1 + rng.normal(0, 0.03))
rows.append({"n": n, "point": p, "rho1": rho, "rho2": rho * (1 + rng.normal(0, 0.02))})
df = pd.DataFrame(rows)
# 注入坏点
df.loc[(df.n == 4) & (df.point == 12), "rho1"] *= 3.2
df.loc[(df.n == 4) & (df.point == 13), "rho1"] *= 3.2
df.loc[(df.n == 5) & (df.point == 30), "rho1"] *= 0.35
# 判据①:重复观测相对偏差
df["dev"] = (df.rho1 - df.rho2).abs() / ((df.rho1 + df.rho2) / 2) * 100
df["bad_rep"] = df.dev > 10.0
# 判据②:按 n 层计算 MAD 与邻点比值
df["bad_mad"] = False
for n, g in df.groupby("n"):
med = g.rho1.median()
mad = (g.rho1 - med).abs().median()
ratio = g.rho1 / g.rho1.shift(1)
ratio_next = g.rho1.shift(-1) / g.rho1
mask = ((g.rho1 - med).abs() > 3 * mad) & \
((ratio < 0.5) | (ratio > 2.0)) & \
((ratio_next < 0.5) | (ratio_next > 2.0))
df.loc[g.index, "bad_mad"] = mask
# 交叉决策
df["action"] = "保留"
df.loc[df.bad_rep ^ df.bad_mad, "action"] = "可疑-降权"
df.loc[df.bad_rep & df.bad_mad, "action"] = "剔除"
print(df[df.action != "保留"][["n", "point", "rho1", "dev", "action"]])
print("总点数:", len(df), "剔除:", (df.action == "剔除").sum(),
"保留率: %.1f%%" % ((df.action != "剔除").mean() * 100))
示例运行预期输出:n=4, point=12/13 与 n=5, point=30 被判为“剔除”,其余点保留或降权,保留率约 98.8%。若实际数据中某层坏点比例超过 10%,代码会集中输出该层大量点,此时应检查该层信号强度而非逐点剔除。
剔除后的输入完整性检查
剔除完成后,把结果写回 Res2DInv 输入文件前,做三项检查:
- 每层剩余点数与理论点数之比,确认没有整段缺失;
- 被剔除点是否集中在某一
n层或某一测线段,若是则说明存在系统性采集问题; - 用剩余数据重算相邻点比值,确认没有新的孤立跳变残留。
阈值决策速查
| 判据 | 阈值 | 命中含义 | 处理 |
|---|---|---|---|
| 重复观测偏差 dev | >10% | 测量不稳定 | 与 MAD 同时命中则剔除 |
| MAD 偏离 | >3×MAD | 剖面形态异常 | 与 dev 同时命中则剔除 |
| 邻点比值 | <0.5 或 >2.0 | 横向突变 | 作为 MAD 的辅助条件 |
| 单层坏点比例 | >10% | 该层信号弱或系统性异常 | 整层降权或剔除 |
| 全测线保留率 | <90% | 数据完整性不足 | 回查采集方案,不强行反演 |