信息速览
一台心电图机在门诊里只跑十秒钟,输出十二道波形,医生看着它判断有没有心梗。一台动态心电记录仪在患者身上挂二十四小时,输出两道波形,医生看着它判断有没有阵发性房颤。两种设备的采样率都不高:常规十二导联机的采样率常在 250 Hz 到 500 Hz 之间,够画出 QRS 波的形状,却不够精细地界定 T 波到底在哪里结束。而心电学研究里有一批问题恰恰卡在这两个"不够"的交界处——QT 间期该从哪一点量到哪一点,T 波终点在不同导联上差多少毫秒,心室晚电位那种微伏级的碎裂信号能不能被稳定地检出。这些问题需要更宽的导联覆盖,也需要更细的时间刻度,公开数据里同时满足两者的并不多。
PTB Diagnostic ECG Database 是这条稀缺线上的一个老资格答案。德国联邦物理技术研究院(Physikalisch-Technische Bundesanstalt,PTB,德国的国家计量研究院)把柏林一所大学诊所心内科采集的静息心电整理成 549 段记录,在 2004 年 9 月 25 日交给 PhysioNet。它做了三件当时别处少有人做的事:把采样率提到 1000 Hz,把通道数从 12 提到 15(额外三路是 Frank 正交导联 vx、vy、vz,也就是心向量图的三个轴),并且把每一例的临床摘要——诊断、病史、用药、冠脉造影所见、心室造影、超声心动、血流动力学——直接写进头文件。
它的代价同样清楚:只有 290 名受试者、单一国家、单一采集设备、二十多年没有更新版本,标注形态是"一段自由文本临床摘要"而不是"一张规整的标签表"。它不是拿来训大模型的粮仓,是一件为特定问题打造的精密量具。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | PTB Diagnostic ECG Database |
| 发布方 | PhysioNet(数据由德国联邦物理技术研究院 PTB 整理并捐赠) |
| 首次发布 | 2004 年 9 月 25 日,版本 1.0.0 |
| 版本与最近改动 | 仅一个版本 1.0.0;目录内 CONTROLS 于 2006-04-24 更新,SHA256SUMS.txt 于 2019-02-20 更新 |
| 记录数 | 549 段 |
| 受试者数 | 290 名(页面导言另有一处写 294,见 §10 不一致说明) |
| 年龄范围 | 17–87 岁,平均 57.2 岁;209 名男性平均 55.5 岁,81 名女性平均 61.6 岁 |
| 未记录年龄 | 15 名(1 名女性、14 名男性) |
| 每人记录数 | 1 至 5 段 |
| 记录时长 | 多数约两分钟,少数更短,官方挑战赛文献称无短于 30 秒者 |
| 通道数 | 15(常规十二导联 + Frank 正交导联 vx、vy、vz) |
| 采样率与分辨率 | 1000 Hz,16 位,量程 ±16.384 mV,0.5 μV/LSB(2000 A/D 单位每毫伏) |
| 更高采样率 | 向贡献者特别申请可取得最高 10 kHz 的记录 |
| 采集设备 | PTB 非商用原型机,16 路输入(14 路心电、1 路呼吸、1 路线电压),带宽 0–1 kHz |
| 原始来源 | 柏林自由大学 Benjamin Franklin 大学诊所心内科,Michael Oeff 教授采集 |
| 临床信息 | 多数记录头文件内含临床摘要;22 名受试者无临床摘要,268 名归入九个诊断类别 |
| 文件格式 | WFDB:.hea 头文件 / .dat(12 路)/ .xyz(3 路 Frank) |
| 全量体积 | 解压后 1.7 GB |
| 许可 | Open Data Commons Attribution License v1.0(ODC-BY 1.0) |
| 标识符 | DOI 10.13026/C28C71 |
| 典型用途 | 心梗检测、QT 与 T 波终点测量、心向量图与导联变换、心电设备计量与算法基准 |
§1 它要解决的具体麻烦
1.1 三个"不够",各自卡在不同的维度上
心电公开数据的取舍,长期被三个互相牵制的维度拉扯:导联数、采样率、临床标注的深度。多数库只能占住其中一到两个。
第一个不够是导联不够。常规十二导联已经是临床常规,但它不是心电向量的完整表达。心向量图(vectorcardiography,VCG)用三个互相正交的轴描述心脏电活动的空间轨迹,Frank 导联体系就是为它设计的。凡是涉及空间向量方向的问题——QRS 波电轴、T 波环的形态、心室除极顺序的立体描述——十二导联要靠推导,Frank 导联可以直接测。绝大多数公开库只给十二导联,把 VCG 留给研究者自己用变换矩阵去推,而推导出来的结果与直接测得的结果是否等价,本身就是一个需要数据来验证的问题。
第二个不够是采样率不够。250 Hz 的采样间隔是 4 毫秒,500 Hz 是 2 毫秒。QT 间期的手动测量差异本来就在几十毫秒量级,T 波终点在多数导联上是一段缓慢回到基线的斜坡,2 毫秒与 1 毫秒的分辨率差异,直接决定了自动化算法能不能稳定地锚定它。再往下,心室晚电位是 QRS 末端之后微伏级的高频碎裂信号,采样率不足会把它和量化噪声混在一起。
第三个不够是临床上下文不够。多数公开心电库给的是标签:正常、房颤、心梗、束支阻滞。标签能支撑分类任务,但支撑不了"为什么"。同一份标着心梗的心电图,是急性期还是陈旧期,梗死在下壁还是前侧壁,患者是否接受了溶栓、溶栓药物剂量多少、冠脉造影显示哪支血管狭窄多少——这些信息决定了模型的判读有没有可解释的临床依据。
1.2 三条常见的错误期待
第一条,期待它是"一个大规模训练集"。549 段、290 名受试者,深度模型一两轮就能记完。它在规模上属于小库,任何"用数据量换性能"的路线在这里都走不通(§1.6)。
第二条,期待它带"规整的标签列"。它的临床信息是头文件里的自由文本,中文语境里常说的"标签"在这里对应的是一段英文临床摘要。要做分类任务,得自己从摘要里抽诊断词并归一化成类别,这一步的工作量和一个数据清洗项目相当(§5.5)。
第三条,期待它的十五路信号都是"导联"。其中十二路是常规导联,三路是 Frank 正交导联,物理意义、电极位置、幅度量级都不一样,而且存放在另一个文件里(.xyz 而不是 .dat)。把它们当成十五个平权的输入通道喂进模型,是把两种不同性质的测量混为一谈(§2.3)。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 心梗与非心梗的判别研究 | 九个诊断类别中含心肌梗死与心肌病等,另设健康对照 | 够做判别研究,样本量不足以训大模型 |
| QT 间期与 T 波终点算法评测 | 1000 Hz、15 路同步、多数约两分钟 | 够,这是它最对口的一类任务 |
| 心向量图与导联变换研究 | 直接测得 vx、vy、vz,可与十二导联推导结果对照 | 够,且是公开库里少有的对照条件 |
| 十二导联到 Frank 导联的线性变换验证 | 同一时刻同时有两套测量 | 够,可把推导值与直接测得值直接比 |
| 心电设备的计量与噪声评估 | 采集设备带宽、噪声、输入电阻均有官方披露 | 够做方法学讨论,无原始设备可复现 |
| 心率变异性分析 | 单段约两分钟 | 不够,两分钟不足以支撑常规 HRV 指标 |
| 长时程心律失常检测 | 静息短段,最长约两分钟 | 不够,应改用长时程库 |
| 多中心泛化验证 | 单一国家、单一中心、单一原型设备 | 不够,只能做跨库验证 |
| 正常人群基线建模 | 设健康对照,且另有 CONTROLS 清单 | 边界:对照样本有限,且年龄结构偏大 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做 QT 间期自动测量,需要高分辨率数据验证算法 | 1000 Hz、十五路同步,可逐导联比较 T 波终点的差异 | 先按导联分组统计测量结果的离散度,再决定用哪一路做主判据 |
| 你在做心梗检测,手上只有标签级数据 | 有冠脉造影、心室造影、梗死定位等结构化程度更高的上下文 | 从头文件抽"Reason for admission"与"Acute infarction (localization)"字段建标签 |
| 你在研究十二导联与 VCG 的等价性 | 同一段记录同时给出两套测量 | 用 Kors 或逆 Dower 变换从十二导联推 VCG,与 .xyz 直接测得值逐点比较 |
| 你在评估心电采集链路的噪声底 | 官方披露噪声电压不超过 10 μV 峰峰值、3 μV 有效值 | 把该值作为设备规格边界写进方法学限制,不要当作每段记录的实际噪声 |
| 你需要"带完整临床背景的心电"做教学 | 头文件含诊断、用药、血流动力学、超声心动 | 选一两段摘要完整的记录做成教学案例,注意 22 名受试者无摘要 |
| 你想给模型加一个外部测试集 | 德国人群、非商用设备、1000 Hz,与常见训练库差异明显 | 按 patient 目录划分,绝不要按记录随机划分(§5.6) |
1.5 一句话判断
它不适合当"更大的训练集",而适合当"更细的尺":在毫秒级的时间刻度和三轴正交的空间刻度上,量出常规十二导联 250 Hz 数据里量不出来的东西。
1.6 不适合谁:四条边界
不适合拿来做大规模预训练。 549 段记录、1.7 GB,规模上属于小库。想用数据量堆性能的项目,在这里会立刻过拟合。
不适合拿来做长时程节律研究。 它是静息心电,多数约两分钟。房颤负荷、阵发性事件的昼夜分布、长程心率变异性,这些都不是它能回答的。
不适合拿来直接跑分类流水线。 没有现成的标签列,临床诊断以自由文本写在头文件里。抽标签、定类别口径、处理缺失摘要,这三步必须由使用者自己完成并写进方法学。
不适合拿来代表"当代临床心电"。 采集于 1990 年代前后的德国单一中心,用非商用原型机录制,至今只有一个版本。它可以做方法学的参照,不适合当作当代设备性能的参照系。
§2 数据构成与规格
2.1 一段记录至少由四个文件组成
数据库采用 WFDB(Waveform Database)格式,这是 PhysioNet 自 1980 年代沿用至今的生理信号存储规范。每一段记录对应同名的若干文件:.hea 是纯文本头文件,声明采样率、信号条数、增益、基线,并把临床摘要以注释行的形式附在末尾;.dat 是二进制信号本体,按采样点交错存放十二路常规导联的整数值;.xyz 是第二个二进制文件,存放三路 Frank 正交导联。
两个信号文件的分离容易被忽略。用 wfdb.rdrecord 读记录时,库会自动按头文件的声明把两个文件拼成一条 15 路的矩阵,但如果你自己按文件名去找数据,只拿 .dat 就会丢掉整个心向量图,只拿 .xyz 则连一份完整的十二导联都没有。
根目录还有四个附属文件,各自的角色不同:
| 文件 | 体积 | 目录内标注的修改日期 | 内容 |
|---|---|---|---|
RECORDS |
10.7 KB | 2004-09-25 | 549 行记录路径,形如 patient001/s0010_re |
CONTROLS |
1.6 KB | 2006-04-24 | 80 行健康对照记录的路径清单 |
README |
1.6 KB | 2004-08-05 | 采集者与机构信息、诊断类别列表、采集参数 |
SHA256SUMS.txt |
143.4 KB | 2019-02-20 | 全量文件的 SHA256 校验和 |
CONTROLS 是在数据库发布近两年后才加进去的,这说明"哪些记录属于健康对照"这件事在最初版本里并没有单独列出来。它是重要的边界信息,但也提醒使用者:健康对照的记录清单与"健康对照受试者人数"是两个不同口径,前者以记录计,后者以人计,README 与项目页在这两个数字上还各有一处不一致(§10)。
2.2 头文件的完整字段字典
本库的"字段"不是表格的列,而是 WFDB 头文件的记录行、信号行与注释行。下表逐条列出。
| 信息项 | 位置 | 形态 | 含义 | 使用注意 |
|---|---|---|---|---|
| 记录名 | 头文件第 1 行第 1 字段 | s0010_re |
记录标识 | 与文件名前缀一致 |
| 信号条数 | 头文件第 1 行第 2 字段 | 15 |
同步通道数 | 全部记录均为 15 |
| 采样率 | 头文件第 1 行第 3 字段 | 1000 |
每秒采样点数 | 与常见的 250/500 Hz 库不同 |
| 采样点数 | 头文件第 1 行第 4 字段 | 38400 / 115200 / 120012 |
记录长度 | 抽样头文件所见三种长度 |
| 数据文件名 | 信号行第 1 字段 | s0010_re.dat 或 s0010_re.xyz |
信号存放位置 | 前 12 行指向 .dat,后 3 行指向 .xyz |
| 存储格式 | 信号行第 2 字段 | 16 |
16 位带符号整数 | 不是浮点 |
| 增益 | 信号行第 3 字段 | 2000 |
A/D 单位每毫伏 | 抽样记录均为 2000,即 0.5 μV/LSB |
| 位分辨率 | 信号行第 4 字段 | 16 |
ADC 位数 | 与存储格式一致 |
| ADC 零值 | 信号行第 5 字段 | 0 |
零电平对应整数 | 换算时先减零值 |
| 初始值 | 信号行第 6 字段 | 如 -489 |
首采样点整数值 | 逐导联不同 |
| 校验和 | 信号行第 7 字段 | 如 -8337 |
采样点累加和 | 用于校验信号文件完整性 |
| 块大小 | 信号行第 8 字段 | 0 |
每帧字节数 | 0 表示由库自动计算 |
| 导联名 | 信号行第 9 字段 | i…v6、vx、vy、vz |
通道标识 | 顺序固定,15 行一一对应 |
| 年龄 | 注释行 | 如 81 |
记录时年龄 | 以 \# age: 开头,15 名受试者缺失 |
| 性别 | 注释行 | male / female |
受试者性别 | 以 \# sex: 开头 |
| 检查日期 | 注释行 | 如 01/10/1990 |
心电图采集日期 | 以 \# ECG date: 开头,日为月/日/年格式 |
| 入院原因 | 注释行 | 自由文本 | 主要临床诊断 | 以 \# Reason for admission: 开头 |
| 急性梗死定位 | 注释行 | 如 infero-latera |
梗死部位 | 以 \# Acute infarction (localization): 开头 |
| 既往梗死定位 | 注释行 | no 或部位 |
陈旧性心梗 | 以 \# Former infarction (localization): 开头 |
| 附加诊断 | 注释行 | 自由文本 | 合并症 | 如 Diabetes mellitus |
| 吸烟史 | 注释行 | no / yes / unknown |
吸烟状态 | 允许取值 unknown |
| 受累冠脉数 | 注释行 | 数字或 unknown |
病变血管数 | 以 \# Number of coronary vessels involved: 开头 |
| 梗死日期 | 注释行 | 日期或 n/a |
急性梗死发生日 | 既往梗死另有两栏 |
| 血流动力学 | 注释行组 | 数值或 n/a |
压力、心输出量、心指数等 | 十余项,缺失项统一写 n/a |
| 冠脉狭窄 | 注释行组 | 文本 | 左前降支、回旋支、右冠脉分别描述 | 含狭窄百分比与部位描述 |
| 治疗与用药 | 注释行组 | 文本 | 入院前、住院、出院后用药 | 以 \# Therapy: 分节 |
2.3 十五路通道的物理含义
十五路不是十五个并列的"导联",而是两套不同性质的测量在同一时间轴上对齐。
| 序号 | 通道名 | 存放文件 | 体系 | 物理含义 |
|---|---|---|---|---|
| 1–3 | i、ii、iii |
.dat |
常规十二导联 | 标准肢体导联,反映额面电轴 |
| 4–6 | avr、avl、avf |
.dat |
常规十二导联 | 加压肢体导联,额面电轴的补充切面 |
| 7–12 | v1–v6 |
.dat |
常规十二导联 | 胸导联,由右向左横扫心室前壁与侧壁 |
| 13 | vx |
.xyz |
Frank 正交导联 | 心向量图的 X 轴,左右方向 |
| 14 | vy |
.xyz |
Frank 正交导联 | 心向量图的 Y 轴,上下方向 |
| 15 | vz |
.xyz |
Frank 正交导联 | 心向量图的 Z 轴,前后方向 |
这十五路的采样是严格同步的。官方在采集设备规格里明确写了"0–1 kHz 带宽、所有通道同步采样",这句话的意义在于:任意两路之间不存在时间偏移,因此同一时刻的十五个采样值可以安全地组合成一个空间向量。如果各路不是同步采样,用它们去算瞬时心向量就会引入虚假的相位差。
增益的处理也值得单独说。抽样记录的十五路增益都是 2000,对应 0.5 μV 每最小可分辨单位,量程 ±16.384 mV——这个换算关系是自洽的:16 位带符号整数的范围是 ±32768,除以 2000 得到 ±16.384 mV。但增益是写在头文件里的值,逐条读取时仍应按头文件换算,而不是假定它恒为 2000。
2.4 一条记录的完整解剖
以 patient001 的 s0010_re 为例。头文件首行:
s0010_re 15 1000 38400
读作:记录名 s0010_re,15 路信号,1000 Hz,共 38400 个采样点。38400 ÷ 1000 = 38.4 秒。这一段属于较短的那批记录。
随后是 15 行信号声明,前十二行指向 .dat,后三行指向 .xyz:
s0010_re.dat 16 2000 16 0 -489 -8337 0 i
s0010_re.dat 16 2000 16 0 -458 -16369 0 ii
s0010_re.xyz 16 2000 16 0 -3 -13009 0 vx
s0010_re.xyz 16 2000 16 0 120 7109 0 vy
s0010_re.xyz 16 2000 16 0 -18 -1992 0 vz
从右往左读最后一行:通道名 vz;块大小 0;校验和 -1992;初始值 -18;ADC 零值 0;位分辨率 16;增益 2000;格式 16;文件 s0010_re.xyz。
再往后是临床摘要,分节组织:
\# age: 81
\# sex: female
\# ECG date: 01/10/1990
\# Diagnose:
\# Reason for admission: Myocardial infarction
\# Acute infarction (localization): infero-latera
\# Former infarction (localization): no
\# Additional diagnoses: Diabetes mellitus
\# Smoker: no
\# Number of coronary vessels involved: 1
\# Infarction date (acute): 29-Sep-90
连起来读:81 岁女性,1990 年 10 月 1 日检查,因心肌梗死入院,急性梗死位于下侧壁,无陈旧性梗死,合并糖尿病,不吸烟,一支冠脉受累,急性梗死发生于 1990 年 9 月 29 日。
摘要继续往下还有三节:血流动力学(导管检查日期、心室造影、胸片、外周血压、肺动脉压、主动脉压、左室舒张末压、各支冠脉狭窄情况、超声心动);治疗(梗死日期、导管日期、入院日期、入院前用药、溶栓开始时刻、溶栓药物与剂量、附加用药、住院用药、出院后用药)。这几节里大量字段取值为 n/a,表示该项未做或未记录。
标准读取写法:
import wfdb
#-- 远程直读,无需先下载;pn_dir 指向 PhysioNet 上的库名
rec = wfdb.rdrecord('s0010_re', pn_dir='ptbdb/1.0.0/patient001')
hdr = wfdb.rdheader('s0010_re', pn_dir='ptbdb/1.0.0/patient001')
print(rec.fs, rec.sig_len) #-- 1000 38400
print(rec.sig_name) #-- ['i','ii','iii','avr','avl','avf','v1'...'vx','vy','vz']
print(rec.p_signal.shape) #-- (38400, 15) 已按增益换算成毫伏
print(rec.units) #-- 全部为 'mV'
#-- 临床摘要是一组字符串,逐行拆开后自行解析
for c in hdr.comments[:12]:
print(c)
p_signal 是按增益与零值换算过的浮点毫伏值;要原始整数用 d_signal。注意 pn_dir 必须写到 patient 子目录,本库的记录不在根目录,这是与 MIT-BIH 系列库一个容易混淆的差别。
2.5 与同类库在字段口径上的差异
把本库与站内常见的两个心电库放在一起,可以看出字段口径的差别集中在三处:导联体系、采样率、临床信息的载体。
| 维度 | PTB 诊断级心电库(本库) | PTB-XL | MIT-BIH 心律失常库 |
|---|---|---|---|
| 记录数 | 549 | 21799 | 48 |
| 受试者数 | 290 | 18869 | 47 |
| 导联体系 | 12 常规 + 3 Frank | 12 常规 | 2(多为改良肢体导联) |
| 采样率 | 1000 Hz | 500 Hz 与 100 Hz 两版 | 360 Hz |
| 单段时长 | 多数约两分钟 | 10 秒 | 约 30 分钟 |
| 临床信息载体 | 头文件自由文本临床摘要 | 结构化 CSV 与 SCP 声明编码 | 基本无 |
| 标注粒度 | 记录级临床摘要,无逐搏标注 | 记录级诊断语句 | 逐搏注释 |
| 许可 | ODC-BY 1.0 | CC BY 4.0 | ODC-BY 1.0 |
| 下载体积 | 1.7 GB | 数 GB 量级 | 数十 MB |
这张表要说明的不是优劣,而是任务分工:要逐搏心搏分类,去 MIT-BIH 系列;要做大规模诊断分类,去 PTB-XL 一类的大库;要把时间刻度压到毫秒、把空间刻度扩到三轴、并且要求为每一次判读给出可追溯的临床依据,才是本库的位置。
2.6 目录结构与命名规则
全库按受试者分目录,每个受试者一个 patientNNN 目录,编号从 patient001 到 patient294,官方明确说明不存在 124、132、134、161 四个编号,因此实际目录数为 290 个,与受试者数一致。
记录名以 s 加四位数字开头,后接一个后缀。抽样记录名里出现过四种形态:
| 后缀形态 | 示例 | 抽样所见记录长度 |
|---|---|---|
_re |
s0010_re、s0222_re |
38400(38.4 秒)或 120012(120.012 秒) |
lre |
s0014lre、s0015lre |
115200(115.2 秒) |
are |
s0020are、s0204are |
115200(115.2 秒)或 38400(38.4 秒) |
bre |
s0020bre、s0021bre |
未见抽样 |
同一受试者目录下的 a/b 后缀成对出现(如 patient004 的 s0020are 与 s0020bre),说明同一次就诊被拆成了两个文件。这一点在划分数据集时很关键:同一次就诊的两段记录之间的相关性,远高于不同就诊之间的相关性。
§3 它是谁的数据
3.1 贡献者:一家计量院,不是一家医院
捐赠方是 Physikalisch-Technische Bundesanstalt,德国的国家计量研究院。这个身份决定了它的气质:它不是医院顺手导出的临床数据,而是一份由计量机构按"可追溯、可复现"的标准整理出来的参考资料。官方对项目用途的措辞是"用于研究、算法基准测试或教学"。
原始心电由 Michael Oeff 教授在柏林自由大学 Benjamin Franklin 大学诊所心内科采集,受试者包括健康志愿者与各类心脏病患者。Oeff 教授后来的工作单位是勃兰登堡的 Klinikum Brandenburg 心内科。
为 PhysioNet 制备这份数据的是四个人:PTB 的 Hans Koch(教授、博士)、Ralf Bousseljot(工学博士)、Dieter Kreiseler(工学博士),以及来自夏里特医学院 Virchow 院区与德国心脏中心的 Lothar Schmitz 医生。这个组合本身也说明问题:三名前两名的工程师加一名临床医生,工程规格与临床解释两头都有人负责。
3.2 时间线
| 时间 | 事件 | 依据 |
|---|---|---|
| 1995 | Bousseljot、Kreiseler、Schnabel 发表 CARDIODAT 心电信号数据库论文 | 官方引用文献 |
| 1995 | Kreiseler 与 Bousseljot 发表基于 CARDIODAT 的自动心电分析论文 | 官方引用文献 |
| 2004-08-05 | 根目录下的 README 修改日期 |
文件目录 |
| 2004-09-25 | 版本 1.0.0 发布,RECORDS 同日 |
官方页面 |
| 2006-04-24 | CONTROLS 健康对照清单加入 |
文件目录 |
| 2006 | PhysioNet/CinC 2006 挑战赛(QT 间期测量)全部采用本库 549 段记录 | 挑战赛论文 |
| 2019-02-20 | SHA256SUMS.txt 校验和文件更新 |
文件目录 |
| 至今 | 仍只有 1.0.0 一个版本 | 官方页面版本列表 |
这条时间线里最值得注意的是两件事。一是它从 2004 年到今天没有出过第二个版本——不是被遗忘,而是原始采集已经结束,没有新数据可加。二是它发布两年后就被 CinC 挑战赛选作唯一数据源,说明它在采样率上的优势从一开始就被社区认出来了。
3.3 采集场景:一台原型机,一套完整公开的规格
官方把采集设备的规格完整列了出来,这在公开心电库里是罕见的:
| 规格项 | 官方数值 |
|---|---|
| 输入通道数 | 16(其中心电 14 路、呼吸 1 路、线电压 1 路) |
| 输入电压范围 | ±16 mV |
| 可补偿失调电压 | 最高 ±300 mV |
| 输入电阻 | 100 Ω(直流) |
| 分辨率 | 16 位,0.5 μV/LSB(2000 A/D 单位每毫伏) |
| 带宽 | 0–1 kHz,所有通道同步采样 |
| 噪声电压 | 峰峰值最大 10 μV,短路输入时有效值 3 μV |
| 附加记录 | 皮肤电阻在线记录;采集期间同步记录噪声电平 |
最后两项容易被忽略,但它们是"计量院风格"的最好说明:设备在采集心电的同时,把皮肤电阻和当时的噪声电平也录了下来。这意味着研究者原则上可以知道某一段记录的电极接触质量如何、采集时的噪声环境如何。这两路信号不在发布的十五路里,官方也未说明它们是否可随记录一并取得(§10)。
3.4 来源层次:三层结构要分清
| 层次 | 内容 | 可追溯性 |
|---|---|---|
| 第一层:原始采集 | 柏林 Benjamin Franklin 大学诊所心内科的静息心电 | 由 Oeff 教授采集,采集年份见头文件的 ECG date |
| 第二层:整理与捐赠 | PTB 数字化、整理、加临床摘要,提交 PhysioNet | 制备者四人名单明确 |
| 第三层:平台托管 | PhysioNet 托管、分配 DOI、声明许可 | DOI 10.13026/C28C71,ODC-BY 1.0 |
三层分清楚有一个实际用途:引用时要分别致谢。官方明确要求使用本资源时引用 1995 年的原始论文,并同时引用 PhysioNet 平台论文。把这两条引全,是对第一层与第二层贡献者的正确归属。
§4 它最独特的东西
4.1 稀缺性:十五路同步,且其中三路是直接测得的正交导联
公开心电库里,给十二导联的不少,给心向量图的极少。给两套、并且保证同步的,几乎只有这一个。这个组合的价值要靠具体研究问题才能说清楚。
十二导联与 Frank 正交导联之间存在线性变换关系,研究者常用 Kors 变换或逆 Dower 变换,从常规十二导联推算出三轴心向量。这类变换是近似:推导出来的 VCG 与真正测得的 VCG 在形态上相似,但在幅度、电轴角度、环体细节上会有偏差。要评估这个偏差有多大,唯一可靠的办法就是拿同一颗心脏的两种测量直接对比——这正是本库提供的条件。
| 研究问题 | 只用十二导联能做到吗 | 本库能提供什么 |
|---|---|---|
| 十二导联能否推导出可用的 VCG | 不能验证,只能假设 | 同一时刻的直接测得值作为参照 |
| QRS/T 环的空间形态分析 | 需先推导,误差不可知 | 直接测得,误差仅来自设备 |
| 常规导联与正交导联的诊断一致性 | 做不到 | 两套测量可对同一判读做交叉验证 |
| 导联数目对分类性能的影响 | 可做,但空间信息不完整 | 可在 12 与 15 之间做消融 |
4.2 差异化证据:1000 Hz 带来的毫秒级刻度
1000 Hz 是 1 毫秒一个点。官方还说明,向贡献者特别申请可以取得最高 10 kHz 的记录。这个上限意味着原始采集链路的带宽不是瓶颈,发布的 1000 Hz 是为了兼顾体积与通用性的选择。
毫秒级刻度最直接受益的是波形边界的测量:QRS 起点、QRS 终点、T 波终点、QT 间期。PhysioNet/CinC 2006 挑战赛的主题就是 QT 间期测量,而它的数据全部来自本库——这不是巧合,是当时公开数据里少有能满足该任务分辨率要求的库。挑战赛的一篇参赛论文明确写道:本库记录通常约两分钟长,少数更短,没有短于 30 秒的。
4.3 具体案例:一段记录里能读出多少临床
回到 s0010_re。它的临床摘要里有这样几行:
\# Reason for admission: Myocardial infarction
\# Acute infarction (localization): infero-latera
\# Number of coronary vessels involved: 1
\# Infarction date (acute): 29-Sep-90
\# Therapy:
\# Start lysis therapy (hh.mm): 19:45
\# Lytic agent: Gamma-TPA
\# Dosage (lytic agent): 30 mg
这几行连起来给了一个完整的临床叙事:1990 年 9 月 29 日发生急性下侧壁心肌梗死,当天入院,晚上 19 点 45 分开始溶栓,用的是 Gamma-TPA,剂量 30 毫克;10 月 1 日的心电图是溶栓后第二天的记录;10 月 16 日做了导管检查,心室造影显示下壁运动消失,冠脉造影显示左前降支在第二对角支发出之前近段狭窄 70%,回旋支与右冠脉无狭窄。
一个数据集能把"心电图"与"这份心电图是在什么临床背景下被采集的"绑定得这么紧,是它区别于标签级数据集的根本之处。研究者可以据此把心电图特征与梗死部位、罪犯血管、再灌注治疗时间一一对应起来,而不是停在一个"心梗/非心梗"的二分类上。
4.4 标注粒度:记录级临床摘要,而不是逐搏注释
本库没有 .atr 注释文件,也没有逐搏心搏标注。它的"标注"是记录级的临床摘要。这个粒度决定了它适合什么任务、不适合什么任务。
| 标注层次 | 本库是否提供 | 由此决定了什么 |
|---|---|---|
| 逐搏心搏类型 | 不提供 | 不能做心搏分类,也不能算心搏级别的形态统计 |
| 节律段标注 | 不提供 | 不能做节律分段与长程负荷评估 |
| 波形界标(QRS/T 波终点) | 不提供 | 界标要自己检测,这也是 QT 挑战赛把它设为题目的原因 |
| 记录级诊断 | 提供,自由文本 | 可做记录级分类,但需自行抽取与归一化 |
| 记录级临床上下文 | 提供,分节自由文本 | 可做临床关联分析,字段缺失需逐条处理 |
4.5 边界条件:官方自己划出的几条线
第一,22 名受试者没有临床摘要。这不是字段缺失,是整个摘要块不存在。任何依赖诊断信息的研究都必须先把这 22 人剔除或单独处理。
第二,268 名受试者被归入九个诊断类别:心肌梗死、心肌病/心力衰竭、束支阻滞、心律失常、心肌肥厚、瓣膜病、心肌炎、杂项、健康对照。官方给出的是类别划分,不是一张可以直接 read_csv 的标签表。
第三,15 名受试者未记录年龄(1 名女性、14 名男性)。做年龄分层研究时,这 15 人要单独处理。
第四,受试者编号不连续:124、132、134、161 四个编号不存在。按整数区间切分数据集的代码会踩到这个坑。
第五,健康对照的口径有两个:CONTROLS 文件按记录列了 80 行,README 与项目页按人分别写了 54 与 52。三者不是同一个东西,混用会造成对照集大小的差异(§10)。
§5 怎么拿到
5.1 目录结构
ptbdb/1.0.0/
├── RECORDS #-- 549 行记录路径
├── CONTROLS #-- 80 行健康对照记录路径
├── README #-- 采集与制备信息
├── SHA256SUMS.txt #-- 全量校验和
├── ptb.png #-- 缩略图
├── patient001/
│ ├── s0010_re.hea
│ ├── s0010_re.dat
│ ├── s0010_re.xyz
│ ├── s0014lre.hea
│ └── ...
├── patient002/
└── patient294/
注意 patient124、patient132、patient134、patient161 四个目录不存在,遍历时不要假设编号连续。
5.2 四种下载方式
#-- 方式一:PhysioNet 官方命令行工具
physionet download ptbdb --version 1.0.0
#-- 方式二:递归 wget,适合断点续传
wget -r -N -c -np https://physionet.org/files/ptbdb/1.0.0/
#-- 方式三:AWS 公开桶,带宽通常更好
aws s3 sync --no-sign-request s3://physionet-open/ptbdb/1.0.0/ ./ptbdb
#-- 方式四:整包 ZIP,解压后 1.7 GB
#-- 从项目页 "Download the ZIP file" 获取
四种方式里,如果只需要临床摘要而不需要波形,最省事的做法是只拉 .hea 文件:549 个头文件都是几 KB 的纯文本,全量不超过几 MB,而 .dat 与 .xyz 占了 1.7 GB 里的绝大部分。
5.3 流式读取与按患者分组
import wfdb
import numpy as np
from sklearn.model_selection import GroupShuffleSplit
#-- 读 RECORDS 拿到全部 549 条记录路径
paths = [l.strip() for l in open('RECORDS') if l.strip()]
groups = [p.split('/')[0] for p in paths] #-- patient001 ... patient294
#-- 按受试者分组划分:同一 patient 目录绝不跨训练/测试
gss = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=0)
tr, te = next(gss.split(paths, groups=groups))
print(len(tr), len(te), len(set(groups[i] for i in te)))
这段代码的要点在 groups。本库同一受试者有 1 至 5 段记录,同一次就诊还可能拆成 a/b 两个文件;若按记录随机划分,测试集里会出现训练集中同一颗心脏的兄弟记录,成绩虚高且无法外推。
5.4 从头文件抽标签
import re, glob, os
def parse_summary(path):
#-- 临床摘要是注释行,形如 "# Reason for admission: Myocardial infarction"
d = {}
for line in open(path, encoding='utf-8', errors='replace'):
if not line.startswith('#'):
continue
if ':' not in line:
continue
k, v = line.lstrip('#').split(':', 1)
d[k.strip().lower()] = v.strip()
return d
rows = []
for hea in sorted(glob.glob('patient*/**/*.hea', recursive=True)):
d = parse_summary(hea)
rows.append({
'record': os.path.basename(hea)[:-4],
'patient': os.path.basename(os.path.dirname(hea)),
'age': d.get('age'),
'sex': d.get('sex'),
'reason': d.get('reason for admission'),
'acute_loc': d.get('acute infarction (localization)'),
})
reason for admission 是最接近"标签"的一列,但它仍然是自由文本:同一个临床含义可能写成不同字符串,需要再做一次归一化。抽取后应先看取值集合的规模再决定映射规则,不要凭几条样例就写死规则。
5.5 标签口径的三个层次与官方不一致
| 口径 | 载体 | 规模 | 适用场景 |
|---|---|---|---|
| 健康对照记录清单 | CONTROLS 文件 |
80 行记录路径 | 直接拿到一组对照记录 |
| 诊断类别 | 项目页数据描述 + README | 268 名受试者分入九个类别 | 需要类别划分时以此为框架 |
| 逐例临床摘要 | 每个 .hea 的注释行 |
大多数记录有,22 名受试者无 | 需要临床上下文时逐条解析 |
三个口径不可互换。特别要提醒的是,README 与项目页在两处数字上不一致:杂项类别 README 写 5 名、项目页写 4 名;健康对照 README 写 54 人、项目页写 52 人。以哪一处为准取决于你的引用偏好,但必须在论文里写清引用的是哪一份文件(§10)。
5.6 五个坑
坑一:把 15 路当 15 个导联。 后三路是 Frank 正交导联,物理含义与常规导联不同,且存在另一个文件里。做消融实验时,应把"12 路"与"15 路"作为两种配置分别报告,而不是把某一路单独删掉。
坑二:把采样率当 250 或 500。 1000 Hz 的信号直接送进按 500 Hz 设计的前端,等于在时间轴上做了二倍降采样而不自知。跨库混合训练前必须统一重采样。
坑三:忽略患者编号不连续。 缺失的编号是 124、132、134、161。任何 range(1, 295) 式的遍历都会在这四个位置报错。
坑四:按记录而不是按受试者划分。 同一受试者最多 5 段、同一次就诊可能拆成两个文件,随机划分会造成严重泄漏(§5.3)。
坑五:把 n/a 当缺失值直接丢弃或当零值。 血流动力学那一节里大量字段是 n/a,含义是"该项未做或未记录",与"数值为零"完全不同。当成零值参与计算会得到错误的统计量。
§6 与库内其他数据集的关系
6.1 关系图谱
在心电类数据集里,可以用"导联数 × 采样率 × 单段时长"三个轴把本库的位置摆出来:
| 站内数据集 | 导联 | 采样率 | 单段时长 | 与本库的关系 |
|---|---|---|---|---|
| PTB-XL | 12 | 500 Hz / 100 Hz | 10 秒 | 同名机构、同为十二导联,但采集年代、人群与设备不同 |
| PTB-XL+ | 12 | 500 Hz | 10 秒 | 在 PTB-XL 之上做特征增强,与本库无数据继承关系 |
| INCART 心律失常库 | 12 | 257 Hz | 30 分钟 | 互补:它长而本库宽且细 |
| MIT-BIH 心律失常库 | 2 | 360 Hz | 约 30 分钟 | 互补:逐搏标注在本库完全没有 |
| MIT-BIH 房颤库 | 2 | 250 Hz | 10 小时 | 互补:长时程节律任务归它 |
| Georgia 十二导联挑战库 | 12 | 500 Hz | 10 秒 | 对照:同为十二导联短段,人群不同 |
| WCTECGdb | 37 | 高分辨率 | 短段 | 对照:直接测量威尔逊中心电端,同属多通道精细采集 |
| 本库 | 15(含 3 路 Frank) | 1000 Hz | 多数约两分钟 | 三轴上同时不低的少数几个之一 |
6.2 检索路径
| 你要找的东西 | 检索词 | 会落到哪里 |
|---|---|---|
| 大规模十二导联诊断分类 | PTB-XL、12-lead、18869 |
§6.1 表与 §2.5 |
| 逐搏心搏标注 | MIT-BIH、atr、beat annotation |
§4.4 说明本库不含此项 |
| 十二导联长时程 | INCART、30 min、12-lead |
§6.1 表 |
| 心向量图与正交导联 | Frank、VCG、xyz |
§2.3 与 §4.1 |
| QT 间期与波形界标 | QT、T-wave end、challenge-2006 |
§4.2 与 §8.2 |
| 高分辨率多通道直接测量 | WCT、Wilson central terminal |
§6.1 表 |
| 噪声与鲁棒性评测 | NSTDB、noise stress |
§7.3 |
6.3 与其他库的分工判据
选数据集时最实际的问题不是"哪个最好",而是"哪个负责哪一段"。下表把常见心电任务逐项拆开:
| 任务 | 主粮仓该用什么 | 本库的位置 | 原因 |
|---|---|---|---|
| 大规模诊断分类预训练 | 万级以上的十二导联库 | 不适用 | 549 段训不动 |
| QT 间期与 T 波终点测量 | 无可替代 | 主力 | 1000 Hz 且十五路同步 |
| 心向量图与导联变换 | 无可替代 | 主力 | 唯一同时给出两套测量 |
| 心梗检测与梗死定位 | 大规模十二导联库 | 主力之一 | 有冠脉造影与梗死定位上下文 |
| 心搏形态分类 | MIT-BIH 系列 | 不适用 | 无逐搏标注 |
| 长时程房颤检测 | 长时程房颤库 | 不适用 | 单段约两分钟 |
| 噪声鲁棒性评测 | 专用噪声库 | 辅助 | 设备噪声规格已知,但无噪声通道随记录发布 |
| 多中心泛化验证 | 多中心库 | 不适用 | 单一国家、单一中心 |
| 跨库外部测试 | 任意与训练库异质的库 | 主力之一 | 德国人群、非商用设备、1000 Hz,异质性强 |
这张表的读法是:本库只在三行上是"主力",且这三行都是别处真的难以替代的。把它的价值安放在这三行上,是正确使用它的前提;把它当成"又一个十二导联库"去和万级数据比规模,则是常见的误判。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
先纠正一个常见误判:把"只有一个版本、二十年没更新"当成"维护得不好"。本库的数据来源是一次已经结束的临床采集,没有新的受试者可加,版本不变是数据性质决定的,不是维护懈怠。评价它时应问的问题是:在它负责的那几个任务上,它的规格够不够?
这个校正会改变评分的读法。规模一项它拿不到高分,但在"时间与空间分辨率"上它几乎没有对手。把这两件事混在一起,会得出"不值得用"的错误结论。
7.1 五维评分
按常用数据集评估维度打分,每项 1–5 分,分数针对"作为心电算法研究数据"这个用途:
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据规模 | 2 | 549 段、290 名受试者,训练不足,测试与验证够用 |
| 采集规格 | 5 | 1000 Hz、16 位、十五路同步,设备规格完整披露 |
| 临床上下文 | 4 | 逐例临床摘要深度罕见,但 22 名受试者缺失且为自由文本 |
| 标注可用性 | 2 | 无结构化标签列,无逐搏标注,需自行抽取与归一化 |
| 人群与中心多样性 | 2 | 单一国家、单一中心、单一原型设备、人群年龄偏大 |
7.2 两层信息的质量差异
本库的信息质量是分层的,两层之间差距很大。
信号层质量高。 采样率、位分辨率、带宽、同步性、噪声规格都有官方说明,且这些说明来自计量机构。就"这段波形本身可不可信"而言,它的可追溯性在公开心电库里属于第一梯队。
标注层质量取决于使用者的加工。 临床摘要是自由文本,没有统一的取值字典。同一个概念在不同记录里的写法可能不同,缩写、拼写变体、空值表示(n/a、unknown、no)混在一起。这层的质量不是官方保证的,是由使用者抽取规则的水平决定的。
两层之间的落差是使用本库的主要工作量所在:拿到信号很容易,把信号与可信的标签对齐很难。
7.3 可枚举的偏差来源
| 偏差来源 | 具体表现 | 影响 |
|---|---|---|
| 人群偏差 | 单一国家、单一中心,年龄 17–87 岁且平均 57.2 岁 | 结论外推到其他人群需谨慎 |
| 设备偏差 | 非商用原型机,与商用设备的滤波与基线处理策略不同 | 波形细节与当代设备不完全可比 |
| 性别偏差 | 209 名男性、81 名女性 | 性别分层分析时样本不对称 |
| 诊断构成偏差 | 心肌梗死在九个类别中占比最大 | 做二分类时正负样本量级需自行核对 |
| 缺失偏差 | 22 名受试者无临床摘要、15 名无年龄 | 依赖这些字段的分析会静默丢样本 |
| 采集年代偏差 | 临床实践与用药方案与当代不同 | 用药字段不能直接套用当代指南解读 |
| 泄漏偏差 | 同一受试者 1–5 段、同次就诊可能拆成两个文件 | 按记录随机划分会显著虚高成绩 |
7.4 外部验证:挑战赛给出的背书
本库最有力的外部验证不是论文引用数,而是 PhysioNet/CinC 2006 挑战赛把它选作唯一数据源。挑战赛论文里对数据的描述与项目页一致,并补充了项目页没有的信息:记录通常约两分钟长,少数更短,没有短于 30 秒的;论文作者把原始 549 段从 1000 Hz 降采样到 250 Hz 后处理,幅度分辨率保持不变。
这段描述有两个实用含义。第一,"约两分钟"这个时长口径来自挑战赛文献而非项目页,引用时应写清出处。第二,连当年的参赛者都要先降采样到 250 Hz 才能复用既有算法,说明 1000 Hz 在 2006 年是"超前"的规格——今天算力与存储都不再是瓶颈,这个规格反而成了它的优势。
7.5 为什么它至今仍在被用
官方页面记录它被 48 篇出版物引用,最新的一批涉及心电向量标志物的可重复性审计、通用心电压缩模型、心律失常检测的综述等。
它持续被用的原因是结构性的,不是情怀性的:凡是要在毫秒量级上定位波形边界、或要在三维空间里描述心电向量的研究,都需要一个同时具备高采样率与正交导联的数据集,而这类数据集在二十多年里并没有新增几个。规模大的库不断出现,但它们并不覆盖这个特定的格子。
§8 生态位与历史
8.1 沿革:从 CARDIODAT 到 PhysioNet
本库的前身是 PTB 的 CARDIODAT 心电信号数据库。1995 年 Bousseljot、Kreiseler 与 Schnabel 发表论文,介绍通过互联网使用 CARDIODAT;同年 Kreiseler 与 Bousseljot 又发表了基于该库的自动心电分析工作。九年之后,整理好的版本以 PhysioBank 新库的身份在 PhysioNet 上线。
这条沿革解释了两件事。一是为什么临床摘要写得那么细——它本来就是为临床与工程联合分析设计的,不是为了机器学习。二是为什么没有逐搏标注——CARDIODAT 体系的目标是诊断级的心电判读与自动分析,不是心搏计数的基准。
8.2 与挑战赛:一次被完整采用的经历
PhysioNet/CinC 2006 挑战赛的主题是 QT 间期测量,数据全部来自本库的 549 段记录。这个选择本身就是对数据规格的背书:QT 间期测量的参考标准需要人工或半人工精标,而对 15 路、1000 Hz、约两分钟的记录做精标,在当时是可行的。
挑战赛文献还留下了一条方法学信息:参赛者普遍只取每段记录的前 30 秒处理。这意味着如果今天有人要对齐当年挑战赛的结果,应把对齐范围限定在前 30 秒,而不是整段。
8.3 生态位:三个轴上的唯一交集
| 轴 | 本库取值 | 常见库的取值 | 交集稀缺性 |
|---|---|---|---|
| 采样率 | 1000 Hz(可申请至 10 kHz) | 250 / 500 Hz | 高分辨率库少 |
| 导联体系 | 12 常规 + 3 Frank | 12 常规或 1–3 路 | 带正交导联的库少 |
| 临床上下文 | 逐例多节临床摘要 | 标签或无 | 深度上下文库少 |
| 三轴同时满足 | 是 | 罕见 | 这是它的生态位 |
8.4 谁在用
| 角色 | 用法 | 关心什么 |
|---|---|---|
| 心电算法研究者 | QT 检测、波形界标、心梗分类 | 采样率与临床上下文 |
| 心向量图研究者 | Frank 导联与导联变换验证 | 十二导联与 VCG 的同步对照 |
| 医学计量与设备工程 | 采集链路规格、噪声底、同步性 | 设备规格的完整披露 |
| 心电教学 | 带完整临床背景的真实案例 | 摘要的可读性与完整性 |
| 临床信息学 | 从自由文本临床摘要抽结构化标签 | 抽取规则的可靠性 |
§9 使用指引
9.1 三种角色的最短路径
| 角色 | 第一步 | 第二步 | 第三步 |
|---|---|---|---|
| 算法工程师(QT / 界标) | 只拉头文件确认时长与通道 | 按 patient 目录分组划分 | 用 1000 Hz 直接建模,不要先降采样 |
| 研究者(VCG / 导联变换) | 同时读 .dat 与 .xyz |
用变换矩阵从十二导联推 VCG | 与 .xyz 直接测得值逐点比较 |
| 临床信息学(标签工程) | 全量解析 549 个头文件 | 看 reason for admission 取值集合再定映射 |
剔除 22 名无摘要受试者并记录剔除依据 |
9.2 最短上手流程
import wfdb
#-- 1. 远程读一条记录(不必先下载 1.7 GB)
rec = wfdb.rdrecord('s0010_re', pn_dir='ptbdb/1.0.0/patient001')
X = rec.p_signal #-- (38400, 15) 毫伏
twelve, frank = X[:, :12], X[:, 12:] #-- 十二导联与 Frank 三路分开
#-- 2. 降采样前先想清楚:本库的价值就在 1000 Hz
#-- 若要对齐 CinC 2006,只取前 30 秒
head = twelve[:30 * 1000]
#-- 3. 临床摘要单独解析,不要指望有标签列
hdr = wfdb.rdheader('s0010_re', pn_dir='ptbdb/1.0.0/patient001')
print([c for c in hdr.comments if 'Reason' in c or 'age' in c])
9.3 引用方式
使用本资源时,官方要求引用原始论文,并同时引用 PhysioNet 平台论文:
| 引用对象 | 文献 |
|---|---|
| 原始数据库 | Bousseljot R, Kreiseler D, Schnabel A. Nutzung der EKG-Signaldatenbank CARDIODAT der PTB über das Internet. Biomedizinische Technik, Band 40, Ergänzungsband 1 (1995) S 317 |
| 相关方法学 | Kreiseler D, Bousseljot R. Automatisierte EKG-Auswertung mit Hilfe der EKG-Signaldatenbank CARDIODAT der PTB. Biomedizinische Technik, Band 40, Ergänzungsband 1 (1995) S 319 |
| 数据版本 | PTB Diagnostic ECG Database v1.0.0,DOI 10.13026/C28C71 |
| 托管平台 | Pollard T, Moody BE, Lehman L, 等. PhysioNet as a global platform for biomedical research. Nature Health (2026) |
| 许可 | Open Data Commons Attribution License v1.0(ODC-BY 1.0) |
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| 文本生成 | 全文由人工智能模型撰写,经三道机检闸门(结构与 frontmatter、文风与禁词、数字纪律与链接一致性)校验 |
| 数字来源 | 全部规模、结构、边界数字来自 PhysioNet 项目页 https://physionet.org/content/ptbdb/1.0.0/ 与文件目录 https://physionet.org/files/ptbdb/1.0.0/ ,包括 RECORDS、CONTROLS、README 与抽样头文件 |
| 文件核验 | 已核验 RECORDS 为 549 行、覆盖 290 个 patient 目录;CONTROLS 为 80 行;抽样 30 个头文件确认 15 路、1000 Hz、增益 2000,并见到 38400、115200、120012 三种采样点数 |
| 不一致说明 | 项目页导言写 294 名受试者、数据描述写 290 名,正文采用 290 并以 RECORDS 覆盖目录数交叉确认;README 写杂项 5 名、健康对照 54 人,项目页写 4 名与 52 人;CONTROLS 按记录计 80 行,与按人计的两个数字口径不同 |
| 论文信息 | 引用文献、挑战赛沿革与设备规格均取自官方页面与 PhysioNet/CinC 2006 挑战赛公开论文摘要,未阅读全文 |
| 未核验内容 | 每类诊断的受试者人数未逐项引用;呼吸通道与线电压通道是否随记录发布未提供说明;皮肤电阻与噪声电平记录是否在文件中可得未核实;各记录的信噪比与噪声段分布需下载全量后计算,本文未做;10 kHz 版本的申请流程与实际可用性未核实 |
| 图像 | 封面图由文生图模型依据 frontmatter 中的提示词生成,不含真实受试者信息 |
| 免责 | 本文为数据集说明,不构成医疗建议;数据集不得用于临床诊断 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 它和 PTB-XL 是同一个库的不同版本 | 不是,两者采集年代、设备、人群、标注口径均不同 | §2.5 对照表、§6.1 |
| 它有 15 个常规导联 | 12 个常规导联加 3 个 Frank 正交导联 | §2.3 通道表、头文件后三行指向 .xyz |
| 它是长时程动态心电数据 | 静息心电,多数约两分钟,无短于 30 秒者 | CinC 2006 挑战赛论文描述 |
| 它有逐搏心搏标注 | 没有,无 .atr 注释文件,标注是记录级临床摘要 |
§4.4 |
| 可以直接读出诊断标签列 | 诊断是头文件里的自由文本,需自行抽取归一化 | §2.2、§5.4 |
| 受试者编号从 001 连续到 294 | 缺 124、132、134、161 四个编号,实际 290 个目录 | 官方数据描述、RECORDS |
| 每段记录长度一致 | 抽样见到 38400、115200、120012 三种采样点数 | 抽样头文件首行 |
| 增益可以假定为固定值 | 值写在头文件里,抽样均为 2000,仍应逐条按头文件换算 | §2.3、§2.4 |
| 按记录随机划分训练测试集没问题 | 同一受试者 1–5 段、同次就诊可能拆成两文件,会泄漏 | §5.3、§7.3 |
血流动力学字段的 n/a 等于零 |
n/a 表示未做或未记录,与零值完全不同 |
§2.4、§5.6 坑五 |
| 1000 Hz 是它唯一的可用采样率 | 官方称向贡献者特别申请可取得最高 10 kHz | 官方数据描述 |
| 1.7 GB 是压缩后体积 | 是解压后体积,但只拉头文件可省下绝大部分流量 | 官方文件页面 |
FAQ
Q1:它的 549 段记录到底来自 290 人还是 294 人?
官方页面自身有两处不一致:开头的导言写 294 名受试者,数据描述段写 290 名,并明确说明不存在 124、132、134、161 四个编号。用 RECORDS 文件核验,549 行记录路径覆盖 290 个不重复的 patient 目录,与 290 这一数字一致。正文统一采用 290,并在 §10 记录这处不一致。若你的论文要引用受试者数,建议写明引用的是数据描述段并附注导言的异文。
Q2:我只需要诊断标签,不想下载 1.7 GB,可以吗?
可以。549 个 .hea 头文件都是几 KB 的纯文本,全量只有几 MB,临床摘要就在其中。用 wget 只拉 .hea 后缀,或在 AWS 桶上用 --exclude 排除 .dat 与 .xyz 即可。需要注意两点:一是 22 名受试者没有临床摘要,抽取后会少一批样本;二是摘要是自由文本,抽取后仍需归一化。
Q3:它和 PTB-XL 到底该怎么选?
看任务的时间与空间刻度。做大规模诊断分类、需要上万条样本、需要结构化标签表,选 PTB-XL:它有 21799 段记录、18869 名患者、10 秒十二导联、500 Hz 与 100 Hz 两版、CC BY 4.0 许可。做 QT 间期测量、波形界标、心向量图与导联变换、需要毫秒级刻度与三轴正交测量,选本库:1000 Hz、十五路同步、附逐例临床摘要。两者不是新旧关系,也不共享记录。
Q4:为什么它二十年只有一个版本?
因为原始采集已经结束。数据来自柏林一所大学诊所心内科在特定年份采集的静息心电,没有新增受试者的机制,也没有重新采集的计划。目录里的两次文件改动是补充性的:2006 年加入 CONTROLS 清单,2019 年更新 SHA256SUMS.txt。版本不变在这里是数据性质的体现,不是维护状态的问题。
Q5:十五路能直接当十五个通道喂进模型吗?
技术上可以,语义上不建议。前十二路是常规导联,反映体表特定方向的电位差;后三路是 Frank 正交导联,构成心向量图的三个轴。它们的电极位置、幅度量级、解释方式都不同。合理的做法是把"十二路"与"十五路"作为两种配置分别训练并对照报告,从而量化正交导联到底带来了多少增量;把两种性质的测量混作平权通道,会让消融实验失去解释力。
术语表
| 术语 | 解释 |
|---|---|
| PTB | Physikalisch-Technische Bundesanstalt,德国联邦物理技术研究院,德国的国家计量研究院 |
| PhysioNet | 由 MIT 计算生理实验室维护的生理信号与临床数据开放平台 |
| PhysioBank | PhysioNet 旗下的生理信号数据库集合 |
| WFDB | Waveform Database,PhysioNet 自 1980 年代使用的生理信号存储规范,含头文件、信号文件与注释文件 |
| 头文件(.hea) | WFDB 的纯文本描述文件,声明采样率、通道数、增益、基线,并可附临床注释 |
| Frank 正交导联 | 用三个互相正交的轴(X 左右、Y 上下、Z 前后)描述心脏电活动空间轨迹的电极体系 |
| 心向量图(VCG) | Vectorcardiography,把心电活动表示为三维空间中的向量环 |
| Kors 变换 | 从常规十二导联推算 Frank 正交导联的线性回归变换 |
| 逆 Dower 变换 | 另一种从十二导联推导心向量图的线性变换 |
| A/D 单位每毫伏 | 增益的表示方式,2000 表示 1 毫伏对应 2000 个整数单位,即 0.5 μV 每 LSB |
| LSB | Least Significant Bit,模数转换的最小可分辨单位 |
| 同步采样 | 多个通道在同一时刻各取一个点,通道间不存在时间偏移 |
| QT 间期 | 心电图 QRS 起点到 T 波终点的时间间期,反映心室除极与复极的总时长 |
| 心室晚电位 | QRS 末端之后的微伏级高频碎裂信号,与室性心律失常风险相关 |
| 心室造影 | 向心室注入造影剂后 X 线成像,用于观察室壁运动 |
| 血流动力学 | 关于血压、心输出量、心指数、楔压等循环功能参数的测量集合 |
| 溶栓治疗 | 用药物溶解冠脉内血栓以恢复血流,疗效与开始时间密切相关 |
| 束支阻滞 | 希氏束左右分支传导受阻,心电图上表现为 QRS 增宽与形态改变 |
| ODC-BY 1.0 | Open Data Commons Attribution License v1.0,要求署名即可自由使用的开放数据许可 |
| CinC | Computing in Cardiology,国际计算机心脏病学会议,PhysioNet 挑战赛的合办方 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 记录数 | 549 | 官方数据描述;RECORDS 逐行 549 行 | 官方页面 + 官方文件 |
| 受试者数 | 290(导言另写 294) | 官方数据描述;RECORDS 去重 patient 目录 | 官方页面 + 官方文件 |
| 缺失受试者编号 | 124、132、134、161 | 官方数据描述 | 官方页面 |
| 年龄范围 | 17–87 岁 | 官方数据描述 | 官方页面 |
| 平均年龄 | 57.2 岁 | 官方数据描述 | 官方页面 |
| 性别构成 | 209 名男性、81 名女性 | 官方数据描述 | 官方页面 |
| 分性别平均年龄 | 男 55.5 岁、女 61.6 岁 | 官方数据描述 | 官方页面 |
| 未记录年龄 | 15 名(1 女、14 男) | 官方数据描述 | 官方页面 |
| 每人记录数 | 1 至 5 段 | 官方数据描述 | 官方页面 |
| 同步通道数 | 15 | 官方数据描述;抽样头文件首行第 2 字段 | 官方页面 + 官方文件 |
| 常规导联数 | 12 | 官方数据描述 | 官方页面 |
| Frank 导联数 | 3(vx、vy、vz) | 官方数据描述 | 官方页面 |
| 采样率 | 1000 Hz | 官方数据描述;抽样头文件首行第 3 字段 | 官方页面 + 官方文件 |
| 位分辨率 | 16 位 | 官方数据描述 | 官方页面 |
| 量程 | ±16.384 mV | 官方数据描述 | 官方页面 |
| 增益 | 2000 A/D 单位每毫伏(0.5 μV/LSB) | 官方设备规格;抽样头文件信号行 | 官方页面 + 官方文件 |
| 可申请最高采样率 | 10 kHz | 官方数据描述 | 官方页面 |
| 设备输入通道 | 16(心电 14、呼吸 1、线电压 1) | 官方设备规格 | 官方页面 |
| 设备噪声 | 峰峰值最大 10 μV、有效值 3 μV | 官方设备规格 | 官方页面 |
| 无临床摘要人数 | 22 名 | 官方数据描述 | 官方页面 |
| 归入诊断类别人数 | 268 名,九个类别 | 官方数据描述 | 官方页面 |
| 健康对照记录数 | CONTROLS 文件 80 行 | CONTROLS 文件 | 官方文件 |
| 抽样记录长度 | 38400 / 115200 / 120012 采样点 | 抽样头文件首行第 4 字段 | 官方文件 |
| 全量体积 | 解压后 1.7 GB | 官方文件页 | 官方页面 |
| 首次发布 | 2004-09-25,版本 1.0.0 | 官方页面版本列表 | 官方页面 |
| 许可 | ODC-BY 1.0 | 官方页面许可段 | 官方页面 |
| DOI | 10.13026/C28C71 | 官方页面 | 官方页面 |
| 被引用 | 48 篇出版物 | 官方页面 Cited by | 官方页面 |
附录 B:数字的来源分层
第一层:官方页面与官方文件。 记录数、受试者数、年龄范围与构成、通道构成、采样率、位分辨率、量程、设备规格、缺失编号、无摘要人数、许可、DOI、发布日期。这些数字来自项目主页的数据描述段与设备规格段,以及 RECORDS、CONTROLS、README 与抽样头文件。
第二层:挑战赛公开论文。 “记录通常约两分钟、少数更短、无短于 30 秒者"这一时长口径,以及参赛者普遍只取前 30 秒处理的做法,来自 PhysioNet/CinC 2006 挑战赛的公开论文。该层只能支撑"当年是这样用的”,不能支撑"这样用效果如何"。
第三层:未核实。 各诊断类别的受试者人数、呼吸与线电压通道是否发布、皮肤电阻与噪声电平记录是否可得、逐段信噪比、10 kHz 版本的实际获取方式。这些需要下载全量或向贡献者申请后才能确认,正文涉及处只做定性表述。
附录 C:完整参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | PTB Diagnostic ECG Database v1.0.0 | https://physionet.org/content/ptbdb/1.0.0/ | 全部规模、结构、边界数据的来源 |
| 2 | 该库 PhysioNet 文件目录 | https://physionet.org/files/ptbdb/1.0.0/ | RECORDS、CONTROLS、README、抽样头文件 |
| 3 | Bousseljot R, Kreiseler D, Schnabel A. CARDIODAT 心电数据库(1995) | 官方页面引用文献 | 原始出处与引用要求 |
| 4 | Kreiseler D, Bousseljot R. 基于 CARDIODAT 的自动心电分析(1995) | 官方页面引用文献 | 方法学背景 |
| 5 | PhysioNet/CinC Challenge 2006(QT 间期测量) | https://physionet.org/content/challenge-2006/1.0.0/ | 时长口径与沿革 |
| 6 | Pollard T 等. PhysioNet as a global platform for biomedical research. Nature Health (2026) | https://doi.org/10.1038/s44360-026-00096-z | 平台引用规范 |
| 7 | PTB-XL v1.0.3(对照) | https://physionet.org/content/ptb-xl/1.0.3/ | §2.5 与 §6.1 的对比 |
| 8 | ODC-BY 1.0 许可文本 | https://opendatacommons.org/licenses/by/1-0/ | 许可条款 |
附录 D:任务代码
任务一:按受试者分组划分并读取十五路信号
import wfdb
import numpy as np
from sklearn.model_selection import GroupShuffleSplit
#-- 读 RECORDS:549 行,形如 patient001/s0010_re
paths = [l.strip() for l in open('RECORDS') if l.strip()]
groups = [p.split('/')[0] for p in paths]
gss = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=0)
tr, te = next(gss.split(paths, groups=groups))
def load(rel):
#-- pn_dir 必须写到 patient 子目录
d, name = rel.rsplit('/', 1)
rec = wfdb.rdrecord(name, pn_dir=f'ptbdb/1.0.0/{d}')
return rec.p_signal #-- (采样点, 15) 毫伏
X = load(paths[tr[0]])
print(X.shape, len(set(groups)))
任务二:十二导联推导 VCG 并与直接测得的 Frank 导联对照
import wfdb
import numpy as np
#-- Kors 回归矩阵:由十二导联推算 vx, vy, vz
KORS = np.array([
[-0.130, 0.050, 0.090, -0.010, 0.130, 0.060, 0.340, 0.380, 0.200, 0.110, -0.070, 0.010],
[ 0.070, 0.030, 0.020, 0.050, 0.060, -0.170, 0.320, 0.440, 0.320, 0.180, -0.110, 0.080],
[ 0.070,-0.130,-0.190, 0.030, 0.090, 0.070, 0.080, 0.130, 0.270, 0.310, 0.320, 0.190],
])
rec = wfdb.rdrecord('s0010_re', pn_dir='ptbdb/1.0.0/patient001')
X = rec.p_signal
twelve, frank = X[:, :12], X[:, 12:]
pred = twelve @ KORS.T #-- 推导所得 VCG
for i, ax in enumerate('xyz'):
a, b = pred[:, i], frank[:, i]
#-- 只做相对量级比较,不做拟合优度的统计推断
print(f'{ax}: 推导峰峰值 {np.ptp(a):.3f} mV 直接测得峰峰值 {np.ptp(b):.3f} mV')
这段代码的目的不是判定哪个变换更好,而是把"推导值与直接测得值差多少"这件事量化出来。拿到峰峰值之比之后,再决定是否需要针对特定任务重新拟合变换矩阵。
附录 E:如果只记五件事
| 序号 | 记住什么 | 为什么 |
|---|---|---|
| 1 | 549 段、290 名受试者、15 路、1000 Hz | 这四个数字定义了一切用法与限制 |
| 2 | 15 路 = 12 常规 + 3 Frank 正交 | 混作平权通道会让消融实验失去解释力 |
| 3 | 标注是记录级自由文本临床摘要,无逐搏标注 | 标签要自己抽,22 名受试者没有摘要 |
| 4 | 按 patient 目录划分,不按记录划分 | 同一受试者 1–5 段,随机划分会泄漏 |
| 5 | 它是毫秒级与三轴测量的稀缺格子 | 大规模分类不该找它,QT 与 VCG 几乎只能找它 |
编辑说明
本文的核验时间为 2026 年 10 月 29 日。核对方式为直接访问 PhysioNet 项目页与文件目录,逐一确认 RECORDS、CONTROLS、README 的可访问性与内容,并抽样三十个头文件确认通道数、采样率、增益与记录长度;CinC 2006 挑战赛部分取自公开论文摘要,未读全文。受试者数在官方页面存在 290 与 294 两处异文,正文采用 290 并以 RECORDS 覆盖的 patient 目录数交叉确认,同时在 §10 记录该不一致。未覆盖的内容包括:各诊断类别的受试者人数、呼吸与线电压通道是否随记录发布、皮肤电阻与噪声电平记录的可得性、逐段信噪比、以及 10 kHz 版本的申请流程。这些需要下载全量或向贡献者申请后确认,本文按要求只写规模、结构、边界三类数字。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- ptb-xl — 共享标签:生理信号 / 心电信号 / 心血管疾病
- ptb-xl-plus — 共享标签:生理信号 / 心电信号 / 心血管疾病
- incartdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- mit-bih-arrhythmia — 共享标签:生理信号 / 心电信号 / 心律失常
- mit-bih-afdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- wctecgdb — 共享标签:生理信号 / 心电信号 / 多通道采集
- georgia-12-lead-ecg-challenge — 共享标签:生理信号 / 心电信号 / 十二导联
- openecg — 共享标签:生理信号 / 心电信号 / 十二导联
- code-15 — 共享标签:生理信号 / 心电信号 / 心血管疾病
- chapman-shaoxing — 共享标签:生理信号 / 心电信号 / 心律失常
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

