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σ 更稳健,不会被坏点自身拉偏。

判定顺序建议:先算重复观测偏差,再用 MAD 剖面判据交叉验证。两套判据都命中的点优先剔除;仅一套命中的点标记为可疑,保留但降权;都不命中的点保留。
偶极-偶极坏点识别:双判据交叉 + 剔除阈值决策 视电阻率剖面(n=1~6,示例数据) 测点序号(1~48) ρa (Ω·m) n=1 n=3 跳变坏点 ×3.2 n=4 跌落坏点 ×0.35 n=5 坏点(MAD 判据命中) 正常层曲线 双判据交叉决策 判据① 重复观测偏差 dev = |ρa1−ρa2| / 均值 × 100% 判据② 剖面 MAD 一致性 |ρa−中位数| > 3×MAD 且邻点比值越界 剔除阈值决策 ① ② 均命中 → 剔除 仅①命中 → 可疑,降权保留 仅②命中 → 可疑,降权保留 均未命中 → 保留 剔除 vs 保留:对反演输入完整性的影响 保留全部坏点 253 点全保留 → 反演残差被坏点拉高 坏点邻域出现虚假高/低阻团块 迭代收敛慢,模型过度拟合噪声 按阈值剔除坏点 剔除 3 点,保留 250 点(98.8%) 数据完整度仍高,反演残差下降 异常体边界更清晰,无虚假团块 剔除

剔除阈值怎么定:用数据完整度换反演稳定性

阈值不是越严越好。剔除过多会破坏偶极-偶极数据的横向连续性,反演时缺失点被插值填补,反而引入新的不确定性。建议按以下规则确定:

  • 重复观测偏差阈值:取 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 输入文件前,做三项检查:

  1. 每层剩余点数与理论点数之比,确认没有整段缺失;
  2. 被剔除点是否集中在某一 n 层或某一测线段,若是则说明存在系统性采集问题;
  3. 用剩余数据重算相邻点比值,确认没有新的孤立跳变残留。
不要用“删除后重新插值”来掩盖坏点。偶极-偶极数据缺失点若被插值填补,反演会把它当作真实观测,导致虚假异常。正确做法是保留缺失标记,让反演程序按缺测处理。

阈值决策速查

判据阈值命中含义处理
重复观测偏差 dev>10%测量不稳定与 MAD 同时命中则剔除
MAD 偏离>3×MAD剖面形态异常与 dev 同时命中则剔除
邻点比值<0.5 或 >2.0横向突变作为 MAD 的辅助条件
单层坏点比例>10%该层信号弱或系统性异常整层降权或剔除
全测线保留率<90%数据完整性不足回查采集方案,不强行反演