Documentation

Examples

Examples

这一页收集可以直接运行的完整工作流。每个例子都把 ProblemModelProblem 和 UQPyL 的功能模块串起来。

示例预算都很小,目的是快速跑通。真实任务中,通常需要增加样本数、优化预算、链长度或校准候选规模。

工作流地图

工作流示例问题实际使用时替换
采样和敏感性分析加权二维 sphereobjFunc
单目标优化最小化到原点的距离objFunc、边界、优化器设置
多目标优化ZDT1 benchmark Pareto 搜索benchmark 或自定义多目标 Problem
MCMC 推断围绕低目标值区域采样objFunclogProbFunc
模型校准两个仿真时刻匹配观测simFuncobs、候选参数矩阵
代理模型训练和验证学习非线性响应面objFunc、采样规模、代理模型
代理辅助优化优化代理模型,再用原模型复核昂贵目标函数、infill/update 策略

采样和敏感性分析

这个例子判断两个输入中谁对输出更重要:

text
y = x1^2 + 0.2 * x2^2
python
import numpy as np

from UQPyL.analysis import RBDFAST
from UQPyL.doe import LHS
from UQPyL.problem import Problem


def objFunc(X):
    X = np.atleast_2d(X)
    return (X[:, 0] ** 2 + 0.2 * X[:, 1] ** 2).reshape(-1, 1)


problem = Problem(nInput=2, nObj=1, ub=1.0, lb=-1.0, objFunc=objFunc, optType="min", name="WeightedSphere2D")

X = LHS("classic").sample(problem, nSamples=256, seed=123)
Y = problem.evaluate(X).objs
result = RBDFAST(verboseFlag=False).analyze(problem, X, Y=Y)

print(result.metricNames)
print(result.getMetric("S1").values)

替换点:

示例部分实际替换
objFunc你的模型、仿真包装器或目标计算。
nSamples=256适合模型成本和输入维度的样本数。
RBDFAST如果问题需要,换成其他分析方法。

单目标优化

这个例子最小化二维 sphere:

python
import numpy as np

from UQPyL.optimization.soea import GA
from UQPyL.problem import Problem


def objFunc(X):
    X = np.atleast_2d(X)
    return np.sum(X**2, axis=1, keepdims=True)


problem = Problem(nInput=2, nObj=1, ub=1.0, lb=-1.0, objFunc=objFunc, optType="min", name="Sphere2D")

algorithm = GA(nPop=8, maxFEs=40, maxIters=5, verboseFlag=False, logFlag=False, saveFlag=False)
result = algorithm.run(problem, seed=123)

print(result.bestDecs)
print(result.bestObjs)

bestDecs 是找到的最好决策行,bestObjs 是对应目标值。

多目标优化

这个例子使用内置 ZDT1 benchmark,先确认多目标工作流。

python
from UQPyL.optimization.moea import NSGAII
from UQPyL.problem import ZDT1


problem = ZDT1(nInput=5)
algorithm = NSGAII(nPop=12, maxFEs=48, maxIters=3, verboseFlag=False, logFlag=False, saveFlag=False)
result = algorithm.run(problem, seed=123)

print(result.bestDecs.shape)
print(result.bestObjs.shape)
print(result.bestMetric)

实际使用时,将 ZDT1(nInput=5) 替换为你的多目标 Problem,并根据成本调整 NSGAII 预算。

MCMC 推断

这个例子把标量目标当作未归一化评分。sphere 值越低,默认 log probability 越高。

python
import numpy as np

from UQPyL.inference import MH
from UQPyL.problem import Problem


def objFunc(X):
    X = np.atleast_2d(X)
    return np.sum(X**2, axis=1, keepdims=True)


problem = Problem(nInput=2, nObj=1, ub=2.0, lb=-2.0, objFunc=objFunc, optType="min", name="SpherePosterior")
method = MH(nChains=3, warmUp=5, maxIters=30, verboseFlag=False, logFlag=False, saveFlag=False)
result = method.run(problem, gamma=0.2, seed=123)

print(result.decs.shape)
print(result.logProb.shape)
print(result.acceptanceRate)

decs.shape(n_chains, draws, n_input)

模型校准

这个例子用两个参数匹配两个观测时刻:

text
obs = [[1.0], [2.0]]
sim(t1) = x1
sim(t2) = x2
python
import numpy as np

from UQPyL.calibration import GLUE
from UQPyL.problem import ModelProblem


obs = np.array([[1.0], [2.0]])


def simFunc(X):
    X = np.atleast_2d(X)
    sim = np.zeros((X.shape[0], 2, 1))
    sim[:, 0, 0] = X[:, 0]
    sim[:, 1, 0] = X[:, 1]
    return sim


problem = ModelProblem(nInput=2, ub=3.0, lb=0.0, simFunc=simFunc, obs=obs, simLabels=["Q"], name="ToyModel")
X = np.array([[1.0, 2.0], [1.0, 2.4], [0.0, 0.0]])

result = GLUE(metric="rmse", verboseFlag=False, logFlag=False, saveFlag=False).run(problem, X, threshold=0.3)

print(result.bestDecs)
print(result.bestSim)
print(result.behavioralDecs)

实际使用时替换 simFuncobs 和候选参数矩阵 X

代理模型训练和验证

这个例子采样一个非线性响应面,训练 RBF,并在测试集上验证。

python
import numpy as np

from UQPyL.doe import LHS
from UQPyL.problem import Problem
from UQPyL.surrogate import RandSelect, mse, r_square
from UQPyL.surrogate.rbf import RBF

np.random.seed(123)


def objFunc(X):
    X = np.atleast_2d(X)
    return (np.sin(np.pi * X[:, 0]) + X[:, 1] ** 2).reshape(-1, 1)


problem = Problem(nInput=2, nObj=1, ub=1.0, lb=0.0, objFunc=objFunc, optType="min", name="SurrogateToy")

X = LHS("classic").sample(problem, nSamples=30, seed=123)
Y = problem.evaluate(X).objs
trainIdx, testIdx = RandSelect(pTest=25).split(X)

model = RBF()
model.fit(X[trainIdx], Y[trainIdx])
pred = model.predict(X[testIdx])

print(pred.shape)
print(r_square(Y[testIdx], pred))
print(mse(Y[testIdx], pred))

代理辅助优化模式

基本手动模式:

  1. 在 DOE 点上评估昂贵模型。
  2. 用这些评估训练代理模型。
  3. 低成本优化代理模型。
  4. 用原始昂贵模型复核代理最优点。
python
import numpy as np

from UQPyL.doe import LHS
from UQPyL.optimization.soea import GA
from UQPyL.problem import Problem
from UQPyL.surrogate.rbf import RBF


def expensiveObjFunc(X):
    X = np.atleast_2d(X)
    return (np.sin(np.pi * X[:, 0]) + X[:, 1] ** 2).reshape(-1, 1)


expensiveProblem = Problem(nInput=2, nObj=1, ub=1.0, lb=0.0, objFunc=expensiveObjFunc, optType="min", name="ExpensiveToy")

X = LHS("classic").sample(expensiveProblem, nSamples=30, seed=123)
Y = expensiveProblem.evaluate(X).objs
surrogate = RBF()
surrogate.fit(X, Y)


def surrogateObjFunc(Xnew):
    return surrogate.predict(Xnew)


surrogateProblem = Problem(nInput=2, nObj=1, ub=1.0, lb=0.0, objFunc=surrogateObjFunc, optType="min", name="SurrogateToy")
result = GA(nPop=8, maxFEs=40, maxIters=5, verboseFlag=False, logFlag=False, saveFlag=False).run(surrogateProblem, seed=123)

checkedObj = expensiveProblem.evaluate(result.bestDecs).objs

print(result.bestDecs)
print(result.bestObjs)
print(checkedObj)

result.bestObjs 是代理预测值,checkedObj 是真实模型复核值。

下一步

目标阅读
理解统一建模协议Problem
生成样本Design of Experiment
做敏感性分析Analysis
优化目标Optimization
运行推断Inference
校准仿真模型Calibration
训练代理模型Surrogate Modeling