gpt4 book ai didi

python - 如何在 OpenTURNS 中使用具有用户定义梯度的 Python 函数估计泰勒分解方差?

转载 作者:太空宇宙 更新时间:2023-11-03 20:03:33 25 4
gpt4 key购买 nike

我有一个Python函数,它有2个输入X0和X1以及1个输出Y:

def mySimulator(x):
y0 = 1. - x[0] * x[1]
y = [y0]
return y

我想估计泰勒分解的输出 Y 的方差,例如 X0~Normal(1,3) 和 X1~Normal(2,4)。

这很容易使用OpenTURNS :

import openturns as ot
g = ot.PythonFunction(2,1,mySimulator)
distX0 = ot.Normal(1.,3.)
distX1 = ot.Normal(2.,4.)
X = ot.ComposedDistribution([distX0,distX1])
XRV = ot.RandomVector(X)
Y = ot.CompositeRandomVector(g, XRV)
taylor = ot.TaylorExpansionMoments(Y)
sigma2 = taylor.getCovariance()
print(sigma2)

之前的脚本打印:

>>> print(sigma2)
[[ 52 ]]

泰勒展开式的协方差基于函数的梯度和边际的方差。问题是函数的梯度在这里是根据有限差分计算的。这很遗憾,因为精确的梯度在这里很容易计算:

def myGradient(x):
dy0dx0 = -x[1]
dy0dx1 = -x[0]
gradient = [[dy0dx0],[dy0dx1]]
return gradient

但是,我不知道如何定义具有用户定义渐变的 PythonFunction:这可能吗?

我在文档中进行了搜索,发现了以下有用的页面,但这些页面并没有引导我找到解决方案:

最佳答案

其实,我自己找到了答案。 PythonFunction 有一个 gradient 选项,可以设置函数的梯度。

我首先使用以下 Python 函数定义了渐变,该函数返回一个 OpenTURNS Matrix

def myGradient(x):
dy0dx0 = -x[1]
dy0dx1 = -x[0]
gradient = ot.Matrix([[dy0dx0],[dy0dx1]])
return gradient

然后可以按如下方式定义和使用PythonFunction:仅更改函数的定义,而不更改脚本的其余部分。

g = ot.PythonFunction(2,1,mySimulator,gradient=myGradient)
XRV = ot.RandomVector(X)
Y = ot.CompositeRandomVector(g, XRV)
taylor = ot.TaylorExpansionMoments(Y)
sigma2 = taylor.getCovariance()

关于python - 如何在 OpenTURNS 中使用具有用户定义梯度的 Python 函数估计泰勒分解方差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59096111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com