GaMMA 地震相位关联算法的 Python 包概述。该算法期望相位拾取数据和台站数据,如...
GAMMA 关联器库是一项面向实际任务的技能,主要用于GAMMA 是怎样的?;GAMMA 是一个地震相关联器算法, 将关联作为一个不受监督的集群问题处理;
该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
GaMMA 是一种地震震相关联算法,将关联问题建模为无监督聚类问题。它使用多元高斯分布对某次地震事件的所有震相拾取结果进行建模,并通过期望最大化(Expectation-Maximization, EM)算法完成拾取分配,同时估计震源参数——即地震位置、发震时刻和震级。
GaMMA 是该算法的 Python 实现库。对于输入的地震波形数据,本库假设 P 波与 S 波的拾取结果(P/S wave picks)已预先提取完成。本文档介绍其核心 API 的使用方法。
Zhu, W., McBrearty, I. W., Mousavi, S. M., Ellsworth, W. L., & Beroza, G. C. (2022). Earthquake phase association using a Bayesian Gaussian mixture model. Journal of Geophysical Research: Solid Earth, 127(5).
本技能基于代码仓库 https://github.com/AI4EPS/GaMMA 衍生而来。
pip install git+https://github.com/wayneweiqiang/GaMMA.git
associationdef association(picks, stations, config, event_idx0=0, method="BGMM", **kwargs)
使用贝叶斯高斯混合模型(BGMM)或标准高斯混合模型(GMM)对地震震相拾取(P 波与 S 波)进行事件关联。该函数基于拾取的到时与振幅信息进行聚类,并拟合高斯混合模型以估计地震的位置、发震时刻与震级。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
picks |
DataFrame | 必需 | 地震震相拾取数据 |
stations |
DataFrame | 必需 | 台站元数据(含空间坐标) |
config |
dict | 必需 | 配置参数字典 |
event_idx0 |
int | 0 |
事件编号起始索引 |
method |
str | "BGMM" |
"BGMM"(贝叶斯)或 "GMM"(标准) |
picks DataFrame| 列名 | 类型 | 说明 | 示例 |
|---|---|---|---|
id |
str | 台站标识符(须与 stations 中的 id 匹配) |
network.station. 或 network.station.location.channel |
timestamp |
datetime/str | 拾取到时(ISO 格式字符串或 datetime 类型) | "2019-07-04T22:00:06.084" |
type |
str | 震相类型:"p" 或 "s"(小写) |
"p" |
prob |
float | 拾取概率 / 权重(取值范围:0–1) | 0.94 |
amp |
float | 振幅(单位:m/s;当 use_amplitude=True 时为必需字段) |
0.000017 |
注意事项:
use_amplitude=True 时,amp == 0 或 amp == -1 的拾取将被过滤stations DataFrame| 列名 | 类型 | 说明 | 示例 |
|---|---|---|---|
id |
str | 台站标识符 | "CI.CCC..BH" |
x(km) |
float | X 坐标(单位:km,投影坐标系) | -35.6 |
y(km) |
float | Y 坐标(单位:km,投影坐标系) | 45.2 |
z(km) |
float | Z 坐标(单位:km,通常为负值,表示海拔/深度) | -0.67 |
注意事项:
pyproj 包进行转换)id 列内容必须与 picks DataFrame 中的 id 值完全一致(如 network.station. 或 network.station.location.channel)id 的多条台站记录将按唯一 id 分组;属性一致者合并为单值,属性冲突者保留为排序后的列表config)键说明| 键 | 类型 | 说明 | 示例 |
|---|---|---|---|
dims |
list[str] | 待求解的位置维度 | ["x(km)", "y(km)", "z(km)"] |
min_picks_per_eq |
int | 每场地震所需的最少拾取数 | 5 |
max_sigma11 |
float | 允许的最大到时残差(单位:秒) | 2.0 |
use_amplitude |
bool | 是否在聚类中使用振幅信息 | True |
bfgs_bounds |
tuple | BFGS 优化的参数边界 | ((-35, 92), (-128, 78), (0, 21), (None, None)) |
oversample_factor |
float | 初始 GMM 成分过采样倍数 | 5.0(BGMM),1.0(GMM) |
关于 dims 的说明:
["x(km)", "y(km)", "z(km)"]、["x(km)", "y(km)"] 或 ["x(km)"]关于 bfgs_bounds 的说明:
((x_min, x_max), (y_min, y_max), (z_min, z_max), (None, None))| 键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
vel |
dict | {"p": 6.0, "s": 3.47} |
均匀速度模型(单位:km/s) |
eikonal |
dict/None | None |
一维速度模型(用于走时计算) |
| 键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
use_dbscan |
bool | True |
启用 DBSCAN 预聚类 |
dbscan_eps |
float | 25 |
拾取间允许的最大时间间隔(单位:秒) |
dbscan_min_samples |
int | 3 |
DBSCAN 邻域内所需最小样本数 |
dbscan_min_cluster_size |
int | 500 |
用于层级分裂的最小聚类规模 |
dbscan_max_time_space_ratio |
float | 10 |
用于分裂操作的最大“时间/空间”比值 |
dbscan_eps 可由 estimate_eps 函数自动估算| 键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
max_sigma22 |
float | 1.0 |
振幅残差最大值(对数尺度;当 use_amplitude=True 时为必需) |
max_sigma12 |
float | 1.0 |
最大协方差值 |
max_sigma11 |
float | 2.0 |
震相到时残差最大值(单位:秒) |
min_p_picks_per_eq |
int | 0 |
每场地震所需的最少 P 波拾取数 |
min_s_picks_per_eq |
int | 0 |
每场地震所需的最少 S 波拾取数 |
min_stations |
int | 5 |
每场地震所涉最少独立台站数 |
| 键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
covariance_prior |
list[float] | 自动推导 | 协方差先验(顺序为 [time, amp]) |
ncpu |
int | 自动推导 | 并行处理所用 CPU 核心数 |
返回元组 (events, assignments):
events(list[dict])字典列表,每个字典代表一次已关联的地震事件:
| 键 | 类型 | 说明 |
|---|---|---|
time |
str | 发震时刻(ISO 8601 格式,含毫秒) |
magnitude |
float | 估计震级(若 use_amplitude=False,则为 999) |
sigma_time |
float | 时间不确定性(单位:秒) |
sigma_amp |
float | 振幅不确定性(log₁₀ 尺度) |
cov_time_amp |
float | 时间–振幅协方差 |
gamma_score |
float | 关联质量评分 |
num_picks |
int | 已分配拾取总数 |
num_p_picks |
int | 已分配 P 波拾取数 |
num_s_picks |
int | 已分配 S 波拾取数 |
event_index |
int | 唯一事件索引 |
x(km) |
float | 震源 X 坐标 |
y(km) |
float | 震源 Y 坐标 |
z(km) |
float | Z 坐标(深度) |
assignments(list[tuple])元组列表,每个元组形如 (pick_index, event_index, gamma_score):
pick_index:原始 picks DataFrame 中的行索引event_index:所关联事件的索引gamma_score:该分配的概率 / 置信度estimate_eps 函数文档def estimate_eps(stations, vp, sigma=2.0)
根据台站空间分布估算适用于地震震相拾取聚类的 DBSCAN epsilon(eps)参数。该参数控制 DBSCAN 聚类算法中视为邻近点的最大时间距离。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
stations |
DataFrame | 必需 | 含三维坐标的台站元数据 |
vp |
float | 必需 | P 波速度(单位:km/s) |
sigma |
float | 2.0 |
高于均值的标准差倍数 |
stations DataFrame| 列名 | 类型 | 说明 | 示例 |
|---|---|---|---|
x(km) |
float | X 坐标(单位:km) | -35.6 |
y(km) |
float | Y 坐标(单位:km) | 45.2 |
z(km) |
float | Z 坐标(单位:km) | -0.67 |
| 类型 | 说明 |
|---|---|
| float | 用于 DBSCAN 聚类的 epsilon 值(单位:秒) |
from gamma.utils import estimate_eps
# 假设 stations DataFrame 已准备就绪,且包含 x(km)、y(km)、z(km) 列
vp = 6.0 # P 波速度(单位:km/s)
# 基于台站间距自动估算 eps
eps = estimate_eps(stations, vp, sigma=2.0)
# 在 config 中使用
config = {
"use_dbscan": True,
"dbscan_eps": eps, # 或使用 estimate_eps(stations, config["vel"]["p"])
"dbscan_min_samples": 3,
# ... 其他配置项
}
from gamma.utils import association, estimate_eps # 自动估算 eps config["dbscan_eps"] = estimate_eps(stations, config["vel"]["p"]) # 或手动指定(实践中更常见) config["dbscan_eps"] = 15 # 单位:秒
eps 值未知,或面对新布设台网时尤为有用该函数输出通常用于以下配置项:
config["dbscan_eps"] = estimate_eps(stations, config["vel"]["p"]) config["dbscan_min_samples"] = 3 config["dbscan_min_cluster_size"] = 500 config["dbscan_max_time_space_ratio"] = 10