重要性采样

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

def f(x):
    return np.sin(x) * x;

def intf(x1, x2):
    return (np.sin(x2)- x2 * np.cos(x2)) - (np.sin(x1) - x1 * np.cos(x1));

def p(x, mu, sig):
    return (1 / np.sqrt(2 * np.pi * sig ** 2)) * np.exp(-(x - mu) ** 2 /(2.0 * sig ** 2));

def intp(x1, x2, mu, sig):
    return (norm.cdf(x2 - mu, scale = sig) - norm.cdf(x1 - mu, scale = sig));

def plot(xmin, xmax, mu, sig):
    x = np.linspace(xmin, xmax, 1000);
    plt.subplot(1,2,1);
    plt.plot(x, f(x), 'b', label = u'Original $x\sin(x)$');
    plt.plot(x, p(x, mu, sig), 'r', label = u'Importance Sampling Function: Normal');
    plt.xlabel('x');
    plt.legend();
    plt.show();

def demo():
    # Example: Calculate ∫sin(x)xdx
    mu = 2;
    sig =.7;
    xmax = np.pi 
    xmin = 0
    N = 1000

    plot(xmin, xmax, mu, sig);
    answer = intf(xmin, xmax);
    
    x = np.random.uniform(low = xmin, high = xmax, size = N)
    monteCarlo = (xmax - xmin) * np.mean(f(x))

    xis = mu + sig * np.random.randn(N, 1);
    xis = xis[(xis < xmax) & (xis > xmin)];#概率密度函数在采样区间[0 pi]上的积分需要等于1
    normal = intp(xmin, xmax, mu, sig)
    importanceSampling =np.mean(f(xis) / p(xis, mu, sig)) * normal  # 因此,此处需要除一个系数即p(x)在[0 pi]上的积分
    
    print(monteCarlo);
    print(importanceSampling);
    print(answer);

if __name__ == '__main__':
    demo();

先上段代码,占个坑。过几天补上文字说明;

结合新章节深入;

https://www.jb51.net/article/130511.htm

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值