3. DCPA/TCPA阈值敏感性分析
场景与阈值扫描设计
本节使用一组固定的会遇场景数据,只改变 DCPA 与 TCPA 的报警阈值,观察报警数量、误报与漏报如何随阈值移动。核心思路是把“阈值”当作可扫描的参数,而不是一次性给定的常数:对每个阈值组合重新判定所有目标,再与人工标注的危险目标集合比对。
构造 12 个目标船的会遇样本,其中 5 个为真实危险目标(人工标注 danger=1),7 个为安全目标。每个目标给出 DCPA(海里)与 TCPA(分钟)。判定规则为:DCPA < d_th 且 TCPA < t_th 时报警。误报指安全目标被报警,漏报指危险目标未报警。
targets = [
# id, DCPA(nm), TCPA(min), danger
("T01", 0.30, 8, 1), ("T02", 0.45, 12, 1),
("T03", 0.60, 15, 1), ("T04", 0.80, 20, 1),
("T05", 1.10, 25, 1),
("T06", 0.35, 30, 0), ("T07", 0.55, 35, 0),
("T08", 0.90, 10, 0), ("T09", 1.20, 18, 0),
("T10", 1.50, 22, 0), ("T11", 2.00, 28, 0),
("T12", 2.50, 40, 0),
]
def alarm(dcpa, tcpa, d_th, t_th):
return dcpa < d_th and tcpa < t_th
def scan(targets, d_list, t_list):
rows = []
for d_th in d_list:
for t_th in t_list:
tp = fp = fn = 0
for _, dcpa, tcpa, danger in targets:
a = alarm(dcpa, tcpa, d_th, t_th)
if a and danger: tp += 1
elif a and not danger: fp += 1
elif (not a) and danger: fn += 1
rows.append((d_th, t_th, tp, fp, fn))
return rows
d_list = [0.5, 0.8, 1.0, 1.5]
t_list = [10, 15, 20, 30]
for r in scan(targets, d_list, t_list):
print("DCPA<%.1f TCPA<%2d TP=%d FP=%d FN=%d" % r)
运行后可得到 16 组阈值组合的统计结果。下面表格摘录其中 6 组,用于观察阈值放宽或收紧时的变化趋势(数值由上述代码直接推出,属示例计算结果)。
| DCPA 阈值(nm) | TCPA 阈值(min) | TP | FP | FN |
|---|---|---|---|---|
| 0.5 | 10 | 1 | 0 | 4 |
| 0.5 | 30 | 2 | 1 | 3 |
| 0.8 | 20 | 3 | 1 | 2 |
| 1.0 | 20 | 4 | 2 | 1 |
| 1.0 | 30 | 4 | 3 | 1 |
| 1.5 | 30 | 5 | 5 | 0 |
可以看到:DCPA 阈值从 0.5 放宽到 1.5 时,漏报逐步减少,但误报明显增加;TCPA 阈值增大同样会引入更多远距离安全目标。实际选择阈值时,需要在“尽早发现危险”和“减少无效报警干扰”之间取平衡,通常结合本船操纵性能与航道密度确定。
结果判读与阈值选择建议
从扫描结果看,DCPA=1.0 nm、TCPA=20 min 是一组较均衡的折中:5 个危险目标中检出 4 个,仅 1 个漏报,同时误报 2 个。若本船处于开阔水域、可接受更多提示,可放宽到 DCPA=1.5 nm、TCPA=30 min,此时漏报为 0,但误报升至 5 个,需要船员人工复核。
阈值不是固定值:在狭窄水道或渔船密集区,宜收紧 DCPA 阈值以减少频繁报警;在开阔海域可适当放宽 TCPA 阈值,为避让留出更充裕的时间。
误报与漏报的代价并不对称。漏报可能导致碰撞风险被忽视,因此实际系统中通常优先控制漏报,再通过报警分级、延时确认等方式抑制误报。