Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python将不确定性传播到用户定义的函数_Python_Numpy_Pymc_Uncertainty - Fatal编程技术网

如何使用python将不确定性传播到用户定义的函数

如何使用python将不确定性传播到用户定义的函数,python,numpy,pymc,uncertainty,Python,Numpy,Pymc,Uncertainty,我想使用python传播不确定性。通过不确定性软件包,对于简单函数而言,这是相对容易的。但是,使用用户定义的函数实现同样的效果并不明显。下面是我试图做的一个例子 import mcerp as err import numpy as np def mult_func(x,xm ,a): x[x==0.] = 1e-20 v = (1.-(xm/x)**a) * (x > xm) v[np.isnan(v)] = 0. return v def int

我想使用python传播不确定性。通过不确定性软件包,对于简单函数而言,这是相对容易的。但是,使用用户定义的函数实现同样的效果并不明显。下面是我试图做的一个例子

import mcerp as err
import numpy as np


def mult_func(x,xm ,a):
    x[x==0.] = 1e-20
    v = (1.-(xm/x)**a) * (x > xm)
    v[np.isnan(v)] = 0.
    return v


def intg(e,f,cut,s):
    t = mult_func(e,cut,s)
    res = np.trapz(t*f,e)  
    return res  

x=np.linspace(0,1,10000)
y=np.exp(x)

m=0.
mm=0.
N=100000  
for i in range(0,N):
    cut=np.random.normal(0.21,0.02)
    stg=np.random.normal(1.1,0.1)
    v=intg(x,y,cut,stg)
    m=m+v
    mm=mm+v*v



print("avg. %10.5E +/- %10.5E fixed %10.5E"%(m/N,np.sqrt((mm/N-(m/N)**2)),intg(x,y,0.21,1.1)))
上面所做的只是对两个参数进行随机抽样,并计算平均值和方差。然而,我不确定这种暴力手段在多大程度上是足够的。我可以使用大数定律,试着估计需要多少次试验才能得到某个值(P=1-1/(N*k**2))约为
k
乘以真实平均值的标准偏差

原则上我写的东西可以用。然而,我的假设是,作为一种具有许多强大软件包的灵活语言,python可以更有效地完成这项任务。我在考虑
不确定性
mcerp
pymc
。由于我使用这些软件包的经验有限,我不确定如何继续

编辑:
我最初的示例没有那么多信息,这就是为什么我决定做一个新的示例来说明我的想法。

Numpy支持任意数字类型的数组。但是,并非所有函数都支持任意数字类型

在这种情况下,不支持
numpy.exp
trapz

请注意,uncertanties模块包含
unumpy
numpy.exp
在这里有一个替换项:
unampy.exp

我们把trapz定义为

看看这里

a=un.ufloat(0.3,0.01)
b=un.ufloat(1.2,0.071)



def sample_func(a: un.UFloat, b: un.UFloat) -> np.ndarray:
    x=np.linspace(0,a,100)
    y = un.unumpy.exp(x)
    return utrapz(y, x)

def utrapz(y: np.ndarray, x: np.ndarray) -> np.ndarray:
    Δx = x[1:]-x[:-1]
    avg_y = (y[1:]+y[:-1])/2
    return (Δx*avg_y)


print(sample_func(a, b))  
输出:


np.exp()
**
不同
np.exp()
是指数函数。哦,这是一个非常严重的错误。让我来修!为什么这个问题的标签是“pymc”?
[0.00026601240063021264+/-nan 0.0005935120815465686+/-6.429403852670308e-06
 0.0006973604419223405+/-3.888235103342809e-06 ...,
 0.002095505706899622+/-6.503985178118233e-05
 0.0021019968633076134+/-6.545802781649068e-05
 0.0021084415802710295+/-6.587387316821736e-05]