QM9 — 量子化学分子性质基准数据集 AI-Ready Wikipedia | 千方医数集

13.4万分子 · 9重原子内 · B3LYP DFT · 15量子性质 · 图神经网络黄金基准 · CC0

来源 University of Basel / figshare url: https://www.nature.com/articles/sdata201422发布时间: 2026-08-14最后更新: 2026-08-14 阅读 69

信息速览

数据集名称QM9 — 量子化学分子性质基准数据集 AI-Ready Wikipedia | 千方医数集
数据类型约 134K 分子,15 量子性质/分子,约 82MB 下载,CC0 许可
规模纯计算化学数据集
接入方式University of Basel / figshare url: https://www.nature.com/articles/sdata201422
AI 就绪度

数据集封面

INFOBOX

字段
数据集全称 QM9(Quantum Machine 9)
创建机构 University of Basel · Max-Planck-Institut für Kohlenforschung · Argonne National Laboratory
核心团队 Raghunathan Ramakrishnan · Pavlo O. Dral · Matthias Rupp · O. Anatole von Lilienfeld
发表期刊 Nature Scientific Data 1, 140022 (2014)
DOI(论文) 10.1038/sdata.2014.22
DOI(数据集) 10.6084/m9.figshare.c.978904
数据来源 GDB-17 化学宇宙库(166 亿分子枚举)的 GDB-9 子集
分子数量 133,885(原始)/ 130,831(去除 3,054 未表征分子后)
原子类型 C · H · N · O · F(最多 9 个重原子)
理论水平 DFT B3LYP/6-31G(2df,p)
性质数量 15 个标量性质/分子(MoleculeNet 使用 12 个回归目标)
数据格式 扩展 XYZ(.xyz)
下载大小 ~82 MB(压缩后)
许可证 CC0 1.0 Universal(公共领域)
DUO 标签 无限制(CC0 公共领域)
AI 就绪度 ★★★★★(DAIMS 21/24)
GNN 基准地位 图神经网络分子性质预测的黄金标准基准

§0 E-E-A-T 信任声明与免责声明

维度 声明
专业性(Expertise) QM9 由量子化学和机器学习交叉领域权威团队创建:von Lilienfeld 教授是量子化学机器学习(QML)领域的开创者之一,Rupp 博士是分子表示学习先驱。数据计算使用 Gaussian 09 标准量子化学软件包,DFT 方法 B3LYP/6-31G(2df,p) 是量子化学领域广泛验证的计算水平。
经验性(Experience) 团队在发表 QM9 之前已在量子化学计算和高通量分子性质计算方面积累了多年经验。GDB 化学宇宙库系列(GDB-11/13/17)已在化学信息学领域获得广泛引用。
权威性(Authoritativeness) 数据集发表于 Nature Scientific Data(IF ~5.5),是数据描述类文章的顶级期刊。被 MoleculeNet(Chemical Science, 2018, 引用 4,425+)、SchNet(NeurIPS 2017)、DimeNet(ICLR 2020)等里程碑论文选为标准基准。
可信性(Trustworthiness) 全部 DFT 计算参数公开(基组、泛函、收敛阈值),数据文件可从 figshare 公开下载。3,054 个未表征分子有明确标记,curatedQM9 项目已对其中 2,830 个进行修复。数据集许可证为 CC0,无任何使用限制。
透明性(Transparency) 原始论文详细描述了计算流程:SMILES → 3D 构建 → PM7 预优化 → B3LYP/6-31G(2df,p) 最终优化 → 性质计算。每个分子的 SMILES、InChI 和几何结构均可追溯至 GDB-17 枚举过程。
审核机制 [千方病案医学编辑部]交叉审核:量子化学数据集内容审核、DFT 方法论准确性、GNN 基准性能数据一致性

免责声明:QM9 是纯计算化学(in silico)数据集,不涉及任何临床或患者数据。DFT 计算结果依赖所选理论水平(B3LYP/6-31G(2df,p)),与实验值可能存在偏差。本页面旨在为 AI/ML 从业者提供数据集使用指南,不构成化学或材料科学的专业建议。分子性质预测模型的性能高度依赖于数据划分策略和评估指标选择。

§1 数据集概览

§1.0 📌 30 秒速览

维度 要点
是什么 133,885 个小有机分子的量子化学性质数据库(DFT 计算结果)
为什么重要 分子图神经网络(GNN)性能评估的事实标准基准——几乎所有 3D GNN 论文都在 QM9 上报告 MAE
数据来源 GDB-17 化学宇宙库中最多 9 个重原子(C/N/O/F)的子集
理论水平 B3LYP/6-31G(2df,p) 密度泛函理论
核心内容 每个分子的 3D 坐标 + 15 个标量性质 + Mulliken 电荷 + 振动频率 + SMILES/InChI
许可证 CC0 1.0——完全公共领域,无任何使用限制
最常用版本 MoleculeNet 版(去除 3,054 未表征分子,保留 130,831 个)
标准划分 110K 训练 / 10K 验证 / 11K 测试(MoleculeNet scaffold split)
SOTA 模型 ViSNet(Nature Comm 2024)——多数性质 MAE 最低
关键坑点 3,054 分子几何不稳定需排除;B3LYP 有自相互作用误差;仅覆盖小分子化学空间极小子集

§1.1 摘要

QM9(Quantum Machine 9)是由 Ramakrishnan、Dral、Rupp 和 von Lilienfeld 于 2014 年在 Nature Scientific Data 发表的量子化学基准数据集。该数据集收录了 133,885 个稳定小有机分子的密度泛函理论(DFT)计算结果——包括 3D 平衡几何结构、几何/能量/电子/热力学性质——所有计算在 B3LYP/6-31G(2df,p) 理论水平下完成。

这些分子源自 Ruddigkeit 等人 2012 年发表的 GDB-17 化学宇宙库(包含 1,660 亿个分子的枚举),其中 QM9 对应 GDB-9 子集:所有最多含 9 个重原子(C、N、O、F)的中性分子。数据集覆盖 621 种化学计量比,其中 C₇H₁₀O₂ 以 6,095 种同分异构体居首。此外,1,705 个两性离子(与氨基酸等小生物分子相关)被保留在数据集中。

每个分子记录包含 15 个标量性质(偶极矩、极化率、HOMO/LUMO 能量、HOMO-LUMO 能隙、电子空间范围、零点振动能、0K/298K 内能、298K 焓、298K 自由能、298K 热容、三个转动常数),Mulliken 部分电荷,谐振振动频率,以及从 GDB-17 和 B3LYP 优化几何结构分别生成的 SMILES 和 InChI 字符串。

3,054 个分子在几何优化过程中发生了结构重排,被标记为"uncharacterized"(未表征),实际可用于机器学习的分子数为 130,831。curatedQM9 项目(Senthil 等人, 2021)通过连接性保持几何优化(ConnGO)方法成功修复了其中 2,830 个分子。

QM9 已成为分子图神经网络性能评估的黄金标准基准。从 SchNet(NeurIPS 2017)到 DimeNet/DimeNet++(ICLR 2020)、PaiNN(ICLR 2021)、EGNN(ICML 2021)、GemNet、Equiformer 和 ViSNet(Nature Comm 2024),几乎所有 3D 分子 GNN 架构都在 QM9 上报告了 12 个回归目标的平均绝对误差(MAE)。MoleculeNet 基准测试套件(Wu 等人, Chemical Science, 2018, 引用 4,425+)将 QM9 列为量子化学回归任务的核心数据集。

§1.2 为什么重要

QM9 在 AI for Science 领域的地位可以从以下几个维度理解:

  1. 化学空间的系统性覆盖:GDB-17 枚举了所有可能的稳定有机分子(最多 17 个重原子),QM9 取其中最小的 9 原子子集,提供了化学空间的一个系统性、无偏见的采样。与从数据库(如 ChEMBL、PubChem)中收集的分子不同,GDB 枚举不依赖已知合成路线,因此覆盖了更广的化学多样性。

  2. DFT 一致性:所有 133,885 个分子的所有性质都在完全相同的理论水平(B3LYP/6-31G(2df,p))下计算,使用相同的软件(Gaussian 09)和收敛标准。这种一致性消除了跨数据源合并时的系统性误差,是机器学习模型评估的前提条件。

  3. 多任务回归基准:15 个标量性质覆盖了几何(转动常数、偶极矩、极化率、电子空间范围)、电子(HOMO/LUMO/能隙)和热力学(零点能、内能/焓/自由能/热容)三个维度,使模型必须在多物理量上同时表现良好。

  4. 3D 几何信息:每个分子包含 DFT 优化后的 3D 原子坐标,使得 3D 图神经网络(利用原子间距离和角度信息)可以在此数据集上充分发挥优势。这是 QM9 区别于仅基于 2D 拓扑的分子数据集(如 Tox21、ESOL)的核心特征。

  5. 开放许可:CC0 许可证意味着数据完全进入公共领域,商业使用无需任何许可或署名——这极大促进了数据集的广泛采用和衍生工具链的发展。

§1.3 对比表

数据集 分子数 原子类型 理论水平 性质数 任务类型 许可证 特色
QM9 133,885 C,H,N,O,F B3LYP/6-31G(2df,p) 15 回归 CC0 3D GNN 黄金基准
QM7b 7,211 C,H,N,O,S,Cl DFT-GGA 14 回归 免费 更大原子范围但分子少
MD17 7–10 多种 DFT/PBE/CCSD(T) 1 力场回归 免费 构象轨迹(非平衡)
ANI-1 20M C,H,N,O ωB97X/6-31G(d) 1 能量回归 免费 超大规模构象采样
ANI-1x 5M C,H,N,O,F,S,Cl ωB97X/6-31G(d) 1 能量+力 免费 主动学习生成
OC20 130M 多种 DFT 1 吸附能 CC-BY 催化剂表面
GEOM 139K 多种 半经验/优化 3D 构象 MIT 多构象采样
Tox21 7,831 多种 实验/HTS 12 分类 公共领域 毒性筛选(非 QM)
ChEMBL 2.3M 多种 实验/混合 多任务 CC-BY-SA 生物活性
PubChem 119M 全部 混合 多任务 CC-BY-SA 最大分子数据库

§1.4 时间轴

日期 事件
2009 Reymond 团队发表 GDB-11(2,640 万分子枚举),开创化学宇宙库系列
2012-11 Ruddigkeit 等人发表 GDB-17(1,660 亿分子枚举),JCIM 52:2864
2012–2014 Ramakrishnan 等人对 GDB-9 子集进行 B3LYP/6-31G(2df,p) DFT 计算
2014-08-05 QM9 数据集正式发表于 Nature Scientific Data 1, 140022
2014-08-05 figshare 上发布完整数据(CC0 许可),DOI: 10.6084/m9.figshare.c.978904
2017-12 SchNet(NeurIPS 2017)首次将 QM9 作为 3D GNN 基准,建立 MAE 评估范式
2018-01 MoleculeNet(Chemical Science 9:513)将 QM9 列为核心回归基准
2020-02 DimeNet(ICLR 2020)引入方向消息传递,在 QM9 上大幅超越 SchNet
2020-11 DimeNet++ 引入高效化改进,速度提升 8 倍,MAE 进一步降低
2021-01 PaiNN(ICLR 2021)引入等变标量-向量交互,偶极矩 MAE 降至 12 mD
2021-06 EGNN(ICML 2021)证明等变 GNN 在 QM9 上具有竞争力
2021-06 Senthil 等人发表 curatedQM9,修复 3,054 中的 2,830 个未表征分子
2022-06 GemNet 引入几何消息传递,多数 QM9 性质 MAE 创新低
2023-01 Equiformer 引入等变 Transformer,QM9 多项 SOTA
2024-01 ViSNet(Nature Comm 15:313)在多数 QM9 性质上达到当前 SOTA

§1.5 典型用例

用例 描述 典型模型
GNN 性能评估 在 12 个回归目标上评估 3D 分子图神经网络的 MAE/RMSE SchNet, DimeNet++, PaiNN, EGNN, ViSNet
分子表示学习 预训练分子编码器,迁移到下游药物发现任务 GemNet, Equiformer, MoleculeBERT
不确定性量化 评估模型预测的置信度和校准性 Deep Ensemble, Bayesian GNN
主动学习 选择性 DFT 计算——模型选择最有价值的分子进行标注 Baldi, Smith
分子生成评估 评估生成模型产生的分子是否覆盖 QM9 化学空间 GraphAF, MolGAN, EDM
量子力学近似 用 ML 模型近似 DFT 计算,加速高通量筛选 SchNet, sGDML, Allegro

§2 量子化学背景

适配说明:QM9 是量子化学(非临床)数据集。本节将标准模板中的"医学背景"适配为"量子化学背景",包括分子标识符映射、计算化学任务定义、DFT 理论水平说明、分子性质分类和计算化学意义。

§2.1 分子标识符与编码映射

QM9 中的每个分子可通过多种标识符体系进行关联和互操作:

标识符体系 QM9 中的格式 转换方法 外部数据库
GDB-17 ID gdb{编号} (如 gdb1gdb133885) 原始枚举编号 GDB-17 数据库
SMILES (GDB) 第 3 行倒数第 2 字段 RDKit 解析 → 2D 拓扑图 PubChem, ChEMBL
SMILES (B3LYP) 第 3 行倒数第 1 字段 与 GDB SMILES 对比验证几何稳定性
InChI (Corina) 第 3 行最后字段(从 Corina 几何生成) InChI key 前缀搜索 ChemSpider, PubChem
InChI (B3LYP) 第 3 行倒数第 3 字段 与 Corina InChI 对比验证
PubChem CID 无直接映射 SMILES → PubChem PUG-REST 查询 PubChem
原子序数 XYZ 文件中元素符号 → Z (H=1, C=6, N=7, O=8, F=9) 直接转换
Mulliken 电荷 XYZ 文件第 5 列 电子密度分析结果

关键转换示例

# QM9 XYZ 文件解析
with open(''''''''''''''''''''''''''''''''dsgdb9nsd_000001.xyz'''''''''''''''''''''''''''''''') as f:
    n_atoms = int(f.readline())
    properties = f.readline().split()  # 15 个标量性质
    atoms = []
    for i in range(n_atoms):
        parts = f.readline().split()
        atoms.append({
            ''''''''''''''''''''''''''''''''element'''''''''''''''''''''''''''''''': parts[0],
            ''''''''''''''''''''''''''''''''x'''''''''''''''''''''''''''''''': float(parts[1]), ''''''''''''''''''''''''''''''''y'''''''''''''''''''''''''''''''': float(parts[2]), ''''''''''''''''''''''''''''''''z'''''''''''''''''''''''''''''''': float(parts[3]),
            ''''''''''''''''''''''''''''''''mulliken_charge'''''''''''''''''''''''''''''''': float(parts[4])
        })
    # 后续行:振动频率、SMILES、InChI
    frequencies = [float(x) for x in f.readline().split()]
    smiles_gdb, smiles_b3lyp = f.readline().split()[:2]
    inchi_corina, inchi_b3lyp = f.readline().split()[:2]

§2.2 计算化学任务定义

QM9 支持的计算化学机器学习任务可按 5 个阶段分类:

阶段 任务 输入 输出 QM9 性质
1. 结构 → 标量性质 分子性质回归 3D 原子坐标 + 原子类型 连续标量值 全部 12 个回归目标
2. 结构 → 向量性质 偶极矩预测 3D 坐标 + 原子类型 3D 向量(方向+大小) μ(偶极矩)
3. 结构 → 频谱 振动频率预测 3D 坐标 + 原子类型 (3N-5/6) 个频率值 谐振振动频率
4. 结构 → 电荷 原子电荷预测 3D 坐标 + 原子类型 每原子标量 Mulliken 部分电荷
5. 结构 → 能量分解 能量分解 3D 坐标 U₀_atom, U_atom, H_atom, G_atom 4 个原子化能

§2.3 DFT 理论水平说明

QM9 的所有性质计算使用 B3LYP/6-31G(2df,p) 理论水平:

组件 详情
泛函 B3LYP(Becke 三参数交换泛函 + Lee-Yang-Parr 相关泛函),混合泛函,含 20% Hartree-Fock 精确交换
基组 6-31G(2df,p):分裂价键基组 + 重原子 2 组 d 极化函数 + 氢原子 1 组 p 极化函数
软件 Gaussian 09
几何优化 全自由度优化至梯度 < 收敛阈值
频率计算 解析谐振频率(非实际振动,忽略非谐效应)
电荷分析 Mulliken 布居分析(基组依赖性较强)
已知局限 B3LYP 对色散相互作用描述不足(无 D3/D4 校正);自相互作用误差影响电荷转移态;6-31G(2df,p) 基组对弱相互作用不足

G4MP2 子集:对 C₇H₁₀O₂ 化学计量比的 6,095 个同分异构体,额外计算了 G4MP2 复合方法级别的原子化能、焓和自由能——G4MP2 是更高精度的复合方法,B3LYP 结果可作为 ML 模型从低精度到高精度映射的训练数据。

§2.4 分子性质分类体系

QM9 的 15 个标量性质按物理维度分类:

类别 性质 符号 单位 物理含义
几何性质 转动常数 A A GHz 绕主轴 a 的转动惯量
转动常数 B B GHz 绕主轴 b 的转动惯量
转动常数 C C GHz 绕主轴 c 的转动惯量
偶极矩 μ D (Debye) 分子电偶极矩大小
极化率 α a₀³ 电子云对外电场的响应
电子空间范围 ⟨R²⟩ a₀² 电子分布的空间广度
电子性质 HOMO 能量 ε_HOMO Ha (原始) / eV (MoleculeNet) 最高占据分子轨道能量
LUMO 能量 ε_LUMO Ha / eV 最低未占分子轨道能量
HOMO-LUMO 能隙 Δε Ha / eV 前线轨道能隙
热力学性质 零点振动能 ZPVE Ha / eV 0K 下振动零点能
0K 内能 U₀ Ha / eV 0K 总内能
298K 内能 U Ha / eV 298.15K 总内能
298K 焓 H Ha / eV 298.15K 焓 (H = U + RT)
298K 自由能 G Ha / eV 298.15K Gibbs 自由能
298K 热容 Cv cal/(mol·K) 298.15K 定容热容

MoleculeNet 版本:MoleculeNet 仅使用前 12 个性质(μ, α, HOMO, LUMO, gap, R², ZPVE, U₀, U, H, G, Cv)作为回归目标,转动常数 A/B/C 和原子化能不包含在标准基准中。

§2.5 计算化学意义

QM9 中的量子化学性质在药物发现和材料科学中的意义:

性质 化学意义 应用场景
偶极矩 (μ) 分子极性,影响溶解度和膜渗透性 药物吸收/分布预测
极化率 (α) 分子对外电场响应,与折射率和分子间作用力相关 材料光学性质预测
HOMO 能量 电子给出能力(最高占据轨道) 氧化电位、反应活性
LUMO 能量 电子接受能力(最低空轨道) 还原电位、亲电性
HOMO-LUMO 能隙 电子跃迁能,化学稳定性指标 光学性质、导电性
零点振动能 0K 下残余振动能量 热化学精确计算
内能/焓/自由能 热力学稳定性 反应能垒、生成焓
热容 温度变化下的能量吸收能力 热管理材料设计

§3 数据集规格

§3.0 版本抉择矩阵

版本 分子数 描述 推荐场景 来源
QM9 原始版 133,885 包含 3,054 未表征分子 需要完整数据集对比 figshare 原始下载
QM9 去除未表征版 130,831 排除 3,054 重排分子 MoleculeNet 标准基准(推荐) MoleculeNet / TFDS / PyG
curatedQM9 133,660 ConnGO 修复 2,830 个未表征分子 需要最大分子覆盖率 moldis-group.github.io/curatedQM9
QM9 (DeepChem) 132,480 RDKit sanitization 过滤后 DeepChem 框架用户 DeepChem dc.molnet.load_qm9

决策建议:如果目标是与文献中的 GNN 基准对比,使用 去除未表征版(130,831 分子)。如果目标是最大化化学空间覆盖,使用 curatedQM9(133,660 分子)。如果使用 DeepChem 框架,注意 sanitization 会额外移除 ~5,405 个分子。

§3.1 数据模态

模态 描述 数量
3D 分子结构 DFT 优化的笛卡尔坐标(Å) 133,885 个分子
标量性质 15 个量子化学标量值/分子 133,885 × 15 = 2,008,275 个值
原子电荷 Mulliken 部分电荷(每原子 1 个值) 2,407,753 个原子电荷
振动频率 谐振振动频率(3N-5 或 3N-6 个/分子) 可变长度列表
分子标识符 SMILES(2 种来源)+ InChI(2 种来源) 4 个标识符/分子
元数据 分子编号、几何检查标记 2 个字段/分子

§3.2 样本统计

统计维度
总分子数 133,885(原始)/ 130,831(去除未表征后)
总原子数 2,407,753
平均原子数/分子 ~17.98(含 H)
最大原子数/分子 29
化学计量比数 621
最大化学计量比 C₇H₁₀O₂(6,095 种同分异构体)
两性离子数 1,705
未表征分子数 3,054(2.3%)
原子类型分布 H: 51.09% · C: 35.16% · O: 7.81% · N: 5.80% · F: 0.14%

§3.3 数据格式

QM9 以扩展 XYZ 格式存储,每个分子一个 .xyz 文件:

{原子数 N}
{性质 1} {性质 2} ... {性质 15} {tag}
{元素符号} {x(Å)} {y(Å)} {z(Å)} {Mulliken电荷}
...(重复 N 行)
{振动频率 1} {振动频率 2} ... {振动频率 3N-5 或 3N-6}
{SMILES_GDB} {SMILES_B3LYP} {InChI_Corina} {InChI_B3LYP}

第 2 行(注释行)的 15 个标量性质顺序

位置 属性 单位
1 tag(gdb 编号或标记)
2 μ(偶极矩) D
3 α(极化率) a₀³
4 ε_HOMO Ha
5 ε_LUMO Ha
6 Δε(HOMO-LUMO 能隙) Ha
7 ⟨R²⟩(电子空间范围) a₀²
8 ZPVE Ha
9 U₀(0K 内能) Ha
10 U(298K 内能) Ha
11 H(298K 焓) Ha
12 G(298K 自由能) Ha
13 Cv(298K 热容) cal/(mol·K)
14 标识符(gdb 编号)
15 未表征标记(0=正常, 1=未表征)

注意:PyTorch Geometric 和 DGL 框架在加载时会将 Ha 转换为 eV(1 Ha = 27.2114 eV),将 cal/(mol·K) 保持不变。DeepChem 额外计算原子化能(U₀_atom = U₀ - Σ reference energies)。

§3.4 分子性质详细说明

属性 符号 单位(原始) 单位(MoleculeNet) 典型值范围 物理含义
偶极矩 μ Debye Debye 0 – 8 D 分子极性
极化率 α a₀³ a₀³ 30 – 100 a₀³ 电子云响应
HOMO ε_HOMO Ha eV -0.30 to -0.15 Ha 电子给出能力
LUMO ε_LUMO Ha eV -0.10 to 0.05 Ha 电子接受能力
能隙 Δε Ha eV 0.05 – 0.30 Ha 化学稳定性
电子范围 ⟨R²⟩ a₀² a₀² 200 – 800 a₀² 电子分布广度
零点能 ZPVE Ha eV 0.10 – 0.60 Ha 振动零点能
0K 内能 U₀ Ha eV -100 to -40 Ha 总内能
298K 内能 U Ha eV U₀ + ~0.01 Ha 含热运动
298K 焓 H Ha eV U + RT 含 PV 功
298K 自由能 G Ha eV H - TS 热力学驱动力
热容 Cv cal/(mol·K) cal/(mol·K) 10 – 40 温度响应

§3.5 计算流程图

GDB-17 化学宇宙库 (166亿分子)
    │
    ├── 筛选:≤9 重原子 (C/N/O/F),中性分子
    │   └── 133,885 个分子 (GDB-9 子集)
    │
    ├── 3D 构建从 SMILES
    │   └── Corina 软件 → 初始 3D 几何
    │
    ├── PM7 半经验预优化
    │   └── 快速几何松弛
    │
    ├── B3LYP/6-31G(2df,p) DFT 优化
    │   ├── 几何优化至收敛
    │   ├── 性质计算(15 个标量)
    │   ├── Mulliken 电荷分析
    │   └── 谐振频率计算
    │       └── 3,054 个分子标记为"未表征"(几何重排)
    │
    ├── G4MP2 高精度计算(仅 C₇H₁₀O₂ 子集)
    │   └── 6,095 个同分异构体的原子化能
    │
    └── 输出
        ├── 133,885 个 .xyz 文件
        ├── SMILES(GDB + B3LYP 两种来源)
        └── InChI(Corina + B3LYP 两种来源)

§3.6 许可证

项目 详情
数据集许可证 CC0 1.0 Universal(公共领域)
商业使用 完全允许,无需许可或署名
衍生作品 允许,无需 ShareAlike
GDB-17 库 免费用于学术研究
DFT 计算软件 Gaussian 09(商业软件,但数据集输出不受软件许可证约束)
推荐引用 Ramakrishnan et al., Scientific Data 1, 140022 (2014) + Ruddigkeit et al., JCIM 52:2864 (2012)

§3.7 基金来源

资助机构 项目编号 说明
Swiss National Science Foundation (SNSF) 主要资助机构
Argonne National Laboratory 美国能源部国家实验室
Max-Planck-Institut für Kohlenforschung 德国马普学会

§3.8 深度溯源链

层级 来源 可追溯性
1. 化学空间枚举 GDB-17(Ruddigkeit et al., 2012) ✅ 完全可追溯(分子编号 gdb1-gdb133885)
2. SMILES 生成 GDB-17 枚举算法 ✅ 每分子保留 GDB SMILES
3. 3D 构建软件 Corina(商业软件,版本记录于论文) ✅ 论文方法部分记录
4. 预优化方法 PM7 半经验方法 ✅ 论文方法部分记录
5. DFT 软件 Gaussian 09(Revision D.01) ✅ 论文方法部分记录
6. 理论水平 B3LYP/6-31G(2df,p) ✅ 每分子 XYZ 文件含完整参数
7. 几何检查 SMILES_GDB vs SMILES_B3LYP 对比 ✅ 标记 3,054 个不一致分子
8. 高精度子集 G4MP2(仅 C₇H₁₀O₂) ✅ 论文表 2 记录
9. 数据发布 figshare DOI: 10.6084/m9.figshare.c.978904 ✅ 永久 DOI
10. 衍生修复 curatedQM9(Senthil et al., 2021) ✅ Chem. Sci. 12:5566

§4 数据结构详解

§4.0 目录树预览

qm9/
├── dsgdb9nsd_000001.xyz     # 分子 1(扩展 XYZ 格式)
├── dsgdb9nsd_000002.xyz     # 分子 2
├── ...
├── dsgdb9nsd_133885.xyz     # 分子 133,885
├── gdb9.sdf                  # SDF 格式(所有分子合并)
├── gdb9.sdf.csv              # 性质表(CSV 格式)
├── atomref.txt               # 原子参考能量(用于原子化能计算)
├── uncharacterized.txt       # 3,054 个未表征分子编号列表
├── readme.txt                # 数据格式说明
└── validation.txt            # 验证统计信息

§4.1 DAIMS 标准化数据字典

表 1:分子级标量性质(per-molecule scalar properties)

字段名 类型 单位 描述 缺失率
mu float Debye 偶极矩 0%
alpha float a₀³ 各向同性极化率 0%
homo float Ha / eV HOMO 能量 0%
lumo float Ha / eV LUMO 能量 0%
gap float Ha / eV HOMO-LUMO 能隙 0%
r2 float a₀² 电子空间范围 0%
zpve float Ha / eV 零点振动能 0%
U0 float Ha / eV 0K 内能 0%
U float Ha / eV 298.15K 内能 0%
H float Ha / eV 298.15K 焓 0%
G float Ha / eV 298.15K 自由能 0%
Cv float cal/(mol·K) 298.15K 定容热容 0%
A float GHz 转动常数 A 0%
B float GHz 转动常数 B 0%
C float GHz 转动常数 C 0%

表 2:原子级属性(per-atom properties)

字段名 类型 单位 描述
element string 元素符号(H/C/N/O/F)
x float Å 笛卡尔 x 坐标
y float Å 笛卡尔 y 坐标
z float Å 笛卡尔 z 坐标
mulliken_charge float e Mulliken 部分电荷

表 3:分子级标识符与元数据

字段名 类型 描述
index int GDB-9 分子编号(1-133,885)
tag string gdb 编号或标记
smiles_gdb string GDB-17 原始 SMILES
smiles_b3lyp string B3LYP 优化后几何的 SMILES
inchi_corina string Corina 几何的 InChI
inchi_b3lyp string B3LYP 优化几何的 InChI
frequencies list[float] 谐振振动频率(cm⁻¹),长度 3N-5 或 3N-6
uncharacterized bool 是否为未表征分子(SMILES_GDB ≠ SMILES_B3LYP)

§4.2 标签分布

性质 最小值 中位数 最大值 标准差 分布特征
μ (D) 0.00 2.34 8.47 1.52 右偏,含 0 值
α (a₀³) 28.5 59.8 103.2 11.3 近似正态
HOMO (eV) -10.5 -6.7 -2.4 0.63 近似正态
LUMO (eV) -3.2 0.6 4.1 0.78 近似正态
gap (eV) 1.2 6.8 12.5 0.93 近似正态
ZPVE (eV) 0.35 2.82 5.15 0.84 近似正态
U₀ (eV) -2720 -1280 -400 425 宽分布
Cv (cal/mol·K) 8.2 23.5 39.8 5.2 近似正态

关键观察

  • 能量类性质(U₀, U, H, G)与原子数强相关——模型容易学到"原子数→能量"的简单映射
  • 偶极矩 μ 含 0 值(对称分子),是最难预测的性质之一
  • HOMO-LUMO 能隙 Δε 需要同时准确预测 HOMO 和 LUMO,误差具有累积效应

§4.3 数据层级

QM9 数据集 (133,885 分子)
├── 表征分子 (130,831)
│   ├── 常规中性分子 (129,126)
│   ├── 两性离子 (1,705)
│   └── 含 F 分子 (~1,200)
├── 未表征分子 (3,054)
│   ├── 含 -NNO- 片段 (~52)
│   ├── 角锥 sp² C 应变分子 (~14)
│   └── 其他重排分子 (~2,988)
└── G4MP2 子集 (6,095)
    └── C₇H₁₀O₂ 同分异构体

§4.4 API

QM9 不提供 REST API——所有数据以文件形式下载。以下是主流框架的加载方式:

框架 加载代码 分子数 说明
PyTorch Geometric from torch_geometric.datasets import QM9; QM9(root=''''''''''''''''''''''''''''''''./qm9'''''''''''''''''''''''''''''''') 130,831 自动下载、解析 XYZ、单位转换
DGL from dgl.data import QM9Dataset; QM9Dataset(label_keys=[''''''''''''''''''''''''''''''''mu'''''''''''''''''''''''''''''''']) 130,831 12 个回归目标
DeepChem dc.molnet.load_qm9() 132,480 RDKit sanitization 后
TensorFlow Datasets tfds.load(''''''''''''''''''''''''''''''''qm9'''''''''''''''''''''''''''''''') 130,831 多种 split 配置
OGB (Open Graph Benchmark) from ogb.graphproppred import DatasetPropPred 130,831 scaffold split
直接下载 figshare URL → 解压 .tar → 解析 .xyz 133,885 原始格式

§4.5 缺失值

缺失类型 数量 处理方式
未表征分子 3,054 (2.3%) 从训练集中移除(标准做法)
DeepChem sanitization 失败 额外 ~2,351 仅影响 DeepChem 用户
振动频率缺失 极少(计算失败) 文件中标记为 0
G4MP2 能量 仅 C₇H₁₀O₂ 有(6,095/133,885 = 4.5%) 独立子集

§4.6 生态工具

工具 类型 QM9 支持 说明
PyTorch Geometric (PyG) GNN 框架 ✅ 原生 QM9 最流行的 3D GNN 实现
DGL GNN 框架 QM9Dataset / QM9EdgeDataset 含边特征版本
DeepChem ML 化学框架 dc.molnet.load_qm9 含 featurizer 选项
TensorFlow Datasets 数据加载 tfds.load(''''''''''''''''''''''''''''''''qm9'''''''''''''''''''''''''''''''') 多种 split 配置
OGB 基准套件 ✅ scaffold split 标准化评估
RDKit 化学信息学 ✅ SMILES/InChI 解析 分子操作
ASE (Atomic Simulation Environment) 原子模拟 ✅ XYZ 解析 与 DFT 软件互操作
SchNetPack 专有 GNN ✅ 原生支持 SchNet 作者维护
load-atoms 轻量加载器 load_dataset("QM9") 简洁 API
aqora 数据平台 ✅ v0.1.0 含 CSV 解析
JARVIS 材料科学 ✅ JARVIS-QM9-DGL NIST 维护
HuggingFace Datasets 数据集中心 n0w0f/qm9-csv CSV 格式
ModelScope 数据集中心 jablonkagroup/qm9 阿里达摩院

§5 数据划分与使用建议

§5.1 划分策略

策略 训练 验证 测试 来源 适用场景
MoleculeNet scaffold 110,000 10,000 11,000 Wu et al. 2018 标准基准(推荐)
DimeNet random 100,000 17,748 13,083 Klicpera et al. 2020 与 DimeNet 系列对比
Cormorant random 100,000 17,748 13,083 Anderson et al. 2019 与 Cormorant 对比
随机划分 任意 任意 任意 自定义 内部消融实验
OOD scaffold OGB 分布外泛化评估

关键决策:MoleculeNet scaffold split 按分子骨架聚类,确保训练集和测试集的分子骨架不重叠——这是评估模型泛化能力的更严格方式。DimeNet random split 使用固定种子(seed=0)打乱后划分,与 scaffold split 相比测试性能通常更高。

§5.2 基准配置

配置 描述 目标性质 评估指标 推荐用途
全 12 目标 同时训练 12 个回归目标 μ, α, HOMO, LUMO, gap, R², ZPVE, U₀, U, H, G, Cv MAE (各性质独立) GNN 架构对比
单目标 每次只预测一个性质 任选 1 个 MAE / RMSE 超参搜索
偶极矩专项 向量预测(等变模型) μ MAE (D) 等变 GNN 评估
能量专项 高精度能量预测 U₀ MAE (meV) 力场开发
G4MP2 映射 B3LYP → G4MP2 能量映射 C₇H₁₀O₂ 子集 MAE (kcal/mol) Δ-ML 学习

§5.3 使用建议

场景 建议 原因
GNN 论文 MoleculeNet scaffold split + 12 目标 MAE 文献标准,可对比
快速原型 PyG QM9 类 + 随机划分 开箱即用
等变模型研究 偶极矩 μ + 向量预测 需要等变性才能表现好
能量模型研究 U₀ + 高精度 MAE (meV) 能量是 GNN 最核心应用
分子生成评估 QM9 作为参考分布 评估生成多样性/新颖性
迁移学习 QM9 预训练 → 下游药物数据 3D 结构预训练

§6 AI 就绪指南

§6.0 云端快速启动

Google Colab 一键启动

# PyTorch Geometric 加载 QM9
!pip install torch-geometric

from torch_geometric.datasets import QM9
from torch_geometric.loader import DataLoader

dataset = QM9(root=''''''''''''''''''''''''''''''''/tmp/QM9'''''''''''''''''''''''''''''''')
print(f"分子数: {len(dataset)}")  # 130,831
print(f"性质数: {dataset[0].y.shape}")  # [19] (含原子化能+转动常数)

# 标准划分
from torch_geometric.datasets import QM9
train_dataset = dataset[:110000]
val_dataset = dataset[110000:120000]
test_dataset = dataset[120000:130831]

train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)

§6.1 快速上手代码

import torch
import torch.nn as nn
from torch_geometric.nn import SchNet
from torch_geometric.datasets import QM9
from torch_geometric.loader import DataLoader

# 加载数据集
dataset = QM9(root=''''''''''''''''''''''''''''''''./qm9'''''''''''''''''''''''''''''''')

# 标准划分(MoleculeNet scaffold split 近似)
n_total = len(dataset)  # 130,831
n_train, n_val = 110000, 10000
train_dataset = dataset[:n_train]
val_dataset = dataset[n_train:n_train + n_val]
test_dataset = dataset[n_train + n_val:]

train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=256, shuffle=False)
test_loader = DataLoader(test_dataset, batch_size=256, shuffle=False)

# 初始化 SchNet 模型
device = torch.device(''''''''''''''''''''''''''''''''cuda'''''''''''''''''''''''''''''''' if torch.cuda.is_available() else ''''''''''''''''''''''''''''''''cpu'''''''''''''''''''''''''''''''')
model = SchNet(
    hidden_channels=128,
    num_filters=128,
    num_interactionevent-blocked=6,
    num_gaussians=50,
    cutoff=10.0,
).to(device)

# 优化器
optimizer = torch.optim.Adam(model.parameters(), lr=5e-4)
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
    optimizer, mode=''''''''''''''''''''''''''''''''min'''''''''''''''''''''''''''''''', factor=0.5, patience=10
)

# 训练循环(以 U0 为目标,target index = 7)
target_idx = 7  # U0 在 PyG QM9 中的索引
best_val_mae = float(''''''''''''''''''''''''''''''''inf'''''''''''''''''''''''''''''''')

for epoch in range(300):
    model.train()
    total_loss = 0
    for batch in train_loader:
        batch = batch.to(device)
        optimizer.zero_grad()
        pred = model(batch.z, batch.pos, batch.batch)
        loss = torch.nn.functional.l1_loss(pred[:, target_idx], batch.y[:, target_idx])
        loss.backward()
        optimizer.step()
        total_loss += loss.item() * batch.num_graphs

    # 验证
    model.eval()
    val_mae = 0
    with torch.no_grad():
        for batch in val_loader:
            batch = batch.to(device)
            pred = model(batch.z, batch.pos, batch.batch)
            val_mae += torch.nn.functional.l1_loss(
                pred[:, target_idx], batch.y[:, target_idx]
            ).item() * batch.num_graphs

    val_mae /= len(val_dataset)
    scheduler.step(val_mae)

    if val_mae < best_val_mae:
        best_val_mae = val_mae
        torch.save(model.state_dict(), ''''''''''''''''''''''''''''''''best_model.pt'''''''''''''''''''''''''''''''')

    if epoch % 10 == 0:
        print(f''''''''''''''''''''''''''''''''Epoch {epoch}: train_loss={total_loss/len(train_dataset):.6f}, ''''''''''''''''''''''''''''''''
              f''''''''''''''''''''''''''''''''val_mae={val_mae:.6f} eV'''''''''''''''''''''''''''''''')

# 测试
model.load_state_dict(torch.load(''''''''''''''''''''''''''''''''best_model.pt''''''''''''''''''''''''''''''''))
model.eval()
test_mae = 0
with torch.no_grad():
    for batch in test_loader:
        batch = batch.to(device)
        pred = model(batch.z, batch.pos, batch.batch)
        test_mae += torch.nn.functional.l1_loss(
            pred[:, target_idx], batch.y[:, target_idx]
        ).item() * batch.num_graphs

print(f''''''''''''''''''''''''''''''''Test MAE (U0): {test_mae/len(test_dataset)*1000:.2f} meV'''''''''''''''''''''''''''''''')
# 预期: ~14 meV (SchNet) / ~6 meV (DimeNet++) / ~4 meV (ViSNet)

§6.2 数据获取

import os
import urllib.request
import tarfile

def download_qm9(data_dir: str = ''''''''''''''''''''''''''''''''./qm9_raw''''''''''''''''''''''''''''''''):
    """从 figshare 下载 QM9 原始数据"""
    os.makedirs(data_dir, exist_ok=True)
    url = ''''''''''''''''''''''''''''''''https://springernature.figshare.com/ndownloader/files/3195389''''''''''''''''''''''''''''''''
    tar_path = os.path.join(data_dir, ''''''''''''''''''''''''''''''''qm9.tar'''''''''''''''''''''''''''''''')
    if not os.path.exists(tar_path):
        print(''''''''''''''''''''''''''''''''Downloading QM9 from figshare (~82 MB)...'''''''''''''''''''''''''''''''')
        urllib.request.urlretrieve(url, tar_path)
    with tarfile.open(tar_path) as tar:
        tar.extractall(data_dir)
    print(f''''''''''''''''''''''''''''''''Downloaded {len(os.listdir(data_dir))} files to {data_dir}'''''''''''''''''''''''''''''''')

def parse_qm9_xyz(filepath: str) -> dict:
    """解析单个 QM9 扩展 XYZ 文件"""
    with open(filepath) as f:
        n_atoms = int(f.readline())
        props = f.readline().split()
        atoms = []
        for _ in range(n_atoms):
            parts = f.readline().split()
            atoms.append({
                ''''''''''''''''''''''''''''''''element'''''''''''''''''''''''''''''''': parts[0],
                ''''''''''''''''''''''''''''''''x'''''''''''''''''''''''''''''''': float(parts[1]),
                ''''''''''''''''''''''''''''''''y'''''''''''''''''''''''''''''''': float(parts[2]),
                ''''''''''''''''''''''''''''''''z'''''''''''''''''''''''''''''''': float(parts[3]),
                ''''''''''''''''''''''''''''''''charge'''''''''''''''''''''''''''''''': float(parts[4])
            })
        freq_line = f.readline().split()
        frequencies = [float(x) for x in freq_line]
        smiles_line = f.readline().split()
        inchi_line = f.readline().split()

    properties = {
        ''''''''''''''''''''''''''''''''tag'''''''''''''''''''''''''''''''': props[0],
        ''''''''''''''''''''''''''''''''mu'''''''''''''''''''''''''''''''': float(props[1]),           # Debye
        ''''''''''''''''''''''''''''''''alpha'''''''''''''''''''''''''''''''': float(props[2]),       # Bohr^3
        ''''''''''''''''''''''''''''''''homo'''''''''''''''''''''''''''''''': float(props[3]),        # Hartree
        ''''''''''''''''''''''''''''''''lumo'''''''''''''''''''''''''''''''': float(props[4]),        # Hartree
        ''''''''''''''''''''''''''''''''gap'''''''''''''''''''''''''''''''': float(props[5]),         # Hartree
        ''''''''''''''''''''''''''''''''r2'''''''''''''''''''''''''''''''': float(props[6]),           # Bohr^2
        ''''''''''''''''''''''''''''''''zpve'''''''''''''''''''''''''''''''': float(props[7]),        # Hartree
        ''''''''''''''''''''''''''''''''u0'''''''''''''''''''''''''''''''': float(props[8]),          # Hartree
        ''''''''''''''''''''''''''''''''u298'''''''''''''''''''''''''''''''': float(props[9]),        # Hartree
        ''''''''''''''''''''''''''''''''h298'''''''''''''''''''''''''''''''': float(props[10]),       # Hartree
        ''''''''''''''''''''''''''''''''g298'''''''''''''''''''''''''''''''': float(props[11]),       # Hartree
        ''''''''''''''''''''''''''''''''cv'''''''''''''''''''''''''''''''': float(props[12]),         # cal/(mol*K)
        ''''''''''''''''''''''''''''''''index'''''''''''''''''''''''''''''''': int(props[13]),
        ''''''''''''''''''''''''''''''''uncharacterized'''''''''''''''''''''''''''''''': int(props[14]) == 1
    }

    return {
        ''''''''''''''''''''''''''''''''n_atoms'''''''''''''''''''''''''''''''': n_atoms,
        ''''''''''''''''''''''''''''''''atoms'''''''''''''''''''''''''''''''': atoms,
        ''''''''''''''''''''''''''''''''frequencies'''''''''''''''''''''''''''''''': frequencies,
        ''''''''''''''''''''''''''''''''smiles_gdb'''''''''''''''''''''''''''''''': smiles_line[0] if smiles_line else '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''',
        ''''''''''''''''''''''''''''''''smiles_b3lyp'''''''''''''''''''''''''''''''': smiles_line[1] if len(smiles_line) > 1 else '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''',
        ''''''''''''''''''''''''''''''''inchi_corina'''''''''''''''''''''''''''''''': inchi_line[0] if inchi_line else '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''',
        ''''''''''''''''''''''''''''''''inchi_b3lyp'''''''''''''''''''''''''''''''': inchi_line[1] if len(inchi_line) > 1 else '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''',
        ''''''''''''''''''''''''''''''''properties'''''''''''''''''''''''''''''''': properties
    }

def hartree_to_ev(hartree: float) -> float:
    """Hartree 转 eV"""
    return hartree * 27.211386245988

§6.3 预处理管道

import numpy as np
import torch
from torch_geometric.data import Data

ATOMIC_NUMBERS = {''''''''''''''''''''''''''''''''H'''''''''''''''''''''''''''''''': 1, ''''''''''''''''''''''''''''''''C'''''''''''''''''''''''''''''''': 6, ''''''''''''''''''''''''''''''''N'''''''''''''''''''''''''''''''': 7, ''''''''''''''''''''''''''''''''O'''''''''''''''''''''''''''''''': 8, ''''''''''''''''''''''''''''''''F'''''''''''''''''''''''''''''''': 9}

def qm9_to_pyg_data(filepath: str) -> Data:
    """将 QM9 XYZ 文件转换为 PyTorch Geometric Data 对象"""
    mol = parse_qm9_xyz(filepath)
    props = mol[''''''''''''''''''''''''''''''''properties'''''''''''''''''''''''''''''''']

    # 原子特征
    z = torch.tensor(
        [ATOMIC_NUMBERS[a[''''''''''''''''''''''''''''''''element'''''''''''''''''''''''''''''''']] for a in mol[''''''''''''''''''''''''''''''''atoms'''''''''''''''''''''''''''''''']],
        dtype=torch.long
    )
    pos = torch.tensor(
        [[a[''''''''''''''''''''''''''''''''x''''''''''''''''''''''''''''''''], a[''''''''''''''''''''''''''''''''y''''''''''''''''''''''''''''''''], a[''''''''''''''''''''''''''''''''z'''''''''''''''''''''''''''''''']] for a in mol[''''''''''''''''''''''''''''''''atoms'''''''''''''''''''''''''''''''']],
        dtype=torch.float
    )

    # 标量性质(12 个 MoleculeNet 目标,转换为 eV)
    y = torch.tensor([
        props[''''''''''''''''''''''''''''''''mu''''''''''''''''''''''''''''''''],                          # Debye
        props[''''''''''''''''''''''''''''''''alpha''''''''''''''''''''''''''''''''],                       # Bohr^3
        hartree_to_ev(props[''''''''''''''''''''''''''''''''homo'''''''''''''''''''''''''''''''']),         # eV
        hartree_to_ev(props[''''''''''''''''''''''''''''''''lumo'''''''''''''''''''''''''''''''']),         # eV
        hartree_to_ev(props[''''''''''''''''''''''''''''''''gap'''''''''''''''''''''''''''''''']),          # eV
        props[''''''''''''''''''''''''''''''''r2''''''''''''''''''''''''''''''''],                          # Bohr^2
        hartree_to_ev(props[''''''''''''''''''''''''''''''''zpve'''''''''''''''''''''''''''''''']),         # eV
        hartree_to_ev(props[''''''''''''''''''''''''''''''''u0'''''''''''''''''''''''''''''''']),           # eV
        hartree_to_ev(props[''''''''''''''''''''''''''''''''u298'''''''''''''''''''''''''''''''']),         # eV
        hartree_to_ev(props[''''''''''''''''''''''''''''''''h298'''''''''''''''''''''''''''''''']),         # eV
        hartree_to_ev(props[''''''''''''''''''''''''''''''''g298'''''''''''''''''''''''''''''''']),         # eV
        props[''''''''''''''''''''''''''''''''cv''''''''''''''''''''''''''''''''],                          # cal/(mol*K)
    ], dtype=torch.float)

    # Mulliken 电荷
    charges = torch.tensor(
        [a[''''''''''''''''''''''''''''''''charge''''''''''''''''''''''''''''''''] for a in mol[''''''''''''''''''''''''''''''''atoms'''''''''''''''''''''''''''''''']],
        dtype=torch.float
    )

    return Data(z=z, pos=pos, y=y.unsqueeze(0), charges=charges)

def filter_uncharacterized(dataset_dir: str) -> list:
    """过滤未表征分子"""
    uncharacterized = set()
    with open(os.path.join(dataset_dir, ''''''''''''''''''''''''''''''''uncharacterized.txt'''''''''''''''''''''''''''''''')) as f:
        for line in f:
            idx = int(line.strip())
            uncharacterized.add(idx)

    all_files = sorted([
        f for f in os.listdir(dataset_dir)
        if f.startswith(''''''''''''''''''''''''''''''''dsgdb9nsd_'''''''''''''''''''''''''''''''') and f.endswith(''''''''''''''''''''''''''''''''.xyz'''''''''''''''''''''''''''''''')
    ])

    return [
        f for f in all_files
        if int(f.replace(''''''''''''''''''''''''''''''''dsgdb9nsd_'''''''''''''''''''''''''''''''', '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''').replace(''''''''''''''''''''''''''''''''.xyz'''''''''''''''''''''''''''''''', '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''')) not in uncharacterized
    ]

§6.4 PyTorch DataLoader

from torch.utils.data import Dataset, DataLoader as TorchLoader
import os

class QM9CustomDataset(Dataset):
    """自定义 QM9 数据集(不依赖 PyG/DGL)"""
    def __init__(self, file_list: list, data_dir: str):
        self.file_list = file_list
        self.data_dir = data_dir

    def __len__(self):
        return len(self.file_list)

    def __getitem__(self, idx):
        filepath = os.path.join(self.data_dir, self.file_list[idx])
        data = qm9_to_pyg_data(filepath)
        return data

def collate_qm9(batch):
    """自定义 collate 函数(处理变长原子数)"""
    z_list = [b[''''''''''''''''''''''''''''''''z''''''''''''''''''''''''''''''''] for b in batch]
    pos_list = [b[''''''''''''''''''''''''''''''''pos''''''''''''''''''''''''''''''''] for b in batch]
    y_list = [b[''''''''''''''''''''''''''''''''y''''''''''''''''''''''''''''''''] for b in batch]

    # 拼接
    z = torch.cat(z_list, dim=0)
    pos = torch.cat(pos_list, dim=0)
    y = torch.cat(y_list, dim=0)

    # batch 索引
    batch = torch.repeat_interleave(
        torch.arange(len(batch)),
        torch.tensor([len(z) for z in z_list])
    )

    return {''''''''''''''''''''''''''''''''z'''''''''''''''''''''''''''''''': z, ''''''''''''''''''''''''''''''''pos'''''''''''''''''''''''''''''''': pos, ''''''''''''''''''''''''''''''''batch'''''''''''''''''''''''''''''''': batch, ''''''''''''''''''''''''''''''''y'''''''''''''''''''''''''''''''': y}

# 使用
valid_files = filter_uncharacterized(''''''''''''''''''''''''''''''''./qm9_raw'''''''''''''''''''''''''''''''')
train_files = valid_files[:110000]
val_files = valid_files[110000:120000]
test_files = valid_files[120000:130831]

train_ds = QM9CustomDataset(train_files, ''''''''''''''''''''''''''''''''./qm9_raw'''''''''''''''''''''''''''''''')
train_loader = TorchLoader(
    train_ds, batch_size=128, shuffle=True,
    collate_fn=collate_qm9, num_workers=4
)

§6.5 坑点

# 坑点 严重度 影响范围 解决方案
1 3,054 未表征分子 🔴 高 所有人 使用 uncharacterized.txt 过滤,或直接用 PyG/DGL(自动过滤)
2 单位混淆 🔴 高 从原始 XYZ 加载 原始文件用 Hartree,MoleculeNet/PyG 转 eV。务必确认单位:1 Ha = 27.2114 eV
3 划分不一致 🟡 中 跨论文对比 必须使用相同 split(MoleculeNet scaffold vs DimeNet random)
4 DeepChem 额外过滤 🟡 中 DeepChem 用户 DeepChem sanitization 移除额外 ~2,351 分子(132,480 vs 130,831),结果不可直接与 PyG 对比
5 B3LYP 自相互作用误差 🟡 中 精度要求高的研究 B3LYP 对电荷转移态有系统性误差,高精度场景考虑 G4MP2 子集或 Δ-ML
6 化学空间极窄 🟡 中 泛化性评估 仅 ≤9 重原子、C/H/N/O/F——模型在 QM9 上表现好不意味着在大分子上泛化
7 偶极矩需等变性 🟡 中 偶极矩预测 标量预测 μ 的 MAE 远高于等变向量预测——使用 PaiNN/EGNN/ViSNet 等等变模型
8 能量与原子数强相关 🟢 低 能量预测 模型容易学到"原子数→能量"的简单映射——报告原子化能 MAE 更有意义

§6.6 模型推荐

模型 年份 类型 U₀ MAE (meV) μ MAE (mD) 特点 推荐场景
ViSNet 2024 等变 GNN 4.23 9.5 当前 SOTA 最高精度
ET 2023 等变 Transformer 6.15 11.0 几何 Transformer 等变研究
PAMNet 2023 等变 GNN 5.90 10.8 向量-标量交互 等变研究
PaiNN 2021 等变 GNN 5.85 12.0 轻量高效 平衡精度/速度
SphereNet 2022 3D 球面 GNN 6.26 24.5 球面基函数 几何建模
DimeNet++ 2020 方向 GNN 6.32 29.7 速度提升 8× 速度/精度平衡
EGNN 2021 等变 GNN 6.04 29.0 E(n) 等变 理论研究
SchNet 2017 不变 GNN 14.0 33.0 经典基线 入门/快速原型

§6.7 硬件配置

配置 GPU 训练时间(300 epochs) 显存 适用模型
入门级 1× RTX 3090 (24GB) ~12 小时 <8 GB SchNet, DimeNet++
标准级 1× A100 (40GB) ~6 小时 <16 GB PaiNN, EGNN, SphereNet
高性能 1× A100 (80GB) ~4 小时 <24 GB ET, PAMNet, ViSNet
多卡 4× A100 (40GB) ~1.5 小时 <16 GB/卡 ViSNet + 大 batch

§6.8 评估指标

指标 公式 适用性质 典型范围 说明
MAE `mean( y_pred - y_true )` 全部 12 个
RMSE sqrt(mean((y_pred - y_true)²)) 全部 6–80 meV 对异常值敏感
% std. MAE MAE / std(y) 跨性质比较 0.83–1.89 归一化便于跨性质对比
logMAE log10(MAE) 跨数量级比较 -5.3 ~ -4.5 覆盖不同数量级
1 - SS_res/SS_tot 拟合质量 0.95–0.999 回归拟合度

关键说明:QM9 文献中 MAE 是标准评估指标。注意单位——能量类性质用 meV(毫电子伏特),偶极矩用 mD(毫德拜),极化率用 a₀³(玻尔半径立方)。不同论文可能使用 Ha 或 eV,务必确认。

§7 质量评估与局限性

§7.1 偏倚

# 偏倚类型 描述 影响 缓解措施
1 化学空间偏倚 仅含 ≤9 重原子的 C/H/N/O/F 分子,是 GDB-17 的极小子集 模型在大分子或含 S/P/Cl/Br 的分子上可能失效 迁移到 QM7b(更大原子范围)或 ANI-1x
2 中性分子偏倚 排除了阳离子和阴离子(仅保留 1,705 两性离子) 不适用于离子态分子性质预测 使用带电荷的数据集
3 DFT 方法偏倚 B3LYP 有已知自相互作用误差,6-31G(2df,p) 基组有限 色散相互作用、电荷转移态、自由基的系统误差 使用 G4MP2 子集校正,或用 Δ-ML
4 Mulliken 电荷偏倚 Mulliken 布居分析对基组选择高度敏感 与 NPA/CHELPG 电荷不一致 使用更稳健的电荷分析方法
5 单构象偏倚 每分子仅一个平衡几何(无构象采样) 无法评估构象依赖性 使用 GEOM(多构象)或 MD17(构象轨迹)
6 枚举偏倚 GDB 枚举算法可能遗漏某些合成可及的分子 不完全代表"真实"化学空间 与 ChEMBL/PubChem 交叉验证

§7.2 标注质量

维度 评估 说明
计算精度 ⭐⭐⭐⭐⭐ B3LYP/6-31G(2df,p) 是标准 DFT 水平,几何优化收敛阈值严格
一致性 ⭐⭐⭐⭐⭐ 全部 133,885 分子使用完全相同的理论水平和软件
可复现性 ⭐⭐⭐⭐⭐ Gaussian 09 + B3LYP/6-31G(2df,p) 参数完全公开,可独立复现
标识符完整性 ⭐⭐⭐⭐ SMILES 和 InChI 各有 2 种来源(GDB/B3LYP 和 Corina/B3LYP)
异常值标记 ⭐⭐⭐⭐⭐ 3,054 个未表征分子有明确标记和编号列表
元数据完整性 ⭐⭐⭐⭐ 分子编号、几何检查标记完整,但缺少计算时间/资源信息
外部验证 ⭐⭐⭐⭐ G4MP2 子集提供了更高精度的交叉验证

§7.3 泛化性

场景 泛化性评估 说明
更大分子 ⚠️ 有限 模型从 ≤9 重原子迁移到 10-17 原子时 MAE 显著增加
不同元素 ❌ 差 QM9 仅含 C/H/N/O/F——无法直接用于含 S/P/Cl/Br 的分子
带电分子 ❌ 差 排除了阳离子和阴离子
非平衡构象 ⚠️ 有限 QM9 仅含平衡几何——迁移到 MD17(非平衡)时精度下降
不同 DFT 水平 ⚠️ 有限 B3LYP → PBE/CCSD(T) 需要迁移学习或 Δ-ML
晶体/周期系统 ❌ 不适用 QM9 仅含孤立分子

§7.4 伦理

维度 评估
患者隐私 ✅ 不适用(纯计算数据,无人类/动物数据)
双重用途 ⚠️ 低风险——分子性质预测可用于药物设计,但也可用于有害物质设计
偏见与公平性 ✅ 不适用(非人类数据)
环境足迹 ⚠️ 133,885 次 DFT 计算消耗大量计算资源——后续 ML 模型可减少 DFT 调用
数据治理 ✅ CC0 许可,完全公共领域

§7.5 DAIMS 24 项数据就绪度评估

# 评估项 状态 说明
1 数据集标识符 DOI: 10.1038/sdata.2014.22 + figshare DOI
2 数据集版本 原始版(133,885)+ curatedQM9(133,660)
3 数据集描述 Nature Scientific Data 详细描述
4 数据采集方法 DFT B3LYP/6-31G(2df,p) + Gaussian 09
5 数据格式 扩展 XYZ,通用化学格式
6 数据大小 ~82 MB 压缩,133,885 个文件
7 数据质量评估 3,054 未表征分子有标记
8 缺失值处理 uncharacterized.txt 明确列出
9 标签定义 15 个性质有明确物理含义和单位
10 标签分布 论文 Fig.1 有分布统计
11 训练/验证/测试划分 MoleculeNet scaffold split 标准
12 评估指标 MAE 是标准指标
13 基线性能 SchNet → ViSNet 有完整 SOTA 链
14 许可证 CC0 1.0,最宽松许可
15 使用限制 无任何限制
16 隐私保护 不适用(无人类数据)
17 偏倚声明 论文讨论了化学空间局限性
18 数据来源 GDB-17 完全可追溯
19 数据更新频率 ⚠️ 一次性发布(2014),无后续更新
20 数据引用 明确 BibTeX 引用格式
21 数据可访问性 figshare 公开免费下载
22 元数据标准 Scientific Data ISA-Tab 格式
23 机器可读性 XYZ + SMILES + InChI 全格式覆盖
24 FAIR 原则 Findable/Accessible/Interoperable/Reusable 全部满足

DAIMS 评分:21/24 ⭐⭐⭐⭐⭐(扣除项:#19 数据无更新、#14 扣除——实际全部满足——最终 21/24 = 87.5%)

评估总结:QM9 是 AI-Ready 程度最高的量子化学数据集之一。CC0 许可、完整 DFT 元数据、明确异常值标记、标准化框架支持(PyG/DGL/DeepChem/TFDS/OGB)以及 2,000+ 论文引用使其成为机器学习模型的理想训练和评估数据集。主要局限是化学空间覆盖范围窄(仅 ≤9 重原子、C/H/N/O/F)和一次性发布(无后续更新)。

§7.6 外部验证矩阵

验证集 分子数 理论水平 与 QM9 的关系 验证目标
QM7b 7,211 DFT-GGA 更大原子范围(含 S/Cl) 元素泛化性
MD17 7–10 CCSD(T)/DFT 非平衡构象 构象泛化性
ANI-1x 5M ωB97X/6-31G(d) 更大分子 + 主动学习 规模泛化性
GEOM 139K 半经验 多构象采样 构象多样性
OC20 130M DFT 催化剂表面(周期系统) 周期系统迁移
GEOM-DRUGS 390K MMFF94 药物分子(大分子) 药物分子迁移
GDB-17 (大子集) ~1M 更大分子(10-17 重原子) 分子大小迁移

§8 基准性能与生态

§8.1 QM9 排行榜

QM9 MAE 基准——12 个回归目标(MoleculeNet 版本,去除未表征分子)

模型 年份 μ (mD) α (a₀³) HOMO (meV) LUMO (meV) gap (meV) R² (a₀²) ZPVE (meV) U₀ (meV) U (meV) H (meV) G (meV) Cv (cal/mol·K)
ViSNet 2024 9.5 41.1 17.3 14.8 31.7 29.8 1.56 4.23 4.25 4.52 5.86 0.023
ET 2023 11.0 59.0 20.3 17.5 36.1 33.0 1.84 6.15 6.38 6.16 7.62 0.026
PAMNet 2023 10.8 44.7 22.8 19.2 31.0 93.0 1.17 5.90 5.92 6.04 7.14 0.023
PaxNet 2023 10.8 44.7 22.8 19.2 31.0 93.0 1.17 5.90 5.92 6.04 7.14 0.023
PaiNN 2021 12.0 45.0 27.6 20.4 45.7 66.0 1.28 5.85 5.83 5.98 7.35 0.024
SphereNet 2022 24.5 44.9 22.8 18.9 31.1 268.0 1.12 6.26 6.36 6.33 7.78 0.022
DimeNet++ 2020 29.7 43.5 24.6 19.5 32.6 331.0 1.21 6.32 6.28 6.53 7.56 0.023
EGNN 2021 29.0 71.0 29.0 25.0 48.0 106.0 1.55 11.0 12.0 12.0 12.0 0.031
SchNet 2017 33.0 235.0 41.0 34.0 63.0 73.0 1.70 14.0 19.0 14.0 14.0 0.033
Cormorant 2019 38.0 85.0 34.0 38.0 61.0 765.0 1.39 8.15 8.34 8.42 9.40 0.028
MGCN 2020 56.0 30.0 42.1 57.4 64.2 110.0 1.12 12.9 14.4 14.6 16.2 0.038

注意:不同模型可能使用不同的数据划分(scaffold vs random),MAE 结果不应直接跨论文对比。建议使用统一划分(如 OGB scaffold split)进行公平评估。

§8.2 关键论文

论文 年份 引用数 核心贡献
Ramakrishnan et al. 2014 3,200+ QM9 数据集创建
Ruddigkeit et al. 2012 800+ GDB-17 化学宇宙库枚举
Wu et al. (MoleculeNet) 2018 4,425+ 标准化分子 ML 基准
Schütt et al. (SchNet) 2017 2,500+ 连续滤波卷积 GNN
Klicpera et al. (DimeNet) 2020 1,800+ 方向消息传递
Satorras et al. (EGNN) 2021 2,000+ E(n) 等变 GNN
Schütt et al. (PaiNN) 2021 1,200+ 等变标量-向量交互
Senthil et al. (curatedQM9) 2021 50+ 未表征分子修复

§8.3 使用统计

平台 下载量 说明
figshare 100,000+ 原始数据下载
Kaggle ~3,000 Kaggle 数据集页面
ModelScope 677 阿里达摩院平台
aqora 30 量子计算平台
Google Scholar 引用 3,200+ 原始论文引用
数据集 关系 分子数 说明
GDB-17 母库 166B 化学宇宙库,QM9 是其子集
QM7b 兄弟数据集 7,211 更大原子范围(含 S/Cl),14 个性质
MD17 互补 7–10 非平衡构象(力场学习)
ANI-1 / ANI-1x 扩展 20M / 5M 超大规模构象采样
GEOM 互补 139K 多构象分子
OC20 扩展 130M 催化剂表面(周期系统)
Tox21 互补 7,831 毒性分类(实验/HTS)
ChEMBL 互补 2.3M 生物活性(实验)

§8.5 生态快照

                    GDB-17 化学宇宙库
                    (166 亿分子枚举)
                         │
                    GDB-9 子集
                    (≤9 重原子)
                         │
               ┌─────────┴─────────┐
               │                   │
            QM9 原始版          curatedQM9
          (133,885 分子)      (133,660 分子)
               │
    ┌──────────┼──────────┐
    │          │          │
  PyG        DGL      DeepChem
 (130,831)  (130,831) (132,480)
    │
  MoleculeNet
  (12 目标回归)
    │
  ┌───┬───┬───┬───┬───┐
  │   │   │   │   │   │
Sch  Dim Pai EGG Gem Vis
Net  ++  NN  N   Net Net
 ↓   ↓   ↓   ↓   ↓   ↓
14  6.3 5.9 6.0 5.0 4.2 meV (U₀ MAE)

§9 相关资源与引用

§9.1 官方资源

资源 URL
原始论文 https://www.nature.com/articles/sdata201422
figshare 数据 https://doi.org/10.6084/m9.figshare.c.978904
GDB-17 论文 https://doi.org/10.1021/ci300415d
curatedQM9 https://moldis-group.github.io/curatedQM9
MoleculeNet https://moleculenet.org
PyG QM9 文档 https://pytorch-geometric.readthedocs.io/en/stable/_modules/torch_geometric/datasets/qm9.html
DGL QM9 https://www.dgl.ai/dgl_docs/_modules/dgl/data/qm9.html
TFDS QM9 https://www.tensorflow.org/datasets/catalog/qm9
DeepChem QM9 GitHub 源码
OGB https://ogb.stanford.edu
load-atoms https://jla-gardner.github.io/load-atoms/datasets/QM9.html
aqora QM9 https://aqora.io/datasets/aqora/quantum-machine-9
HuggingFace CSV https://huggingface.co/datasets/n0w0f/qm9-csv
ModelScope https://modelscope.cn/datasets/jablonkagroup/qm9
Zenodo modelforge https://zenodo.org/records/17536526

§9.2 BibTeX

@article{ramakrishnan2014quantum,
  title={Quantum chemistry structures and properties of 134 kilo molecules},
  author={Ramakrishnan, Raghunathan and Dral, Pavlo O and Rupp, Matthias and von Lilienfeld, O Anatole},
  journal={Scientific Data},
  volume={1},
  number={1},
  pages={140022},
  year={2014},
  publisher={Nature Publishing Group},
  doi={10.1038/sdata.2014.22}
}

@article{ruddigkeit2012enumeration,
  title={Enumeration of 166 billion organic small molecules in the chemical universe database GDB-17},
  author={Ruddigkeit, Lars and van Deursen, Ruud and Blum, Lorenz C and Reymond, Jean-Louis},
  journal={Journal of Chemical Information and Modeling},
  volume={52},
  number={11},
  pages={28642875},
  year={2012},
  publisher={ACS Publications},
  doi={10.1021/ci300415d}
}

@article{wu2018moleculenet,
  title={MoleculeNet: a benchmark for molecular machine learning},
  author={Wu, Zhenqin and Ramsundar, Bharath and Feinberg, Evan N and Gomes, Joseph and Geniesse, Caleb and Pappu, Ajay S and Leswing, Karl and Pande, Vijay},
  journal={Chemical Science},
  volume={9},
  number={2},
  pages={513530},
  year={2018},
  publisher={Royal Society of Chemistry},
  doi={10.1039/c7sc02664a}
}

@article{senthil2021troubleshooting,
  title={Troubleshooting unstable molecules in chemical space},
  author={Senthil, Salini and Chakraborty, Sabyasachi and Ramakrishnan, Raghunathan},
  journal={Chemical Science},
  volume={12},
  pages={55665573},
  year={2021},
  publisher={Royal Society of Chemistry},
  doi={10.1039/d0sc05591c}
}

§9.3 团队

成员 当前机构 角色 ORCID
Raghunathan Ramakrishnan Tata Institute of Fundamental Research, Hyderabad 第一作者/数据集创建者 0000-0003-0818-5779
Pavlo O. Dral Zhejiang University 合作者/DFT 计算 0000-0001-7682-8438
Matthias Rupp University of Luxembourg 合作者/ML 方法 0000-0002-2934-2958
O. Anatole von Lilienfeld University of Vienna 通讯作者/PI 0000-0002-8944-518X

原始机构(2014 年发表时):

  • University of Basel, Switzerland

  • Max-Planck-Institut für Kohlenforschung, Mülheim an der Ruhr, Germany

  • University of Erlangen-Nuremberg, Germany

  • Argonne National Laboratory, USA

§10 AI 使用声明卡

§10.1 标识

字段
数据集名称 QM9 (Quantum Machine 9)
数据集 ID qm9/105
版本 原始版(2014-08-05)
DOI 10.1038/sdata.2014.22 / 10.6084/m9.figshare.c.978904
数据来源 GDB-17 → GDB-9 子集 → DFT B3LYP/6-31G(2df,p)
页面状态 published

§10.2 许可证摘要

维度 详情
许可证 CC0 1.0 Universal(公共领域)
商业使用 ✅ 完全允许
署名要求 无(但推荐引用原始论文)
衍生作品 ✅ 允许,无 ShareAlike 要求
数据下载 ✅ 免费公开
GDB-17 库 免费用于学术研究
步骤 操作 工具/命令
1 安装 PyTorch Geometric pip install torch-geometric
2 加载数据集 dataset = QM9(root=''''''''''''''''''''''''''''''''./qm9'''''''''''''''''''''''''''''''')
3 选择划分策略 MoleculeNet scaffold split(110K/10K/11K)
4 选择目标性质 12 个回归目标(如 U₀, index=7)
5 初始化模型 SchNet(入门)/ PaiNN(平衡)/ ViSNet(SOTA)
6 训练 Adam lr=5e-4, batch=128, 300 epochs
7 评估 MAE(meV for energies, mD for dipole)
8 对比基准 参见 §8.1 排行榜
9 报告 注明 split、目标、单位

§10.4 人工校验表

# 检查项 状态 说明
1 数据来源验证 figshare DOI 永久可访问
2 数据完整性校验 133,885 个文件 + uncharacterized.txt
3 单位确认 原始 Ha → MoleculeNet eV(27.2114×)
4 未表征分子排除 标准 130,831 分子版本
5 划分策略记录 scaffold split 或 random split 明确标注
6 基准模型对比 §8.1 排行榜提供 SOTA 参考
7 许可证合规 CC0,无任何限制
8 引用格式 §9.2 BibTeX 提供 4 条引用
9 页面状态 published(无未定稿字样)
10 JSON-LD 完整性 §C 含完整 @graph
返回 AI-Ready 数据集