一般来说,我有一个模型 g,它观察到输入 X、参数 θ 和观察到的输出 Y。但是,在某些情况下我没有观察到输入 X。在这种情况下,使用 OpenTURNS 似乎是不可能的,因为例如,LinearLeastSquaresCalibration
该类需要输入样本。
为了提供一个基本的用例,让我考虑以下示例,该示例改编自LinearLeastSquaresCalibration
该类的文档。
我们首先定义要校准的模型 g。
import numpy as np
import openturns as ot
# We define the model g which has 3 inputs and one output H.
def functionFlooding(X) :
L = 5.0e3
B = 300.0
Q, K_s, DeltaZ = X
alpha = DeltaZ/L
if alpha < 0.0 or K_s <= 0.0:
H = np.inf
else:
H = (Q/(K_s*B*np.sqrt(alpha)))**(3.0/5.0)
return [H]
g = ot.PythonFunction(3, 1, functionFlooding)
g = ot.MemoizeFunction(g)
g.setOutputDescription(["H (m)"])
然后我们定义输入随机向量。这是一组 3 个Dirac
分布。
# Set the parameters to be calibrated.
Q = ot.Dirac(1013.0)
K_s = ot.Dirac(30.0)
DeltaZ = ot.Dirac(5.0)
# Create the joint input distribution.
inputRandomVector = ot.ComposedDistribution([Q, K_s, DeltaZ])
然后我们创建输出 H 的 Monte-Carlo 样本。在这种情况下,这是一个包含常数值的样本。
nbobs = 100
inputSample = inputRandomVector.getSample(nbobs)
outputH = g(inputSample)
然后我们生成观察噪声并将其添加到模型的输出中。
sigmaObservationNoiseH = 0.1 # (m)
noiseH = ot.Normal(0.0, sigmaObservationNoiseH)
sampleNoiseH = noiseH.getSample(nbobs)
Hobs = outputH + sampleNoiseH
最后,我们定义theta参数的参考值。
QInitial = 1000.0
KsInitial = 20.0
DeltaZInitial = 2.0
thetaPrior = ot.Point([QInitial,KsInitial,DeltaZInitial])
然后我们来到这个例子的核心。以下语句从模型创建校准函数。
calibratedIndices = [0,1,2]
mycf = ot.ParametricFunction(g, calibratedIndices, thetaPrior)
因此,校准后的函数没有输入,这就是为什么我们设置一个空列表作为输入参数来检查它是否有效。
>>> print(mycf([]))
[3.56855]
该类的构造函数需要一个示例inputObservations
:
LinearLeastSquaresCalibration(
model, inputObservations,
outputObservations, candidate, methodName)
但是,在这种情况下,我们没有这样的输入样本。如何使用校准工具?