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 系统还是自动采集设备,只要最终能填充成上述字段,后续的贝叶斯模型、采集函数和推荐引擎都不需要改动。数据接口一旦统一,配方优化就从“每次重新整理数据”变成“持续追加实验、持续更新模型”的闭环。