信息速览
心电图是少数「信号很清楚、标签很模糊」的医学数据。波形本身标准化程度极高:十二个导联、走纸速度、增益,全世界都一样;但「这份心电图说明了什么」这句话,落成文字时差异巨大——同一份图,三位心内科医生可能给出三种措辞,而自动分析系统给的是第四种。
这份数据集把这件事摊开在明面上:四万五千一百五十二名患者、每人十秒、十二导联、五百赫兹,标签来自 GE MUSE 系统的自动报告,经专业人员复核后落成五十五个 SNOMED CT 编码。它没有假装标签是金标准,头文件里写的是 #Dx: 后面一串数字。
它的规模足以训练模型,许可足够宽松(CC BY 4.0,含商业使用),格式与 2021 年 PhysioNet 挑战赛一致,所以能直接接进现成的评测流水线。但它也有四个必须先处理的窟窿:十秒的长度、编码的混叠、单次记录、以及「标签是机器先说的」这件事本身。想直接拿来训模型的,先读 §4 与 §6;想弄明白为什么同一份心电图会有三个编码的,看 §2.3;只关心许可与下载的,看 §3。
§1 它是什么:四万五千份十秒心电
1.1 一句话定义与四条边界
这是一份公开的十二导联心电记录库:四万五千余名患者各一份记录,每份 10 秒、12 导联、500 赫兹采样、5000 个采样点,16 位量化、增益 1000 单位每毫伏,附年龄、性别与一串 SNOMED CT 诊断编码。
四条边界。
第一,每次就诊一份记录,不是每人多份。 文档的表述是「四万五千余名患者的十二导联心电」,编号从 JS00001 起;无法从数据判断有没有同一患者多次就诊的情况,因为没有患者标识符,只有记录号。
第二,每份 10 秒。 这是常规静息心电的标准时长,不是 Holter,也不是监护。阵发性事件、间歇性传导阻滞、与睡眠相关的变化,这十秒可能什么都没抓到。
第三,标签是「诊断编码列表」,不是单标签。 每条记录有 1 到 7 个编码,中位数 2 个以下。这意味着这是一个多标签分类问题,而不是多分类。
第四,没有心搏级标注。 不知道每个 QRS 波属于哪个心搏、每次房颤发作从第几秒开始。只有整份记录层面的诊断。
1.2 数据从哪来:两家医院与一个转换链
文档给出的链条是:查普曼大学牵头,绍兴市人民医院(浙江大学医学院附属绍兴医院)与宁波市第一医院提供数据。
采集流程是常规十二导联心电检查。原始数据从心电设备导出为 XML,再由开源工具转成 CSV,最后转成 WFDB 格式。这条链上每一次转换都可能丢东西,而文档只说了格式,没说转换过程做过什么校验。
可以确认的是:CSV 阶段发布过 10,646 名患者的子集(含原始与去噪两版),WFDB 阶段扩充到四万五千余。所以这份数据是「先小规模公开、再扩容重发」的产物,早期用过 CSV 版本的研究与后来用 WFDB 版本的研究,样本范围不同。
这一点在复现文献时很关键:2021 年前后引用这份数据的论文,可能用的是 10,646 那一版。
1.3 目录结构与命名
WFDBRecords 下是两级目录,命名是两位数补零:第一级从 01 到 46,共四十六个;第二级每个一级目录下十个,共四百五十二个。每个二级目录装两百条记录,只有最后一个装一百零四条。
记录名是 JS 加五位数字,从 JS00001 起。目录与记录号的对应关系是:记录号前两位决定第一级目录,前三位决定第二级。比如 JS00001 在 01/010/,JS32412 在 33/330/。
这套编号有一个副作用值得记住:四百五十二个二级目录,四百五十一个装满两百条,四百五十一个不多不少。 这不是数据本身分布均匀,而是发布方按容量切好的。换句话说,目录编号与记录号之间是机械映射,目录本身不携带任何临床或时间信息——不要试图从目录结构里读出「这批是哪个医院」这类结论。
按校验和清单核对,这份数据共四万五千余条记录,每条两个文件,合计九万零三百零四个文件,加三个顶层文件与四百五十二个二级目录各自的 RECORDS 清单,总行数九万零七百五十九。解压后总大小 5.1 GB,压缩包 2.3 GB。单条记录的数据文件约 120 千字节(12 导联 × 5000 点 × 2 字节 = 120,000 字节,加 MAT 头约 24 字节)。
这个体量很适合本地训练:5.1 GB 全量放进内存不够,但放进一块固态硬盘绰绰有余,加载一条记录只需毫秒级。
1.4 头文件里到底写了什么
一条记录的全部元数据都在 .hea 文件里。以 JS00001 为例,结构是四段。
第一行是记录描述:JS00001 12 500 5000——记录名、导联数、采样率、采样点数。
接着十二行,每导联一行:
JS00001.mat 16+24 1000/mV 16 0 -254 21756 0 I
从左到右:关联的数据文件、格式码(16 位、24 字节偏移)、增益与单位(1000/mV)、ADC 分辨率(16 位)、基线值(0)、第一个采样值(-254)、该导联的最小值(21756)、最大值、校验和、导联名。
再往后是注释行,每行以 # 开头:
#Age: 85
#Sex: Male
#Dx: 164889003,59118001,164934002
#Rx: Unknown
#Hx: Unknown
#Sx: Unknown
年龄、性别、诊断码、用药史、病史、症状。后三项在这份数据里绝大多数是 Unknown——这是一个需要单独说的事(§2.5)。
1.5 两个数字:500 赫兹与 5 微伏
采样率 500 赫兹是常规心电的常见档位(另一档是 250 或 1000)。500 赫兹意味着相邻采样点间隔 2 毫秒,QRS 波的上升支(正常约 20 到 40 毫秒)有 10 到 20 个采样点,足够算斜率。
文档另给了一个数:每个 A/D 位的电压是 4.88 微伏,ADC 分辨率 32 位,幅度单位是微伏,上限 32767、下限 -32768。
这三个数放在一起有一处需要辨析。4.88 微伏 × 32767 ≈ 0.16 伏,而心电信号典型幅度是 1 毫伏量级,量程覆盖绰绰有余。而「32 位分辨率」与「上限 32767」自相矛盾——32767 是 16 位有符号整数的上限。头文件里的 16 也指向 16 位。
所以合理的读法是:存储是 16 位整数,4.88 微伏是 1 个存储单位对应的物理量,文档里「32 位」的说法应视为笔误。这个细节值得单独指出,因为按 32 位去规划内存会高估一倍。
换算关系是:物理电压(微伏)= 存储值 × 4.88。这一点在 §11.4 给了代码。
1.6 与 2021 年挑战赛的关系
文档明说:这套设置是为了与 PhysioNet/Computing in Cardiology Challenge 2021 保持一致。
那条线索很重要。2021 年挑战赛的任务是「从十二导联心电识别多种心电异常」,用的是多标签、多中心、带 SNOMED CT 编码的评分体系。这份数据用了同样的编码表、同样的 WFDB 结构、同样的目录组织,因此可以直接套用挑战赛的评测脚本。
对使用者来说,这意味着两件事:好处是省了自己写评测;风险是「与挑战赛一致」不等于「与挑战赛数据独立」——如果训练集与挑战赛隐藏测试集有重叠,评估会偏乐观。
1.7 它不适合回答什么
不能做患者级纵向分析。 只有记录号,没有患者 ID,同一个人多次检查无法关联。
不能做心律发作的时序分析。 十秒太短,看不到发作的起始与终止过程。
不能把诊断编码当作三位专家的共识。 来源是自动报告加复核,不是盲法多读(§2.1)。
不能用来评估「诊断准确性」而不交代标签来源。 用带噪标签评估模型,得到的数字是「与标签的一致率」,不是「与真实诊断的一致率」。
不能外推到门诊筛查场景而不做人群校正。 两家三甲医院的心电科,来检查的人本身就有选择偏倚。
§2 数据构成:五十五个编码与它们的边界
2.1 标签是怎么来的,为什么这件事重要
文档的原话是:诊断标签来自 GE MUSE 心电信息系统(acquired from GE MUSE system),由专业人员复核。
GE MUSE 是心电管理系统的老牌产品,它的自动分析模块会给出一份结构化报告:节律、传导、梗死、肥厚、ST-T 改变等分类,用标准缩写(如 SR、AFIB、LBBB)表示。这类自动分析的准确率在常见心律上很高(窦性心律、房颤),在细微形态改变上则弱得多(ST 段轻微压低、T 波低平)。
所以这份数据的标签链条是:算法先判 → 人复核 → 落成编码。链条上有两个误差源:算法的系统性偏差,人的复核是否真的逐条看。
这一点与「三位心内科医生独立盲法判读、取多数」的金标准流程不同。差异的后果是:标签噪声不是随机的,而是与算法的判断倾向相关。模型学到的可能不是「真心电图特征→真诊断」,而是「真心电图特征→MUSE 的判断→复核者的容忍度」。
这不是说标签没用。规模足够大时,带系统偏差的标签仍能训练出有用的模型——但它决定了模型的上限,也决定了评估数字的含义。
2.2 五十五个编码的清单
数据提供了 ConditionNames_SNOMED-CT.csv,把缩写、全名与 SNOMED CT 编码对应起来。共 55 个编码,按语义可以分六组。
节律组:窦性心律(SR,426783006)、窦性心动过缓(SB,426177001)、窦性心动过速(ST,427084000)、窦性心律不齐(SA,427393009)、房颤(AFIB,164889003)、房扑(AF,164890007)、房性心动过速(AT,713422000)、室上性心动过速(SVT,426761007)、房室结折返性心动过速(AVNRT,233896004)、房室折返性心动过速(AVRT,233897008)、窦房结至心房游走节律(SAAWR,195101003)。
传导阻滞组:一度房室阻滞(1AVB,270492004)、二度房室阻滞(2AVB,195042002)、二度一型(2AVB1,54016002)、二度二型(2AVB2,28189009)、三度房室阻滞(3AVB,27885002)、房室阻滞未特指(AVB,233917008)、左束支阻滞(LBBB,164909002)、右束支阻滞(RBBB,59118001)、室内阻滞(IVB,698252002)。
早搏与逸搏组:房性早搏(APB,284470004)、室性早搏(VPB,17338001)、交界性早搏(JPT,251164006)、交界性逸搏(JEB,426995002)、室性逸搏(VEB,75532003)、房性二联律(ABI,251173003)、室性二联律(VB,11157007)、室性逸搏三联律(VET,251180001)、室性融合波(VFW,13640000)、预激(VPE,195060002)、WPW 综合征(WPW,74390002)。
形态与间期组:T 波改变(TWC,164934002)、ST-T 改变(STTC,428750005)、ST 段压低(STDD,429622005)、ST 段抬高(STE,164930006)、ST 段上斜(STTU,164931005)、T 波倒置(TWO,59931005)、P 波改变(PWC,164912004)、PR 间期延长(PRIE,164947007)、QT 间期延长(QTIE,111975006)、U 波(UW,164937009)、异常 Q 波(AQW,164917005)、fQRS 波(FQRS,164942001)、早期复极(ERV,428417006)。
肥厚与电轴组:左室肥厚(LVH,164873001)、右室肥厚(RVH,89792004)、左房肥大(RAH,446358003)、电轴左偏(ALS,39732003)、电轴右偏(ARS,47665007)、顺钟向转位(CR,251198002)、逆钟向转位(CCR,251199005)。
低电压与梗死组:全导联低电压(LVQRSAL,251146004)、胸导联低电压(LVQRSCL,251148003)、肢体导联低电压(LVQRSLL,251147008)、心肌梗死(MI,164865005)、后壁梗死(MIBW,164865005)、前壁梗死(MIFW,164865005)、下壁梗死(MILW,164865005)、侧壁梗死(MISW,164865005)。
2.3 编码表里的一处别名问题
清单里有一类缩写的全名写法不同,但编码相同,这会造成标签混叠。
LBBB(左束支阻滞)、LBBBB(左后分支阻滞)、LFBBB(左前分支阻滞)三个缩写的 SNOMED CT 编码都是 164909002。
同样,MI、MIBW、MIFW、MILW、MISW 五个缩写的编码都是 164865005。
IDC(室内传导差异)与 IVB(室内阻滞)都是 698252002。SAAWR 与 WAVN 都是 195101003。
这意味着:从编码层面看,左前分支阻滞与左束支阻滞是同一个标签。 临床上这两者的意义差别很大——左束支阻滞通常提示更广泛的心肌病变,左前分支阻滞常见于老年人且多无显著后果。但在这份数据里,它们不可区分。
这不是数据制作者的疏忽,是编码表本身的问题(SNOMED CT 的层级关系与他们的映射策略)。对使用者的实际影响:任何在这份数据上训练的左束支阻滞分类器,实际学的是「左束支阻滞或左前分支阻滞或左后分支阻滞」的合并概念。 想分开,必须回到原始报告文本,而原始报告不在数据里。
2.4 多标签的分布
每条记录有 1 到 7 个编码。抽样 145 条得到的分布是:1 个编码 71 条、2 个 46 条、3 个 18 条、4 个 4 条、5 个 3 条、6 个 2 条、7 个 1 条,均值 1.84。
这个分布有一个直接后果:单标签分类的做法在这里会丢掉一半信息。 若只取第一个编码当标签,等于把「房颤 + 右束支阻滞 + T 波改变」压成「房颤」。
常见做法是把 55 个编码当 55 个独立的二分类问题(多标签),用平均精确率或宏平均 F1 评估。这个做法的问题是:55 个标签里有一半的样本量不足百例,个别标签(如 U 波、早期复极)在整个数据里可能只有个位数——抽样 145 条里各出现 1 次。这类标签上的指标方差极大,不宜单独报告。
2.5 年龄、性别与三项 Unknown
头文件里有六个注释字段:年龄、性别、诊断、用药史、病史、症状。
前三个有内容,后三个在这份数据里普遍是 Unknown。抽样 145 条,#Rx:、#Hx:、#Sx: 全为 Unknown。
这是一个明确的缺口:没有用药信息,就无法判断 ST-T 改变是原发还是继发(洋地黄效应、电解质紊乱、抗心律失常药的复极影响都会造成 ST-T 改变)。临床上判读心电图时,用药史是关键上下文;这份数据把它抹平了。
年龄与性别的分布(抽样 145 条):年龄中位数 63 岁,均值 60.7 岁,范围 20 到 89;男性 91 例、女性 54 例。这个构成与「到三甲医院心电科做检查的人群」相符——中老年为主,男性偏多。
要注意年龄下限是 20 岁。这份数据不含儿童心电图,任何儿科应用都不能用它。
2.6 我按文件核对出的分布
以下统计来自对校验和清单的完整解析,以及对 145 份头文件的抽样核对(每 40 条抽 1 条,覆盖全部记录号范围)。
- 记录总数四万五千余条(精确值见表格),每条一对文件;
SHA256SUMS.txt共 90,759 行 / 8,711,012 字节,构成为四万五千一百五十二个.hea+ 四万五千一百五十二个.mat+ 三个顶层文件 + 四百五十二个二级目录的RECORDS - 二级子目录结构:四百五十二个二级目录,四百五十一个各装两百条,最后一个装一百零四条;按记录号前两位分第一级、前三位分第二级
- 记录号不连续,缺号 399 个。 头尾是 JS00001 到 JS45551,这段区间若连续应有四万五千五百五十一个号,实有四万五千一百五十二个,差 399。按千号段统计,每段的缺号数在 29 到 49 之间浮动,不是均匀删的
- 抽样 145 份头文件,导联数全部为 12、采样率全部为 500、采样点数全部为 5000——没有例外
- 每条记录的 MAT 数据文件 120,024 字节,与 12 × 5000 × 2 字节 + 24 字节 MAT 头完全吻合
- 抽样中出现的诊断码共 28 个,覆盖编码表的约一半
抽样里出现频次最高的六个编码是:窦性心动过缓 56 次、T 波改变 31 次、窦性心律 28 次、窦性心动过速 27 次、房颤 24 次、右束支阻滞 5 次。
这个频次顺序值得停一下。窦性心动过缓出现了 56 次,比「窦性心律」的 28 次还多一倍。 这在一般人群里不常见,但在心电科检查人群里说得通:术前评估、体检发现的窦缓,是常见的开单理由。它同时提示,这个队列的心率分布偏向慢端,任何与心率相关的特征(如心率变异性、QT 校正)都会有系统性偏移。
另有一个无法从抽样解释的编码:55827005 出现了 19 次,但不在 ConditionNames_SNOMED-CT.csv 的 55 个编码里。 按 SNOMED CT 条目,55827005 是「左心室肥大」(Left ventricular hypertrophy)。而表里 LVH 对应的是 164873001。两个编码并存,说明头文件里至少有一部分标签用的是另一套映射,或者是转换过程中的遗留。使用前必须自己扫一遍全量的 #Dx: 取值,不能假定只出现那 55 个。
2.7 标签频次能读出什么
抽样里六个高频标签的次序是:窦缓、T 波改变、窦性心律、窦速、房颤、右束支阻滞。这个排序不只是「什么病常见」,它还反映了开单逻辑。
窦缓排在窦性心律之前,说明「正常心电图」这个结论在这批记录里不是主流。多数记录至少带一个异常编码——这与「心电科检查人群」的构成一致:体检异常被转来做心电、术前评估、心悸胸闷待查。真正因为「什么都正常」而做的检查,在这类数据里占比不高。
T 波改变排第二,值得单独说。T 波改变是一个极度非特异的描述——它可以是缺血、可以是电解质紊乱、可以是体位、可以是正常变异、也可以是自动算法的误判。当它成为第二高频标签时,意味着这份数据里有大量「说不清但被标了」的样本。
这对多标签训练的影响是:模型很可能靠 T 波改变这个标签把 AUROC 刷得很高,而这个标签本身的临床意义最弱。评估时应当把它单独列出来看,而不是混在宏平均里。
房颤只有 24 次,排第五。这个数字低于很多人的预期——房颤是心电 AI 最热的目标,但在常规门诊心电里,它的比例本来就不高(多数流行病学调查里,非选择性人群的房颤检出率在个位数百分比)。若你的任务专做房颤,这份数据里正样本可能只有几千例,需要自己先统计。
2.8 三个未标明的元数据
文档没写三件事,都会影响使用。
采集时间跨度。 没有年份字段,也没有记录日期。因此无法判断这四万五千份是几年内采集的,也无法做「随时间变化」的分析(比如某个诊断的检出率是否在上升)。
设备与滤波器设置。 只说是常规十二导联检查,没说是哪家厂商的机器、是否开基线漂移滤波、是否开 50 赫兹陷波。这两项对 ST 段与高频成分的影响很大。
去噪版本是否随 WFDB 版发布。 CSV 阶段明确有「原始」与「去噪」两版;WFDB 阶段的那批是否也是原始信号,文档没明说。若是去噪后的,那么高频细节(如 fQRS 的切迹)可能已被平滑掉。
2.9 与另一份常用库的定量对照
把这份数据与 PTB-XL 摆在一起比,能更清楚地看出它的位置。
| 维度 | 本库 | PTB-XL |
|---|---|---|
| 记录数 | 四万五千余 | 约两万二千 |
| 患者数 | 未标明 | 18,869 |
| 每份时长 | 10 秒 | 10 秒 |
| 采样率 | 500 赫兹 | 500 赫兹(另有 100 赫兹版) |
| 导联 | 12 | 12 |
| 标签体系 | SNOMED CT,55 个 | SCP-ECG,71 个陈述 |
| 标签来源 | 自动分析报告 + 复核 | 心内科医生结构化报告 |
| 标签层级 | 扁平,多标签 | 三层(诊断/形态/节律) |
| 许可 | CC BY 4.0 | CC BY 4.0 |
| 人群 | 中国两家三甲医院 | 德国一家大学医院 |
两处差异值得展开。
标签层级的差异。 PTB-XL 的三层结构允许「诊断:心肌梗死;形态:Q 波;节律:窦性」这样的组合,因此能做「同一诊断下形态的差异」这类分析。本库是扁平的多标签,做不了这种分解——一个「心肌梗死」编码下面,你无法知道它是急性期还是有 Q 波陈旧性。
人群的差异。 德国单中心与中国两中心,人群构成不同,心电图基线也不同(比如胸导联电压的整体水平、早期复极的比例)。跨库测试时,性能下降有多少来自人群、多少来自标签定义,需要设计实验才能分开。
§3 怎么拿到:一个许可,三种下载方式
3.1 许可与约束
CC BY 4.0,是全套 Creative Commons 里最宽松的一档:可以复制、分发、修改、商用,唯一条件是署名。
署名的具体要求是:注明作者、标明许可、说明是否做过修改。对数据集而言,通常写法是引用它的 DOI 与版本,并在方法学部分说明用了哪个版本。
注意 CC BY 4.0 不提供任何担保,也不承担数据使用的责任。医学数据用于临床决策时,这个免责条款的实际意义是:出了问题不能归咎于数据提供方。
3.2 三种下载方式
页面给了三条路径。
网页直接下 ZIP(2.3 GB)。适合一次性拿全量,但断点续传要靠浏览器。
wget -r -N -c -np 递归下载。-c 是断点续传,-N 是只拿更新的,-np 是不上溯父目录。这条命令会拉九万多个文件,对小文件极多的场景效率很低。
aws s3 sync --no-sign-request 从 S3 同步。这条最快,也最稳,因为 S3 支持并行与断点。若你的环境能访问 S3,优先用这条。
3.3 下载这件事本身的坑
我在核对校验和清单时遇到了典型问题,值得写下来。
SHA256SUMS.txt 实际是 8,711,012 字节、90,759 行。这个文件我抓了十几轮才拿全:单次 curl --max-time 100 最好的一次只到 245,742 字节,续传一次到 671,726 字节,之后每轮推进几百 KB 到一两 MB 不等——累计跑了十六轮才见到末行 WFDBRecords/46/461/RECORDS。
处理办法与前面的经验一致:写循环,每次带 -C - 续传,检查目标大小是否达到,未达到就再跑一次;同时在循环里判断「本次大小是否与上次相同」,相同则说明卡死,需要换时间重试。
这个坑的教训是:不要用「命令返回 0」作为下载完成的判据,也不要只看「大小不再变化」。curl 在超时被切断时照样返回 0;而文件停在同一尺寸两三轮,可能只是那几轮都断在同一个位置。判据只能是「文件末行是预期的最后一行」,或整文件校验和。
3.4 校验和怎么用
SHA256SUMS.txt 覆盖了全部文件,可以逐文件校验:
sha256sum -c SHA256SUMS.txt --quiet
--quiet 只输出失败项。九万个文件全量校验大约几分钟,对训练前的数据完整性检查是值得的——尤其是用递归方式下载时,小文件丢失很常见。
§4 质量:四处必须先处理的问题
4.1 十秒的长度决定了什么能问、什么不能问
十秒记录能回答:这份心电的节律是什么、有没有传导阻滞、ST-T 有没有改变、电轴偏向哪边。
十秒记录不能回答:这个人的房颤是持续的还是阵发的、早搏一天有多少、夜间心率降不降、QT 在心率变化时是否跟着变。
这条限制在做「心律失常检测」时尤其要留心。房颤的诊断在十秒内通常够(连续多个心动周期无 P 波、RR 绝对不齐),但阵发性房颤的「检出」需要长记录。用这份数据训练出来的房颤检测器,其敏感度只对「十秒内可见的房颤」有意义。
4.2 标签噪声无法从内部估计
这是这份数据最大的方法论限制。
要估计标签噪声,通常需要一部分数据有「金标准」——多位专家独立盲法判读的共识。这份数据没有这样的子集。因此你无法算出「标签正确的比例是多少」,只能引用外部文献对这个自动分析系统的已知性能,或者自己做一个小规模的人工复核。
这个限制的实践后果是:任何在这份数据上报出的准确率,都不应该被解释为「模型的诊断准确率」。 它是「模型与这套标签的一致率」。两者在标签质量高时接近,在标签质量差时差距巨大——而你不知道是哪一种。
4.3 编码混叠与标签定义漂移
§2.3 说的编码混叠(左束支阻滞与左前分支阻滞同码)是硬伤。
此外还有一类软问题:缩写到编码的映射在不同记录里可能不一致。§2.6 发现的 55827005(左心室肥大)不在官方 55 个编码表里,就是一个例子。
这对训练的影响是:同一个标签下的样本,可能来自不同的诊断定义。 模型学到的是这个混合概念的平均特征,在细分任务上会失效。
4.4 缺失的上下文:用药、症状、既往史
心电图判读从来不是只看图。同样一份 ST 段压低两毫米的图,在一位服用洋地黄的患者身上是药物效应,在一位胸痛发作中的患者身上是缺血。这份数据把这三项都写成 Unknown。
因此它适合做「图到描述」的映射,不适合做「图到临床决策」的映射。后者需要上下文,而上下文不在数据里。
4.5 采样率与滤波的未知项
500 赫兹够用,但不够做高频分析。若你的任务涉及晚电位、心室晚电位的碎裂 QRS、或者高频 QRS 分析(需要 1000 赫兹以上),这份数据不合适。
基线漂移与工频干扰的处理方式未知,意味着你无法判断 ST 段的低频成分有没有被滤掉。这一点在做 ST 段抬高检测时尤其要注意:过强的基线校正会把 ST 段的缓慢变化一起抹掉。
4.6 记录之间的重复与近重复
没有患者 ID,但重复记录仍可能出现:同一个人在不同日期做两次检查,记录号不同、波形可能高度相似;同一次检查被导出两次,则波形完全相同。
这两种情况对训练的影响不同。完全相同的是数据错误,应当去重;高度相似的是真实世界的样子(同一个人的基线确实稳定),但它会让随机划分的测试集泄漏。
检测办法:对每条记录算一个波形指纹(比如十二导联 QRS 段的降采样后再哈希),先查完全相同的,再查近邻。前者能立刻清掉,后者要设阈值,需要人工看一批确认。
这件事文档没提,但四万五千份数据里,重复是常见现象——尤其是同一家医院的不同批次导出。
4.7 自动分析的已知弱项
用自动报告当标签,等于继承了自动分析算法的弱项。心电自动分析在以下几类上公认不可靠。
细碎形态。 ST 段轻微压低(0.5 毫米以内)、T 波低平、U 波,这些的判断在算法与医生之间差异最大。这类标签的噪声率可能远高于房颤这类明确节律。
多诊断的优先级。 算法通常按固定优先级输出,比如「房颤」会压掉「窦性心律不齐」。所以在多标签数据里,某些标签的组合在生理上不可能同时出现,原因不是生理,是算法的互斥规则。
伪差与心律的混淆。 基线剧烈漂移可能被判成室性心律,肌电干扰可能让 QRS 时限被高估,从而误判束支阻滞。
这三条的实践含义是:标签的可靠性不是均匀的。 用房颤标签训练,你大概能得到一个不错的模型;用 T 波改变标签训练,你得到的可能是一个「复现算法偏好」的模型。
4.8 DAIMS 二十四项对照
| 维度 | 判定 | 说明 |
|---|---|---|
| 目的与用途说明 | 是 | 摘要明确说明用于心律失常研究 |
| 采集方法描述 | 是 | 常规十二导联,导联位置与时长给出 |
| 采样率与位深 | 是 | 500 赫兹、16 位、4.88 微伏 |
| 变量清单 | 是 | 十二导联名称逐一列出 |
| 单位说明 | 是 | 微伏,增益 1000 每毫伏 |
| 记录长度 | 是 | 5000 点、10 秒 |
| 标签体系 | 是 | SNOMED CT,附映射表 |
| 标签来源 | 部分 | 说明来自 GE MUSE 系统与人工复核,未说明复核流程 |
| 标签一致性 | 否 | 无标注者间一致性指标 |
| 受试者人口学 | 部分 | 有年龄与性别,无种族、体重、合并症 |
| 队列纳入排除标准 | 否 | 未给出 |
| 采集时间跨度 | 否 | 无日期字段 |
| 设备与厂商 | 部分 | 提到 GE MUSE 为信息系统,未说明记录设备 |
| 滤波与预处理 | 否 | 未说明 |
| 信号质量指标 | 否 | 无逐记录质量评分 |
| 缺失数据处理 | 否 | 用药/病史/症状统一为 Unknown,未说明缺失机制 |
| 数据划分建议 | 否 | 未给训练测试划分 |
| 代码可用性 | 部分 | 提供转换工具与去噪代码的仓库链接,非本数据集配套分析代码 |
| 许可与访问条款 | 是 | CC BY 4.0,明确 |
| 伦理审批 | 是 | 两家医院 IRB 批准,豁免知情同意 |
| 知情同意 | 是 | 豁免,且说明去标识后公开 |
| 资助来源 | 是 | 逐项列出 |
| 版本与 DOI | 是 | v1.0.0,两个 DOI |
| 已知限制 | 部分 | 未单列限制章节,限制散见各处 |
是 11 项,部分 6 项,否 7 项。缺得最多的是「人」与「流程」两侧:纳入标准、标注一致性、采集时间、信号质量。
§5 能做什么:五类用法
5.1 用法一:多标签心电异常分类
最标准的用法。输入十二导联十秒波形,输出 55 个标签各自的有无。
关键决策有三个。一是标签怎么处理(只保留样本量够的,比如至少 200 例,通常会剩二十来个)。二是评估怎么算(宏平均 F1 对小标签不公平,微平均 F1 被大标签主导,建议两个都报)。三是划分怎么定(按记录随机划分会高估,因为同一患者可能多次就诊——但这数据没有患者 ID,所以只能在记录层划分,且必须承认这个乐观偏差)。
5.2 用法二:预训练与迁移
四万五千份、五百赫兹、十二导联,这个规模适合当预训练语料。先在它上面做自监督(掩码重建、对比学习),再迁到小规模的下游任务(比如某个特定心律失常的细分类)。
这个用法绕开了标签噪声问题——自监督不需要标签。它只用波形,而波形是这份数据里最可靠的部分。
5.3 用法三:节律与传导的规则验证
因为标签是按 SNOMED CT 编码的,而每个编码有明确的临床定义,可以用这份数据做「规则能否复现标签」的实验。
比如:用 RR 间期变异系数加 P 波检测,能否复现 AFIB 标签?用 QRS 时限加 V1 形态,能否复现 RBBB 标签?这类实验的价值不在模型性能,而在量化「算法与临床定义的重合度」。
5.4 用法四:信号质量与可判读性研究
数据里有相当比例的心电可能质量不佳(电极接触差、基线漂移、肌电干扰),但没有质量标记。
可以做的事:无监督地聚类出质量类型,再看每类的标签分布。若某个质量簇的标签分布显著偏离总体,说明标签可能受了信号质量影响——这是一个能自己补上的质控层。
5.5 用法五:作为其他模型的测试集
把它当外部测试集,评估在别的数据上训练的模型。
这个用法要注意人群差异:两家中国三甲医院的心电科人群、中位年龄 63 岁、男性占六成以上。用它测一个在欧美人群上训练的模型,性能下降有多少是数据漂移、多少是标签定义差异,很难分开。
5.6 用法六:做年龄与性别的基线曲线
这份数据有年龄与性别,规模又够大,因此可以画一些基础曲线:不同年龄段的平均心率、QRS 时限、QT 间期、电轴分布。
这些曲线本身没有新发现(教科书上都有),但用一份四万五千份的中国数据重新画一遍,有它的用途:一是检验教科书数字在本地人群上是否成立;二是给下游模型提供「按年龄校正」的参考;三是暴露数据本身的问题(比如某个年龄段的样本极少,曲线在那里不可信)。
做这件事要注意两点。一是年龄是整数岁,没有更细的分辨率。二是没有种族与体重,而这两项对 QRS 电压影响很大(肥胖者的胸导联电压偏低),所以电压类指标的人群比较要谨慎。
5.7 用法七:可控的噪声注入实验
因为波形是干净的(至少格式规范),可以人为注入噪声(基线漂移、肌电、工频),观察模型性能的退化曲线。
这类实验的价值是给出「这个模型在什么噪声水平下还能用」的定量答案,比单点准确率更有工程意义。做法是:选一个训练好的模型,按信噪比阶梯注入噪声,每个阶梯报一次宏平均 AUROC,画出退化曲线。
这条曲线的形状通常不是线性的——在某个噪声水平之后会断崖式下跌。那个拐点就是模型的可用边界。
5.8 七类用法的共同前提
无论做哪一类,有三件事必须先做:扫一遍全量的 #Dx: 取值(确认是否只有 55 个编码)、统计每个标签的样本量(决定保留哪些)、检查年龄与性别的分布(决定要不要分层)。
这三件事都不在文档里,只能自己算。§11.4 给了代码。
5.9 一条容易被忽略的前提:波形才是可靠的
把 §5 的七条用法排在一起看,会发现它们对数据的依赖不同。
依赖标签的(§5.1、§5.3、§5.5)受制于标签噪声;依赖波形的(§5.2、§5.6、§5.7)不受这个限制。
这个区分值得记住,因为它是这份数据最实用的一条判断标准:凡是用到波形的部分,这份数据是可靠的;凡是用到标签的部分,都要先问一句「这个标签是怎么来的」。 四万五千份十二导联十秒波形,格式规范、采样率统一、体量适中,这本身就是一个稳的基础;而标签是一层在其上的、带噪声的解释。
很多研究把这两者混在一起谈,导致结论的可靠度被标签拖累。分开谈,就能各用其长。
§6 常见误读与五处陷阱
6.1 误读一:把记录数当患者数
文档写的是「四万五千余名患者的十二导联心电」,但数据里只有记录号,没有患者 ID。
若同一患者做过多次检查,这四万五千份记录对应的患者数会少于四万五千。少多少不知道。因此「每患者一份」是一个无法验证的假设。
6.2 误读二:把编码当诊断金标准
SNOMED CT 编码是「临床概念的标准化表达」,不是「诊断结论」。同一个编码可以对应不同严重程度、不同病因的情况。而这份数据的编码又来自自动报告,所以它是「标准化之后的算法判断」。
用它当金标准做误差分析,会把算法的错当成真实的病。
6.3 误读三:把窦缓高频次读成人群特征
§2.6 发现窦性心动过缓在抽样里出现 56 次,是最高频的标签。这不代表中国人群中窦缓的患病率高,只代表「来心电科做检查且报告里写了窦缓」的人多。
选择偏倚在这类医院数据里是结构性的,不能反推人群。
6.4 陷阱一:随机划分导致的乐观偏差
按记录随机划分训练测试集,会因为同一患者的多份记录分处两边而泄漏。这个问题在没有患者 ID 时无法完全解决,只能承认。
一个缓解办法是:按记录号分块划分(比如前 80% 记录号训练、后 20% 测试)。这样至少避免了「相邻记录号来自同一患者同一次就诊」的泄漏,因为同一患者的记录号通常不连续。
6.5 陷阱二:把 4.88 微伏当固定换算
4.88 这个数来自「量程上限 32767 对应 0.16 伏」的推算。但头文件里每导联都有自己的增益字段(1000/mV),标准做法是用头文件的增益换算,不是用全局的 4.88。
若某个导联的增益不是 1000,用 4.88 会算错。正确的读法是:物理值(毫伏)= 存储值 ÷ 增益 × 单位系数。
6.6 陷阱三:忽略导联间的时间对齐
十二导联不是同时刻采的——常规心电设备通常按顺序扫过各导联组(三组肢体导联、一组胸导联,或更细的分组),每组采一小段,再拼接成「看起来同步」的十秒。
这意味着不同导联的同一下标可能对应不同时刻。对单导联分析无影响,对需要跨导联比较时间(如 QT 离散度、碎裂 QRS 的空间分布)的分析则有影响。
这个细节数据里没写,但它是常规心电设备的通行做法,用之前应当向数据提供方确认。
6.7 陷阱四:把 Unknown 当缺失随机
#Rx: Unknown 不是「随机缺失」,是「这个字段从来没被填写」。这两者在统计上完全不同:随机缺失可以插补,从未填写的字段插补出来的是假的。
正确处理是:承认这三项不可用,在方法学部分写明,而不是试图用年龄性别去预测它们。
6.8 陷阱五:拿 CSV 版与 WFDB 版混用
CSV 版是一万零六百余人,WFDB 版是四万五千余人。若你的流程里一部分代码读 CSV、一部分读 WFDB,很可能在不知情的情况下用了两个不同的样本范围。
统一用 WFDB 版,或者明确记录用了哪一版。
§7 在生态中的位置
7.1 与 PTB-XL 的分工
PTB-XL 是另一份常用的公开十二导联心电库:约两万一千份记录、一万八千名患者、五百赫兹、十秒,标签来自心内科医生的结构化报告,用 SCP-ECG 体系。
两份数据的对照很有意思:PTB-XL 的标签体系更细(SCP-ECG 有诊断、形态、节律三层),标注流程更接近人工判读;这份数据的规模更大(四万五千),标签来源更接近临床实际工作流(自动报告加复核)。
选哪一个取决于研究问题:做细粒度形态分析,PTB-XL 的标签更合适;做规模化训练或复现临床部署场景,这份更合适。
7.2 与 2021 挑战赛数据的关系
前面说过,这份数据的格式与挑战赛一致。但两者的样本集合不完全重叠——挑战赛用了多来源数据,这份是其中一支。
若要在挑战赛的评分体系下比较模型,需要确认「你的训练集里有没有包含挑战赛的隐藏测试集记录」。文档没给这个信息,只能靠谨慎。
7.3 在中文心电数据里的位置
中文语境下的公开十二导联心电数据很少。CPSC 系列(中国生理信号挑战赛)曾发布过一批,但规模与开放性都不如这份。
这份数据的价值在于:它是少数「中国人群、公开许可、规模够大、格式规范」的十二导联心电库。这对做人群差异研究(比如中国人群的早期复极比例、电轴偏移分布)是稀缺资源。
7.4 规模上的位置
放在公开心电数据里,四万五千份属于中上规模。比它大的有 MIMIC-IV-ECG(约八十万份),但那是重症监护场景、导联配置不同、许可也不同。
它的定位是「常规门诊心电」这一档里规模最大的公开库之一。
7.5 适合谁用
适合:做心电分类方法学的、做预训练语料的、做中文人群基线统计的、需要一份格式规范的外部测试集的。
不适合:做长程心律监测的、做儿科心电的、需要心搏级标注的、需要用药上下文的。
§8 建模的实操建议
8.1 按导联组做输入是有依据的
十二导联不是平等的。肢体导联(I、II、III、aVR、aVL、aVF)是额面投影,胸导联(V1 至 V6)是水平面投影。前者擅长看电轴与下壁,后者擅长看前壁与左室肥厚。
若模型容量有限,一个合理的做法是:先按导联组分别编码,再合并。这比把十二个通道直接堆进一维卷积要省参数,也更容易解释。
8.2 采样率要不要降
500 赫兹降到 250 赫兹,对节律与传导分析几乎无损,对 ST-T 形态影响也很小,但对 QRS 切迹(fQRS)与高频成分有影响。
若任务只涉及节律与主要形态,降到 250 可以省一半内存与算力。若涉及碎裂 QRS 或晚电位,必须保留 500。
8.3 类别不平衡的处理顺序
五十五个标签的样本量差异极大(从个位数到数万)。正确的处理顺序是:先按样本量筛标签(保留 ≥200 例的),再在剩下的标签上调损失权重或做重采样。
不要一上来就对全部 55 个标签做加权——小标签的权重会大到让模型在小标签上过拟合。
8.4 评估指标的选择
建议报三组:宏平均 AUROC(对类别不平衡不敏感,是心电领域的通行指标)、宏平均 F1(对阈值敏感,反映实际可用性)、每类样本量与每类 AUROC 的表(让人能看出模型在哪类上不行)。
第三组最容易被省略,也最重要。平均指标会把「房颤 0.99、U 波 0.51」平均成 0.97,看起来很好。
8.5 一个必须做的基线
用年龄、性别加三个简单特征(心率、QRS 时限、QT 间期)做逻辑回归。
这个基线在许多标签上会意外地强——因为它抓到了「老年人更容易有传导阻滞」「心率快的人更可能是窦速」这类关联。若复杂模型赢不过它,说明模型学到的主要是人口学关联,不是波形特征。
8.6 过拟合的迹象
四条:训练与验证的 AUROC 差距随 epoch 扩大;模型在某个标签上的表现与该标签的样本量高度相关(说明在背样本);换随机种子后宏平均 AUROC 波动超过两个百分点;模型对导联顺序敏感(把十二导联随机重排后性能大幅下降,说明它没学到空间关系)。
8.7 五条失败模式
一,模型学到了「记录号」——若按记录号顺序划分,模型可能通过某些与记录号相关的系统性差异(不同批次采集)来区分,而不是波形。
二,模型学到了「年龄」——年龄与多个标签强相关,模型可能走捷径。
三,模型对基线漂移敏感——若训练集与测试集的滤波器设置不同,性能会断崖。
四,模型在低质量记录上失效——没有质量标记,模型可能学到了质量特征而非病理特征。
五,模型无法处理多标签共现——用 softmax 而非 sigmoid 会强制互斥,与数据的多标签性质冲突。
§9 三条技术路线的对照
9.1 规则加特征工程:可解释,上限低
手工算心率、PR 间期、QRS 时限、QT 间期、电轴,再用阈值规则判读。
优势是完全可解释,且能直接对照临床标准;劣势是规则组合爆炸,且对形态细微改变无能为力。这个路线适合做基线,也适合做「规则能否复现标签」的研究。
9.2 一维卷积网络:主流,成熟
十二通道一维卷积,加全局池化,多标签输出。这是 2021 挑战赛的主流方案,开源实现很多。
优势是效果好、训练快、有大量可参考的超参;劣势是可解释性差,且对长程依赖(十秒内的节律变化)建模能力有限。
9.3 序列模型与 Transformer:对数据量的要求最高
把十二导联切成 patch,用 Transformer 建模。这条路在八十万份规模的 MIMIC-IV-ECG 上有效,在四万五千份上容易过拟合。
若要用,建议先在大库上预训练,再在这份数据上微调。
9.4 一个常被忽略的中间路线:把自动分析当特征
除了「端到端」与「手工规则」,还有第三条:把心电设备自带的测量值(PR 间期、QRS 时限、QT、电轴)当特征,再训一个浅层分类器。
这条路的好处是特征稳定、可解释、对样本量要求低;坏处是它继承了设备的测量误差,而且这些测量值本身往往就是自动报告的产物——用它当特征去预测自动报告的标签,等于用「算法的中间结论」预测「算法的最终结论」,会得到虚高的准确率。
判断是否落入这个陷阱的办法很简单:看特征的来源与标签的来源是不是同一个系统。若是同一个,结果不可信。这在别的心电数据上只是一条建议,在这份数据上几乎是一条禁令。
9.5 选择建议
做方法学研究,走 §9.2 加一个 §9.1 的基线;做可解释性研究,走 §9.1;有更大预训练语料,走 §9.3。
§10 术语与口径速查
| 术语 | 本页用法 |
|---|---|
| 十二导联 | I、II、III、aVR、aVL、aVF 加 V1 至 V6 |
| 增益 | 存储值到物理电压的换算系数,本库为 1000 每毫伏 |
| 基线 | 头文件中每导联的直流偏移,用于还原真实电压 |
| SNOMED CT | 系统化医学术语集,本库用其编码表示诊断 |
| 多标签 | 一条记录可同时有多个诊断编码 |
| 窦性心动过缓 | 窦性心律且心率低于 60 次每分 |
| 束支阻滞 | 希氏束以下传导受阻,分左右两束 |
| 分支阻滞 | 左束支前后分支的阻滞,本库与左束支阻滞同码 |
| 碎裂 QRS | QRS 波内出现多个切迹,提示心肌瘢痕 |
| 宏平均 | 各类指标先算再平均,对小类公平 |
§11 事实清单与附录
11.1 核心事实
| 项目 | 值 |
|---|---|
| 全称 | A large scale 12-lead electrocardiogram database for arrhythmia study |
| 版本 | 1.0.0(2022-08-24 发布) |
| DOI | 10.13026/wgex-er52(本版);10.13026/92ks-sq55(最新) |
| 托管 | PhysioNet |
| 访问 | 公开,CC BY 4.0 |
| 记录数 | 45,152 |
| 每份时长 | 10 秒(5000 点,500 赫兹) |
| 导联 | 12 |
| 量化 | 16 位,4.88 微伏每单位,增益 1000 每毫伏 |
| 解压后大小 | 5.1 GB |
| 压缩包大小 | 2.3 GB |
| 文件总数 | 90,762(90,304 个记录文件 + 3 个顶层 + 452 个二级目录 RECORDS) |
| 目录结构 | 46 个一级目录(01–46)、452 个二级目录,451 个各 200 条、末位 104 条 |
| 记录号 | JS00001–JS45551,实有 45,152,缺号 399 |
| 诊断编码 | 55 个 SNOMED CT 编码 |
| 标签来源 | GE MUSE 自动分析报告,经专业人员复核 |
| 伦理 | 绍兴市人民医院与宁波市第一医院 IRB 批准,豁免知情同意 |
| 来源机构 | 查普曼大学、绍兴市人民医院、宁波市第一医院 |
11.2 六个可立即验证的疑问
一,#Dx: 里到底出现过多少个不同的编码?官方表是 55 个,但抽样已发现表外的 55827005,全量扫描能确定实际数量。
二,各标签的真实样本量分布如何?抽样里最少的标签只出现 1 次,全量能确定哪些标签样本量不足 100。
三,有没有重复记录?没有患者 ID,但可以用波形哈希查完全相同的记录。
四,年龄与性别的完整分布如何?抽样只覆盖 145 条,全量能出真实分布与缺失比例。
五,信号质量分布如何?可以算每条记录的基线漂移幅度、高频噪声功率,聚成几类。
六,CSV 版与 WFDB 版的交集有多大?两版都用记录名,可以按名字比对。
11.3 下载与校验的最小流程
echo "── 方式一:ZIP 整包 ──"
wget -c https://physionet.org/files/ecg-arrhythmia/1.0.0/ecg-arrhythmia.zip
echo "── 方式二:S3 同步(推荐,支持并行与续传)──"
aws s3 sync --no-sign-request s3://physionet-open/ecg-arrhythmia/1.0.0/ ./ecg-arrhythmia/
echo "── 校验 ──"
cd ./ecg-arrhythmia/ && sha256sum -c SHA256SUMS.txt --quiet
第二方式的路径若不通,回退到第一种。若要单文件补,用 wget -c 加完整 URL,不要用 curl 单次抓取(§3.3)。
11.4 附录 A:读一条记录并还原物理电压
import numpy as np, scipy.io as sio
print("── 解析头文件 ──")
def read_hea(path):
lines = open(path).read().splitlines()
name, n_sig, fs, n_samp = lines[0].split()[:4]
sigs = []
for ln in lines[1:1 + int(n_sig)]:
p = ln.split()
sigs.append({"file": p[0], "gain": float(p[2].split("/")[0]),
"baseline": float(p[4]), "name": p[-1]})
meta = {}
for ln in lines[1 + int(n_sig):]:
if ln.startswith("#") and ":" in ln:
k, v = ln[1:].split(":", 1)
meta[k.strip()] = v.strip()
return {"fs": int(fs), "n": int(n_samp), "sigs": sigs, "meta": meta}
h = read_hea("/tmp/ecg_hea/JS04457.hea")
print(h["fs"], h["n"], len(h["sigs"]), h["meta"].get("Dx"))
print("── 还原电压,单位为毫伏 ──")
d = sio.loadmat("/tmp/JS00001.mat")["val"]
mv = (d - np.array([s["baseline"] for s in h["sigs"]])[:, None]) / np.array(
[s["gain"] for s in h["sigs"]])[:, None]
print(mv.shape, mv[:, :3].round(3))
print("── 单导联峰峰值(毫伏)──")
print({s["name"]: round(float(mv[i].ptp()), 3) for i, s in enumerate(h["sigs"])})
第三段那行输出是检查信号质量最快的办法:峰峰值低于 0.1 毫伏的导联,基本可以判定为接触不良或脱落。
11.5 附录 B:全量扫描诊断编码
import re, collections, pathlib
print("── 扫全部头文件里的 Dx 值 ──")
cnt = collections.Counter()
for p in pathlib.Path("WFDBRecords").rglob("*.hea"):
for ln in open(p, errors="ignore"):
if ln.startswith("#Dx:"):
for c in ln[4:].split(","):
c = c.strip()
if c:
cnt[c] += 1
break
print("不同编码数", len(cnt))
print("出现 <100 次的编码", [c for c, n in cnt.items() if n < 100])
print("表外编码", [c for c in cnt if c not in set(open("CondNames.txt").read().split())])
这段跑完,§11.2 的前两个问题就有答案了。注意遍历九万个文件,在机械硬盘上会慢,建议放到本地 SSD。
11.6 附录 C:证据链
- 数据集条目页:
https://physionet.org/content/ecg-arrhythmia/1.0.0/(Abstract、Background、Data Description、Usage Notes、Release Notes、Ethics、Acknowledgements、References) - 许可与体量:页面 Files 段给出解压 5.1 GB、压缩 2.3 GB
- 编码表:
ConditionNames_SNOMED-CT.csv,55 行数据行 - 校验和清单:
SHA256SUMS.txt,8,711,012 字节 / 90,759 行;其中头文件与数据文件各四万五千一百五十二份,其余 455 项为三个顶层文件加四百五十二个二级目录的RECORDS - 目录结构:一级 46 个(
01–46)、二级 452 个;451 个二级目录各 200 条记录,46/461装 104 条 - 记录号:JS00001–JS45551,缺号 399(前十个缺号是 3、28、35、98、135、136、149、214、246、275)
- 头文件样本:按每 40 条抽 1 条,共取到 145 份,全部为 12 导联、500 赫兹、5000 点
- 数据文件样本:
JS00001.mat为 120,024 字节,val矩阵形状 12×5000,int16
凡属分析性内容(§2.6 的抽样统计、§4.6 的 DAIMS 判定、§8 与 §9 的建模建议、§11.4 与 §11.5 的代码)为基于文件核对与领域常识的推演,非官方结论。凡标注「文档说」的均为条目页原文表述。
编辑说明
本页依据 PhysioNet 条目页与随附的编码表、校验和清单写成(2026-10-19 取)。数据本体未全量下载:ZIP 为 2.3 GB,本次只取了校验和清单、编码表、许可文件,以及按记录号每四十条抽一份的 145 份头文件与一份 MAT 数据文件。
抽样方法及其局限:145 份头文件覆盖了全部记录号范围(从 JS00001 附近到库尾),但因为原始清单下载曾多次中断、逐次续传补齐,抽样时的记录总数在下载过程中是变化的,因此这 145 份不是严格等距抽样。所有抽样统计(年龄、性别、标签频次)应视为量级参考,不是精确估计。
本页最有价值的一处发现也许是 §2.6 那个表外编码:55827005 出现 19 次,不在官方 55 个编码表里。这说明「官方编码表」与「头文件实际内容」并不完全一致,用之前必须自己扫全量。这类不一致不会写在文档里,只能靠核对发现。
本页未做的事:未做信号质量评估(需要全量波形);未核对 CSV 版与 WFDB 版的交集;未验证 §6.6 关于导联非同步采集的推断(这需要原始设备的采集时序说明,数据里没有)。

