2. 配方实验的数据结构与表示

在配方优化中,贝叶斯模型并不会直接“理解”材料名称或工艺描述,它只接受数值向量。因此,把一次配方实验从实验记录转化为统一的数据接口,是后续建模、采集函数计算和推荐配方生成的前提。本节要解决的核心问题是:一次配方实验到底包含哪些信息,这些信息如何组织成表格,又如何映射为模型可读的向量。

一、一次配方实验的完整信息结构

从数据建模角度看,一次配方实验记录可以拆成五类字段:

  • 成分字段:各原料的名称与用量,例如树脂A、固化剂B、填料C、助剂D。
  • 比例字段:由成分用量派生出的相对比例,如质量分数、体积分数或摩尔比。
  • 工艺参数:温度、时间、压力、转速、升温速率等可控过程变量。
  • 批次差异:同一配方在不同批次、不同设备或不同原料批号下产生的偏移量。
  • 测试误差:测量重复性、仪器精度、取样位置差异带来的观测不确定性。

这五类字段在建模中的角色并不相同。成分与比例通常作为决策变量,工艺参数既可能是决策变量也可能是固定条件,批次差异属于噪声或分组变量,测试误差则直接影响目标值的可信度。若不加区分地把所有字段都当作普通输入,模型会把批次波动误认为配方效应,导致推荐结果不可复现。

二、表格化:从实验记录到规范数据表

表格化的目标不是简单地把数据放进 Excel,而是建立一张“每行一次实验、每列一个字段”的规范表。推荐的最小字段集如下:

字段类别 字段名示例 类型 说明
标识exp_id、batch_id字符串实验编号与批次编号
成分resin_A、hardener_B、filler_C数值质量份或克数
比例w_resin、w_hardener、w_filler数值归一化质量分数,和为1
工艺temp_C、time_min、pressure_MPa数值可控过程变量
批次batch_offset数值同配方跨批次均值偏移
目标y_strength、y_modulus数值待优化性能指标
误差y_std、n_repeat数值重复测量标准差与次数

其中比例字段必须做归一化处理。假设某次实验树脂A为 60 g、固化剂B为 25 g、填料C为 15 g,总质量 100 g,则质量分数为 0.60、0.25、0.15。归一化的意义在于:模型学到的是“配比关系”,而不是“一次做了多少克”,这样不同放大规模下的实验才能放在同一空间比较。

三、向量化:把一行表格变成模型输入

向量化是把表格中的一行映射为两个向量:输入向量 x 和目标向量 y。以本节示例为例,若决策变量取三个质量分数和两个工艺参数,则:

x = [w_resin, w_hardener, w_filler, temp_C, time_min]
  = [0.60, 0.25, 0.15, 120, 45]

y = [y_strength] = [78.5]   # MPa,示例值
sigma = [y_std] = [1.8]     # 重复测量标准差,示例值

这里有一个关键约定:所有输入维度必须固定顺序、固定单位、固定归一化方式。如果第一次实验用摄氏度、第二次用华氏度,或者比例字段有时归一化有时不归一化,模型输入空间就会错乱。工程上通常把每个维度缩放到 [0,1] 或标准化为均值0、方差1,并把这个缩放参数与模型一起保存,预测新配方时用同一套参数变换。

批次差异的处理方式有两种常见做法。第一种是把 batch_id 作为分组变量,在模型中引入随机效应或分组核函数;第二种是显式记录 batch_offset,即同配方在不同批次下目标值的平均偏移,把它作为额外输入维度。前者适合批次数量多、每批数据少的情况,后者适合批次少但每批重复充分的情况。

四、测试误差的表达与传播

测试误差不能只记一个“合格/不合格”,而应记录重复测量结果。例如同一配方测三次拉伸强度得到 77.2、78.5、79.8 MPa,则均值 78.5 MPa、样本标准差约 1.3 MPa。在贝叶斯优化中,这个标准差可以直接作为观测噪声 sigma_n 的先验或初值。若忽略测试误差,模型会把 1.3 MPa 的测量波动误判为配方差异,采集函数就可能反复推荐几乎相同的配方。

建议在数据表中保留原始重复测量值,而不是只保留均值。原始值可用于估计噪声水平,也能在后续发现异常批次时回溯。

五、统一数据接口的落地形式

把上述结构固化为一个数据接口,可以用一个字典或数据类表达。下面给出一个可直接参考的 Python 数据结构示例:

record = {
    "exp_id": "E0231",
    "batch_id": "B07",
    "components": {"resin_A": 60.0, "hardener_B": 25.0, "filler_C": 15.0},
    "fractions":  {"resin_A": 0.60, "hardener_B": 0.25, "filler_C": 0.15},
    "process":    {"temp_C": 120.0, "time_min": 45.0, "pressure_MPa": 2.0},
    "targets":    {"y_strength": 78.5},
    "y_std":      {"y_strength": 1.3},
    "n_repeat":   3
}

# 向量化:固定顺序,固定单位
X = [record["fractions"]["resin_A"],
     record["fractions"]["hardener_B"],
     record["fractions"]["filler_C"],
     record["process"]["temp_C"],
     record["process"]["time_min"]]
Y = [record["targets"]["y_strength"]]
S = [record["y_std"]["y_strength"]]

这个接口的价值在于:无论实验来自手工记录、LIMS 系统还是自动采集设备,只要最终能填充成上述字段,后续的贝叶斯模型、采集函数和推荐引擎都不需要改动。数据接口一旦统一,配方优化就从“每次重新整理数据”变成“持续追加实验、持续更新模型”的闭环。

配方实验数据结构与向量化接口 实验记录表(表格化) exp_id / batch_id 成分:resin_A 60g … 比例:0.60 / 0.25 / 0.15 工艺:120°C / 45min / 2MPa 批次:B07 / offset +0.8 目标:y_strength 78.5 MPa 误差:y_std 1.3 / n=3 每行 = 一次实验 每列 = 一个字段 向量化 模型输入向量 x₁ = w_resin = 0.60 x₂ = w_hardener = 0.25 x₃ = w_filler = 0.15 x₄ = temp_C = 120 x₅ = time_min = 45 y = 78.5 MPa σ = 1.3 MPa 固定顺序 · 固定单位 · 固定缩放 建模 贝叶斯优化模型 高斯过程代理模型 均值 μ(x) + 方差 σ²(x) 采集函数 EI / UCB 权衡探索与利用 推荐下一组配方 x* = argmax α(x) 更新数据表 新实验 → 追加 → 重训 闭环:实验 → 数据 → 模型 → 推荐 → 新实验 成分/比例 工艺参数 目标/误差 批次/推荐