1

一般来说,我有一个模型 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)

但是,在这种情况下,我们没有这样的输入样本。如何使用校准工具?

4

1 回答 1

1

由于我们没有输入观察,我们创建一个空Sample作为输入。

emptyInputObservations = [[]]*len(Hobs)
algo = ot.LinearLeastSquaresCalibration(
    mycf, emptyInputObservations, Hobs, thetaPrior, "SVD")

其他类NonLinearLeastSquaresCalibrationGaussianLinearCalibrationGaussianNonLinearCalibration以相同的方式工作。

于 2020-02-28T10:25:24.330 回答