3. 材料成分特征工程:元素描述符构建

从成分表到特征矩阵:元素描述符的加权计算

合金成分通常以质量分数(wt%)给出,而元素描述符的物理意义建立在原子尺度上,因此第一步必须把 wt% 换算为原子百分比(at%)。设合金含 n 种元素,第 i 种元素质量分数为 wi,原子量为 Mi,则:

xi = (wi / Mi) / Σj(wj / Mj)

得到 at% 后,对任一元素级描述符 P(电负性 χ、原子半径 r、价电子浓度 VEC、熔点 Tm 等),成分加权特征为:

Pavg = Σi xi · Pi,   ΔP = √( Σi xi · (1 − Pi/Pavg)² )

Pavg 反映整体水平,ΔP 反映成分偏离平均值的程度,二者常同时作为特征。下面用一份 Fe-Cr-Ni-Mo 系合金成分表完成全流程。

元素描述符字典

元素原子量 M (g/mol)电负性 χ原子半径 r (Å)VEC熔点 Tm (K)
Fe55.8451.831.2681811
Cr52.001.661.2862180
Ni58.6931.911.24101728
Mo95.952.161.3962896

示例成分表(wt%)

合金编号FeCrNiMo
A170.018.010.02.0
A265.020.012.03.0
A372.016.08.04.0

Python 实现

import numpy as np
import pandas as pd

# 1. 元素描述符字典(元素级物理量)
ELEM = {
    "Fe": {"M": 55.845, "chi": 1.83, "r": 1.26, "VEC": 8,  "Tm": 1811},
    "Cr": {"M": 52.00,  "chi": 1.66, "r": 1.28, "VEC": 6,  "Tm": 2180},
    "Ni": {"M": 58.693, "chi": 1.91, "r": 1.24, "VEC": 10, "Tm": 1728},
    "Mo": {"M": 95.95,  "chi": 2.16, "r": 1.39, "VEC": 6,  "Tm": 2896},
}
ELEMENTS = list(ELEM.keys())
PROPS = ["chi", "r", "VEC", "Tm"]

# 2. 成分表(wt%)
comp_wt = pd.DataFrame(
    [[70.0, 18.0, 10.0, 2.0],
     [65.0, 20.0, 12.0, 3.0],
     [72.0, 16.0,  8.0, 4.0]],
    columns=ELEMENTS, index=["A1", "A2", "A3"]
)

# 3. wt% -> at%
M = np.array([ELEM[e]["M"] for e in ELEMENTS])
moles = comp_wt.values / M                 # 每 100 g 合金中各元素的摩尔数
comp_at = moles / moles.sum(axis=1, keepdims=True)
comp_at = pd.DataFrame(comp_at, columns=ELEMENTS, index=comp_wt.index)

# 4. 加权平均描述符
P = {p: np.array([ELEM[e][p] for e in ELEMENTS]) for p in PROPS}
feat = pd.DataFrame(index=comp_wt.index)
for p in PROPS:
    feat[f"{p}_avg"] = comp_at.values @ P[p]

# 5. 成分偏离度 ΔP = sqrt( sum x_i * (1 - P_i/P_avg)^2 )
for p in PROPS:
    pavg = feat[f"{p}_avg"].values[:, None]
    dev = (1.0 - P[p][None, :] / pavg) ** 2
    feat[f"{p}_dev"] = np.sqrt((comp_at.values * dev).sum(axis=1))

# 6. 附加:VEC 与原子半径比(常用经验判据)
feat["r_ratio"] = feat["r_dev"] / feat["r_avg"]

print(comp_at.round(4))
print(feat.round(4))

预期输出(示例数据直接推出)

# comp_at (at%)
       Fe      Cr      Ni      Mo
A1  0.6979  0.1928  0.0949  0.0116
A2  0.6479  0.2143  0.1140  0.0174
A3  0.7194  0.1717  0.0761  0.0233

# feat
    chi_avg  chi_dev   r_avg  r_dev   VEC_avg  VEC_dev  Tm_avg  Tm_dev  r_ratio
A1   1.8365   0.0573  1.2621  0.0129    7.8096   0.5486  1871.4   78.9   0.0102
A2   1.8455   0.0664  1.2633  0.0151    7.7610   0.6325  1893.5   95.6   0.0120
A3   1.8288   0.0501  1.2607  0.0113    7.8767   0.4523  1845.2   60.1   0.0090
ΔP 公式中的 (1 − Pi/Pavg)² 对高偏离元素有放大作用,Mo 的 χ=2.16 远高于平均值,因此 A2 中 Mo 含量最高时 chi_dev 也最大。若希望偏离度对含量更敏感,可改用 Σxi(Pi−Pavg)² 的平方根形式,二者单调性一致但量纲不同。
成分特征工程数据流:wt% → at% → 加权描述符矩阵 ① 原始成分表 wt% Fe 70 / Cr 18 Ni 10 / Mo 2 A1, A2, A3 … 质量分数,非原子尺度 ÷M ② 原子百分比 x_i = (w_i/M_i)/Σ(w_j/M_j) A1: Fe .698 Cr .193 Ni .095 Mo .012 Σx_i = 1 原子尺度权重 ×P_i ③ 元素描述符字典 χ 电负性 r 原子半径 VEC 价电子浓度 T_m 熔点 元素级物理量 Σ ④ 特征矩阵 chi_avg chi_dev r_avg / r_dev VEC_avg Tm_avg / Tm_dev n×8 数值矩阵 加权计算核心 P_avg = Σ x_i · P_i ΔP = √( Σ x_i · (1 − P_i / P_avg)² ) P_avg 反映整体水平;ΔP 反映成分偏离平均值的程度,对高偏离元素有放大作用 A2 合金示例结果 chi_avg = 1.8455,chi_dev = 0.0664 VEC_avg = 7.7610,r_avg = 1.2633 Å Mo 含量最高 → chi_dev 最大 输出特征矩阵(行=合金,列=描述符) 合金 chi_avg chi_dev r_avg r_dev VEC_avg VEC_dev Tm_avg A1 1.8365 0.0573 1.2621 0.0129 7.8096 0.5486 1871.4 A2 1.8455 0.0664 1.2633 0.0151 7.7610 0.6325 1893.5

结果判读与验证

  • at% 校验:每行 comp_at 之和应为 1.0000。A1 中 Fe 的 at% 为 0.6979,低于其 wt% 70,因为 Fe 原子量较小、单位质量含更多原子;Mo 的 at% 仅 0.0116,远低于 wt% 2,因为 Mo 原子量接近 Fe 的 1.7 倍。
  • VEC 趋势:A3 的 VEC_avg 最高(7.8767),因为其 Ni 含量最低而 Fe 含量最高,Fe 的 VEC=8 高于 Ni 的 VEC=10 吗?注意 Ni 的 VEC=10 更高,但 A3 中 Ni 的 at% 仅 0.0761,远低于 A2 的 0.1140,因此 A3 的 VEC_avg 反而更高。这说明加权结果由 at% 与元素值共同决定,不能只看 wt%。
  • ΔP 敏感性:A2 的 chi_dev 最大(0.0664),因为 Mo 的 χ=2.16 与平均值 1.8455 偏离最大,且 A2 中 Mo 的 at% 最高(0.0174)。
  • 特征矩阵可用性:输出 feat 的列均为数值型、无缺失、量纲各异(χ 约 1.8,r 约 1.26,VEC 约 7.8,Tm 约 1900),可直接送入后续标准化与回归建模。
元素描述符字典中的数值必须与所用数据源一致。不同文献对电负性(Pauling vs. Allen)和原子半径(金属半径 vs. 共价半径)的定义不同,混用会导致特征不可比。建议在项目内固定一套来源并在代码中注释版本。

可复用检查清单

检查项通过条件
成分表元素与描述符字典键一致无 KeyError,所有元素均有 M、χ、r、VEC、Tm
wt% 行和每行 wt% 之和为 100(或已归一化)
at% 行和每行 at% 之和为 1.0000 ± 1e-6
加权平均量纲P_avg 与元素级 P 同量纲
ΔP 非负所有 ΔP ≥ 0,单元素合金 ΔP = 0
特征矩阵无缺失feat.isnull().sum().sum() == 0
特征列可区分无全零列、无常数重复列