
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 领域的地位可以从以下几个维度理解:
-
化学空间的系统性覆盖:GDB-17 枚举了所有可能的稳定有机分子(最多 17 个重原子),QM9 取其中最小的 9 原子子集,提供了化学空间的一个系统性、无偏见的采样。与从数据库(如 ChEMBL、PubChem)中收集的分子不同,GDB 枚举不依赖已知合成路线,因此覆盖了更广的化学多样性。
-
DFT 一致性:所有 133,885 个分子的所有性质都在完全相同的理论水平(B3LYP/6-31G(2df,p))下计算,使用相同的软件(Gaussian 09)和收敛标准。这种一致性消除了跨数据源合并时的系统性误差,是机器学习模型评估的前提条件。
-
多任务回归基准:15 个标量性质覆盖了几何(转动常数、偶极矩、极化率、电子空间范围)、电子(HOMO/LUMO/能隙)和热力学(零点能、内能/焓/自由能/热容)三个维度,使模型必须在多物理量上同时表现良好。
-
3D 几何信息:每个分子包含 DFT 优化后的 3D 原子坐标,使得 3D 图神经网络(利用原子间距离和角度信息)可以在此数据集上充分发挥优势。这是 QM9 区别于仅基于 2D 拓扑的分子数据集(如 Tox21、ESOL)的核心特征。
-
开放许可: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{编号} (如 gdb1 到 gdb133885) |
原始枚举编号 |
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% |
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%) |
独立子集 |
| 工具 |
类型 |
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 |
覆盖不同数量级 |
| R² |
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 官方资源
§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 团队
原始机构(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 库 |
免费用于学术研究 |
§10.3 推荐工作流
| 步骤 |
操作 |
工具/命令 |
| 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 |