10. MultiBgolearn 中的 MOBO 算法#

备注

本页提供 MultiBgolearn 中实现的多目标贝叶斯优化算法的详细说明。

10.1. 概述#

MultiBgolearn 实现了三个主要的多目标采集函数,每个都有不同的优势和用例:

  1. 期望超体积提升 (EHVI) - 基于体积的优化

  2. q-噪声期望超体积提升 (qNEHVI) - 基于体积的优化

  3. 改进概率 (PI) - 基于改进概率

  4. 上置信界 (UCB) - 不确定性感知探索

10.2. 期望超体积提升 (EHVI)#

10.2.1. 理论#

EHVI 被认为是多目标贝叶斯优化的黄金标准。它最大化超体积的期望提升,即帕累托前沿支配的目标空间的体积。

EHVI(x) = E[HV(F ∪ {f(x)}) - HV(F)]

其中:

  • F:当前帕累托前沿近似

  • HV(·):超体积指标

  • f(x):点 x 处的预测目标向量

10.2.2. 数学细节#

对于高斯过程代理模型,EHVI 可以对 2D 问题进行解析计算,对更高维度进行近似:

EHVI(x) = ∫ max(0, HV_improvement) · p(f(x)) df(x)

其中 p(f(x)) 是来自 GP 预测的多元高斯分布。

10.2.3. MultiBgolearn 中的实现#

from MultiBgolearn import bgo

# Use EHVI for multi-objective optimization
VS_recommended, improvements, index = bgo.fit(
    dataset_path='data.csv',
    VS_path='virtual_space.csv',
    object_num=3,
    method='EHVI',                    # Expected Hypervolume Improvement
    assign_model='GaussianProcess',   # Best for EHVI
    bootstrap=5
)

10.2.4. 优势#

EHVI 优势

  • 理论健全:最大化定义明确的质量指标

  • 帕累托兼容:尊重帕累托支配关系

  • 平衡探索:探索和利用之间的良好权衡

  • 可扩展:适用于 2-4 个目标

10.2.5. 局限性#

EHVI 局限性

  • 计算成本:对于 >4 个目标很昂贵

  • 参考点依赖:需要仔细选择参考点

  • 需要近似:精确计算仅对 2D 可行

10.2.6. 最佳用例#

  • 2-4 个目标:最佳性能范围

  • 平衡探索:当您想要全面的帕累托前沿时

  • 质量关注:当超体积是重要指标时

  • 材料设计:合金优化、加工参数

10.2.7. 示例:使用 EHVI 进行合金设计#

import pandas as pd
from MultiBgolearn import bgo

# Prepare alloy dataset
# Features: Cu, Mg, Si content (%)
# Objectives: Strength (MPa), Ductility (%), Cost ($/kg)
dataset = pd.DataFrame({
    'Cu': [2.0, 3.5, 1.8, 4.2, 2.8],
    'Mg': [1.2, 0.8, 1.5, 0.9, 1.1],
    'Si': [0.5, 0.7, 0.3, 0.8, 0.6],
    'Strength': [250, 280, 240, 290, 265],
    'Ductility': [15, 12, 18, 10, 14],
    'Cost': [-100, -120, -95, -130, -110]  # Negative for maximization
})

dataset.to_csv('alloy_data.csv', index=False)

# Virtual space
virtual_space = pd.DataFrame({
    'Cu': [2.5, 3.0, 3.8, 2.2],
    'Mg': [1.0, 1.3, 0.9, 1.4],
    'Si': [0.6, 0.4, 0.8, 0.5]
})
virtual_space.to_csv('virtual_alloys.csv', index=False)

# EHVI optimization
recommended, improvements, idx = bgo.fit(
    'alloy_data.csv',
    'virtual_alloys.csv',
    object_num=3,
    method='EHVI',
    assign_model='GaussianProcess',
    bootstrap=10
)

print(f"Recommended alloy: Cu={recommended[0]:.1f}%, Mg={recommended[1]:.1f}%, Si={recommended[2]:.1f}%")
print(f"Expected improvements: Strength={improvements[0]:.1f}, Ductility={improvements[1]:.1f}, Cost={improvements[2]:.1f}")

10.3. q-噪声期望超体积提升 (qNEHVI)#

10.3.1. 理论#

qNEHVI 扩展了 EHVI 以处理噪声观测和批量采集,使其成为具有测量不确定性和并行实验的真实世界多目标优化的最先进方法。

qNEHVI(X_q) = E_y[E_f[HV(P(y ∪ f_q)) - HV(P(y))]]

其中:

  • X_q = {x_1, ..., x_q}:q 个候选点的批次

  • y:来自现有数据的噪声观测

  • f_q:候选批次的预测目标

  • P(·):帕累托前沿算子

  • 内部期望:对 GP 后验预测

  • 外部期望:对观测噪声

10.3.2. 数学细节#

qNEHVI 在采集函数中显式建模观测噪声:

y_i(x) = f_i(x) + ε_i, ε_i ~ N(0, σ²_obs,i)

采集函数通过嵌套蒙特卡洛采样近似:

qNEHVI(X_q) ≈ (1/S₁S₂) Σ Σ max(0, HV(P(y^(s₁) ∪ f_q^(s₂))) - HV(P(y^(s₁))))

10.3.3. 示例:使用 qNEHVI 进行合金设计#

import pandas as pd
from MultiBgolearn import bgo

# Prepare alloy dataset
# Features: Cu, Mg, Si content (%)
# Objectives: Strength (MPa), Ductility (%), Cost ($/kg)
dataset = pd.DataFrame({
    'Cu': [2.0, 3.5, 1.8, 4.2, 2.8],
    'Mg': [1.2, 0.8, 1.5, 0.9, 1.1],
    'Si': [0.5, 0.7, 0.3, 0.8, 0.6],
    'Strength': [250, 280, 240, 290, 265],
    'Ductility': [15, 12, 18, 10, 14],
    'Cost': [-100, -120, -95, -130, -110]  # Negative for maximization
})

dataset.to_csv('alloy_data.csv', index=False)

# Virtual space
virtual_space = pd.DataFrame({
    'Cu': [2.5, 3.0, 3.8, 2.2],
    'Mg': [1.0, 1.3, 0.9, 1.4],
    'Si': [0.6, 0.4, 0.8, 0.5]
})
virtual_space.to_csv('virtual_alloys.csv', index=False)

# EHVI optimization
recommended, improvements, idx = bgo.fit(
    'alloy_data.csv',
    'virtual_alloys.csv',
    object_num=3,
    method='qNEHVI',
    assign_model='GaussianProcess',
    batch_size=3,
    bootstrap=5
)

print(f"Recommended alloy: Cu={recommended[0]:.1f}%, Mg={recommended[1]:.1f}%, Si={recommended[2]:.1f}%")
print(f"qNEHVI improvements: Strength={improvements[0]:.1f}, Ductility={improvements[1]:.1f}, Cost={improvements[2]:.1f}")

10.4. 改进概率 (PI)#

10.4.1. 理论#

多目标 PI 计算候选点在当前帕累托前沿中至少改进一个目标的概率。

PI(x) = P(f(x) dominates at least one point in F)

对于高斯过程预测:

PI(x) = P(∃ y ∈ F : f(x) ≻ y)

其中 表示帕累托支配。

10.4.2. 实现#

# Use PI for improvement-focused optimization
VS_recommended, improvements, index = bgo.fit(
    dataset_path='data.csv',
    VS_path='virtual_space.csv',
    object_num=2,
    method='PI',                      # Probability of Improvement
    assign_model='RandomForest',      # Good for discrete problems
    bootstrap=5
)

10.4.3. 计算细节#

对于每个候选点 x,PI 计算如下:

  1. 从 GP 后验生成样本f_samples ~ GP(x)

  2. 检查每个样本对帕累托前沿的支配性

  3. 计算概率作为支配样本的比例

# Pseudo-code for PI calculation
def calculate_PI(x, pareto_front, gp_model, n_samples=1000):
    # Sample from GP posterior
    f_samples = gp_model.sample_posterior(x, n_samples)

    # Check dominance for each sample
    dominates_count = 0
    for sample in f_samples:
        if any(dominates(sample, pf_point) for pf_point in pareto_front):
            dominates_count += 1

    return dominates_count / n_samples

10.4.4. 优势#

PI 优势

  • 直观:易于理解和解释

  • 保守:专注于可能的改进

  • 快速计算:相对高效的计算

  • 鲁棒:适用于噪声目标

10.4.5. 局限性#

PI 局限性

  • 利用偏差:可能探索不足

  • 局部最优:可能陷入局部区域

  • 忽略幅度:不考虑改进大小

10.4.6. 最佳用例#

  • 保守优化:当您想要可靠的改进时

  • 噪声目标:当测量具有高不确定性时

  • 有限预算:当您的评估机会很少时

  • 利用重点:当您想改进已知的良好区域时

10.4.7. 示例:加工参数优化#

# Heat treatment optimization
# Features: Temperature (°C), Time (hours), Cooling rate (°C/min)
# Objectives: Hardness (HV), Toughness (J), Energy cost (kWh)

dataset = pd.DataFrame({
    'Temperature': [450, 500, 550, 480, 520],
    'Time': [2, 4, 6, 3, 5],
    'Cooling_rate': [10, 20, 15, 25, 12],
    'Hardness': [180, 220, 250, 200, 235],
    'Toughness': [45, 35, 25, 40, 30],
    'Energy_cost': [-50, -80, -120, -65, -95]  # Negative for maximization
})

dataset.to_csv('heat_treatment_data.csv', index=False)

# Virtual processing conditions
virtual_conditions = pd.DataFrame({
    'Temperature': [475, 525, 490, 510],
    'Time': [3.5, 5.5, 2.5, 4.5],
    'Cooling_rate': [18, 22, 14, 16]
})
virtual_conditions.to_csv('virtual_conditions.csv', index=False)

# PI optimization
recommended, improvements, idx = bgo.fit(
    'heat_treatment_data.csv',
    'virtual_conditions.csv',
    object_num=3,
    method='PI',
    assign_model='GradientBoosting',
    bootstrap=8
)

print(f"Recommended conditions: T={recommended[0]:.0f}°C, t={recommended[1]:.1f}h, CR={recommended[2]:.0f}°C/min")

10.5. 上置信界 (UCB)#

10.5.1. 理论#

多目标 UCB 通过对每个目标使用置信界来平衡利用(均值预测)和探索(不确定性)。

UCB(x) = μ(x) + β·σ(x)

其中:

  • μ(x):均值预测向量

  • σ(x):标准差向量

  • β:探索参数

10.5.2. 多目标 UCB 变体#

10.5.2.1. 1. 分量 UCB#

分别对每个目标应用 UCB:

UCB_i(x) = μ_i(x) + β·σ_i(x)  for i = 1, ..., m

10.5.2.2. 2. 基于超体积的 UCB#

使用 UCB 值计算超体积:

UCB_HV(x) = HV([UCB_1(x), UCB_2(x), ..., UCB_m(x)])

10.5.2.3. 3. 标量化 UCB#

使用权重组合目标:

UCB_scalar(x) = Σ w_i · UCB_i(x)

10.5.3. 实现#

# Use UCB for exploration-focused optimization
VS_recommended, improvements, index = bgo.fit(
    dataset_path='data.csv',
    VS_path='virtual_space.csv',
    object_num=3,
    method='UCB',                     # Upper Confidence Bound
    assign_model='SVR',               # Good for high-dimensional problems
    bootstrap=5
)

10.5.4. 参数选择#

探索参数 β 控制探索-利用权衡:

# β selection guidelines
beta_values = {
    "Conservative (exploitation)": 0.5,
    "Balanced": 1.0,
    "Aggressive (exploration)": 2.0,
    "Very aggressive": 3.0
}

10.5.5. 优势#

UCB 优势

  • 不确定性感知:显式考虑预测不确定性

  • 可调:β 参数允许探索控制

  • 鲁棒:适用于噪声数据

  • 可扩展:对许多目标高效

10.5.6. 局限性#

UCB 局限性

  • 参数调整:需要选择 β

  • 过度探索:高 β 可能探索过多

  • 模型依赖:性能取决于不确定性估计

10.5.7. 最佳用例#

  • 噪声目标:当测量具有显著不确定性时

  • 探索需求:当您想探索未知区域时

  • 高维度:当您有许多目标(>4)时

  • 不确定性量化:当预测置信度很重要时

10.5.8. 示例:多性能陶瓷设计#

# Ceramic material optimization
# Features: Al2O3, SiO2, MgO content (%)
# Objectives: Strength (MPa), Thermal conductivity (W/mK), Thermal shock resistance

dataset = pd.DataFrame({
    'Al2O3': [85, 90, 80, 95, 88],
    'SiO2': [10, 5, 15, 3, 8],
    'MgO': [5, 5, 5, 2, 4],
    'Strength': [300, 350, 280, 380, 320],
    'Thermal_conductivity': [25, 30, 20, 35, 28],
    'Thermal_shock': [8, 6, 10, 5, 7]
})

dataset.to_csv('ceramic_data.csv', index=False)

# Virtual compositions
virtual_ceramics = pd.DataFrame({
    'Al2O3': [87, 92, 83, 89],
    'SiO2': [8, 4, 12, 7],
    'MgO': [5, 4, 5, 4]
})
virtual_ceramics.to_csv('virtual_ceramics.csv', index=False)

# UCB optimization with high exploration
recommended, improvements, idx = bgo.fit(
    'ceramic_data.csv',
    'virtual_ceramics.csv',
    object_num=3,
    method='UCB',
    assign_model='GaussianProcess',
    bootstrap=12  # Higher bootstrap for better uncertainty
)

print(f"Recommended ceramic: Al2O3={recommended[0]:.1f}%, SiO2={recommended[1]:.1f}%, MgO={recommended[2]:.1f}%")

10.6. 算法比较#

10.6.1. 性能特征#

表 10.1 算法比较#

算法

最适合

目标数

探索性

计算量

EHVI

平衡优化

2-4

中等

qNEHVI

平衡优化

2-4

中等

非常高

PI

保守改进

2-6

中等

UCB

不确定/噪声数据

2-8+

10.6.2. 选择指南#

10.6.2.1. 选择 EHVI 当:#

  • 您有 2-4 个目标

  • 您想要全面的帕累托前沿

  • 计算资源可用

  • 超体积是重要指标

10.6.2.2. 选择 qNEHVI 当:#

  • 您有 2-4 个目标

  • 测量具有显著的观测噪声或不确定性

  • 可以并行进行多个实验

10.6.2.3. 选择 PI 当:#

  • 您想要可靠的改进

  • 目标有噪声

  • 评估预算有限

  • 首选保守方法

10.6.2.4. 选择 UCB 当:#

  • 您有 >4 个目标

  • 测量中的不确定性高

  • 需要探索未知区域

  • 想要可调的探索

10.7. 高级主题#

10.7.1. 约束处理#

所有算法都可以通过惩罚方法处理约束:

# Add constraints to optimization
def constraint_penalty(x):
    penalty = 0
    # Composition constraint: sum ≤ 100%
    if sum(x[:3]) > 100:
        penalty += 1000 * (sum(x[:3]) - 100)
    # Temperature constraint: 400 ≤ T ≤ 600
    if x[3] < 400 or x[3] > 600:
        penalty += 1000 * abs(x[3] - np.clip(x[3], 400, 600))
    return penalty

10.7.2. 批量优化#

对于并行实验,修改采集函数:

# Batch EHVI (simplified concept)
def batch_EHVI(X_batch, pareto_front, gp_models):
    # Compute joint improvement for entire batch
    # More complex than single-point EHVI
    pass

10.7.3. 动态目标#

处理随时间变化的目标:

# Update objectives based on new requirements
def update_objectives(iteration):
    if iteration < 10:
        return ['strength', 'ductility']
    else:
        return ['strength', 'ductility', 'cost']  # Add cost later

10.8. 实现技巧#

10.8.1. 数据预处理#

# Normalize objectives to similar scales
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
objectives_normalized = scaler.fit_transform(objectives)

10.8.2. 模型选择#

# Model recommendations by algorithm
model_recommendations = {
    'EHVI': 'GaussianProcess',      # Best uncertainty estimates
    'qNEHVI': 'GaussianProcess',      # Best uncertainty estimates
    'PI': 'RandomForest',           # Robust to noise
    'UCB': 'GaussianProcess'        # Good uncertainty quantification
}

10.8.3. Bootstrap 设置#

# Bootstrap recommendations by algorithm
bootstrap_settings = {
    'EHVI': 5,   # Moderate bootstrap for balance
    'qNEHVI': 5,   # Moderate bootstrap for balance
    'PI': 8,     # Higher for noise robustness
    'UCB': 10    # Highest for uncertainty estimation
}

10.9. 故障排除#

10.9.1. 常见问题#

  1. 收敛性差

    • 增加 bootstrap 迭代次数

    • 尝试不同的代理模型

    • 检查目标缩放

  2. 性能慢

    • 减少虚拟空间大小

    • 使用更简单的模型(RandomForest vs GaussianProcess)

    • 减少 bootstrap 迭代次数

  3. 意外推荐

    • 验证目标定义(最大化 vs 最小化)

    • 检查数据预处理

    • 验证约束处理

10.9.2. 性能优化#

# Speed up optimization
optimization_tips = {
    "Reduce virtual space": "Keep <5000 candidates",
    "Simplify models": "Use RandomForest for speed",
    "Parallel bootstrap": "Use multiprocessing",
    "Cache computations": "Store expensive calculations"
}

10.10. 下一步#

现在您了解了 MOBO 算法:

  1. 通过示例练习多目标优化示例

  2. 学习帕累托分析帕累托优化和权衡分析

  3. 尝试实际应用examples/materials_design

  4. 探索高级功能examples/advanced_usage

参见

有关算法详细信息:

  • Emmerich, M. “Single- and Multi-objective Evolutionary Optimization”

  • Jones, D.R. “Efficient Global Optimization of Expensive Black-Box Functions”

  • Knowles, J. “ParEGO: A Hybrid Algorithm with On-line Landscape Approximation”

  • Samuel, D. “Parallel bayesian optimization of multiple noisy objectives with expected hypervolume improvement”