使用Monte Carlo与scipy.integrate.nquad的不同积分结果

加布里埃尔

下面的MWE显示了使用同一函数对此数据获取的两种集成相同2D内核密度估计stats.gaussian_kde()方法。

(x, y)对阈值以下的所有对象执行积分(x1, y1),该阈值定义了积分上限(积分下限为-infinity;请参见MWE)。

问题在于int1(即:蒙特卡罗方法)系统地提供了比更大的积分值int2我不知道为什么会这样。

这是200次int1(蓝色直方图)运行后获得的积分值相对于int2(红色垂直线)给出的积分结果的示例

在此处输入图片说明

结果积分值的这种差异的根源是什么?


威斯康星州

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from scipy import integrate


def int1(kernel, x1, y1):
    # Compute the point below which to integrate
    iso = kernel((x1, y1))

    # Sample KDE distribution
    sample = kernel.resample(size=50000)

    # Filter the sample
    insample = kernel(sample) < iso

    # The integral is equivalent to the probability of drawing a
    # point that gets through the filter
    integral = insample.sum() / float(insample.shape[0])

    return integral


def int2(kernel, x1, y1):

    def f_kde(x, y):
        return kernel((x, y))

    # 2D integration in: (-inf, x1), (-inf, y1).
    integral = integrate.nquad(f_kde, [[-np.inf, x1], [-np.inf, y1]])

    return integral


# Obtain data from file.
data = np.loadtxt('data.dat', unpack=True)
# Perform a kernel density estimate (KDE) on the data
kernel = stats.gaussian_kde(data)

# Define the threshold point that determines the integration limits.
x1, y1 = 2.5, 1.5

i2 = int2(kernel, x1, y1)
print i2

int1_vals = []
for _ in range(200):
    i = int1(kernel, x1, y1)
    int1_vals.append(i)
    print i

添加

请注意,此问题源自此答案起初,我没有注意到的是,答案是使用积分限弄错了,这解释了为什么间的结果int1int2不同。

int1在域中进行积分f(x,y)<f(x1,y1)(其中f是内核密度估计),而int2在域中进行积分(x,y)<(x1,y1)

dfb

您重新分配分布

sample = kernel.resample(size=50000)

然后计算每个采样点的概率小于边界处的概率

insample = kernel(sample) < iso

这是不正确的。考虑边界(0,100),并假设您的数据具有u =(0,0)和cov = [[100,0],[0,100]]。点(0,50)和(50,0)在此内核中具有相同的概率,但是其中只有一个在边界内。由于两者都通过了测试,因此您采样过度。

您应该测试每个点是否sample在边界内,然后计算概率。就像是

def int1(kernel, x1, y1):
    # Sample KDE distribution                                                                                                              
    sample = kernel.resample(size=100)

    include = (sample < np.repeat([[x1],[y1]],sample.shape[1],axis=1)).all(axis=0)
    integral = include.sum() / float(sample.shape[1])
    return integral

我使用以下代码对此进行了测试

def measure(n):

    m1 = np.random.normal(size=n)
    m2 = np.random.normal(size=n)
    return m1,m2

a = scipy.stats.gaussian_kde( np.vstack(measure(1000)) )
print(int1(a,-10,-10))
print(int2(a,-10,-10))
print(int1(a,0,0))
print(int2(a,-0,-0))

产量

0.0
(4.304674927251112e-232, 4.6980863813551415e-230)
0.26
(0.25897626178338407, 1.4536217446381293e-08)

蒙特卡洛集成应该像这样工作

  • 在x / y可能值的某些子集上抽样N个随机值(一致地,不是来自于您的分布)(在下面,我将其与均值相差10个SD)。
  • 对于每个随机值计算内核(rand_x,rand_y)
  • 计算总和并乘以(体积)/ N_samples

在代码中:

def mc_wo_sample(kernel,x1,y1,lboundx,lboundy):
    nsamples = 50000
    volume = (x1-lboundx)*(y1-lboundy)
    # generate uniform points in range                                                                                                     
    xrand = np.random.rand(nsamples,1)*(x1-lboundx) + lboundx
    yrand = np.random.rand(nsamples,1)*(y1-lboundy) + lboundy
    randvals = np.hstack((xrand,yrand)).transpose()
    print randvals.shape
    return (volume*kernel(randvals).sum())/nsamples

运行以下

   print(int1(a,-9,-9))
   print(int2(a,-9,-9))
   print(mc_wo_sample(a,-9,-9,-10,-10))
   print(int1(a,0,0))
   print(int2(a,-0,-0))
   print(mc_wo_sample(a,0,0,-10,-10))

产量

0.0
(4.012958496109042e-70, 6.7211236076277e-71)
4.08538890986e-70
0.36
(0.37101621760650216, 1.4670898180664756e-08)
0.361614657674

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用scipy.integrate.nquad的双积分解决方案与tegral.dblquad不匹配

来自分类Dev

使用scipy.integrate.quad时结果不连续

来自分类Dev

使用scipy.integrate.quad时结果不连续

来自分类Dev

如何使用Python的scipy.integrate.quad评估多元函数的单个积分?

来自分类Dev

使用 mpmath 函数执行 scipy.integrate 的四元积分方法时出现“TypeError”消息

来自分类Dev

scipy.integrate.odeint返回错误的结果

来自分类Dev

使用nquad进行双积分

来自分类Dev

使用scipy.integrate.simps进行集成

来自分类Dev

scipy.integrate伪-Voigt函数,积分变为0

来自分类Dev

使用scipy.integrate.complex_ode而不是scipy.integrate.ode

来自分类Dev

自定义Python Monte Carlo积分函数低估了多维积分

来自分类Dev

scipy.optimize.curve_fit 定积分函数与 scipy.integrate.quad

来自分类Dev

scipy.integrate 的 Odeint 函数给出错误的结果

来自分类Dev

使用Monte Carlo方法并行计算Pi

来自分类Dev

使用Sucht OMP在CPU上并行化Monte Carlo

来自分类Dev

在Python Monte Carlo方法中使用Gamma函数估算pi

来自分类Dev

使用 python Multiprocessing 并行化 Monte Carlo 方法时的问题

来自分类Dev

使用scipy.integrate.odeint解决微分方程:“函数调用的结果不是正确的浮点数组。”

来自分类Dev

使用scipy.integrate.quad集成伽玛函数

来自分类Dev

使用scipy.integrate集成向量字段(numpy数组)

来自分类Dev

使用scipy.integrate.odeint覆盖ODE集成中的值

来自分类Dev

使用scipy.integrate.odeint时发生TypeError

来自分类Dev

使用scipy.integrate.quad集成伽玛函数

来自分类Dev

scipy.integrate.fixed_quad可以计算具有功能边界的积分吗?

来自分类Dev

为什么 scipy.integrate.quad 返回 0 而不是积分的正确值?

来自分类Dev

C++ Monte Carlo 集成:如何在不求和结果的情况下多次运行代码?

来自分类Dev

Scipy.integrate 给出奇怪的结果;有最佳实践吗?

来自分类Dev

使用Java中随机生成的数据进行pi的Monte Carlo计算

来自分类Dev

如何使用scipy.integrate.ode.set_f_params()进行时间相关的参数更改?

Related 相关文章

  1. 1

    使用scipy.integrate.nquad的双积分解决方案与tegral.dblquad不匹配

  2. 2

    使用scipy.integrate.quad时结果不连续

  3. 3

    使用scipy.integrate.quad时结果不连续

  4. 4

    如何使用Python的scipy.integrate.quad评估多元函数的单个积分?

  5. 5

    使用 mpmath 函数执行 scipy.integrate 的四元积分方法时出现“TypeError”消息

  6. 6

    scipy.integrate.odeint返回错误的结果

  7. 7

    使用nquad进行双积分

  8. 8

    使用scipy.integrate.simps进行集成

  9. 9

    scipy.integrate伪-Voigt函数,积分变为0

  10. 10

    使用scipy.integrate.complex_ode而不是scipy.integrate.ode

  11. 11

    自定义Python Monte Carlo积分函数低估了多维积分

  12. 12

    scipy.optimize.curve_fit 定积分函数与 scipy.integrate.quad

  13. 13

    scipy.integrate 的 Odeint 函数给出错误的结果

  14. 14

    使用Monte Carlo方法并行计算Pi

  15. 15

    使用Sucht OMP在CPU上并行化Monte Carlo

  16. 16

    在Python Monte Carlo方法中使用Gamma函数估算pi

  17. 17

    使用 python Multiprocessing 并行化 Monte Carlo 方法时的问题

  18. 18

    使用scipy.integrate.odeint解决微分方程:“函数调用的结果不是正确的浮点数组。”

  19. 19

    使用scipy.integrate.quad集成伽玛函数

  20. 20

    使用scipy.integrate集成向量字段(numpy数组)

  21. 21

    使用scipy.integrate.odeint覆盖ODE集成中的值

  22. 22

    使用scipy.integrate.odeint时发生TypeError

  23. 23

    使用scipy.integrate.quad集成伽玛函数

  24. 24

    scipy.integrate.fixed_quad可以计算具有功能边界的积分吗?

  25. 25

    为什么 scipy.integrate.quad 返回 0 而不是积分的正确值?

  26. 26

    C++ Monte Carlo 集成:如何在不求和结果的情况下多次运行代码?

  27. 27

    Scipy.integrate 给出奇怪的结果;有最佳实践吗?

  28. 28

    使用Java中随机生成的数据进行pi的Monte Carlo计算

  29. 29

    如何使用scipy.integrate.ode.set_f_params()进行时间相关的参数更改?

热门标签

归档