重要性采样原理及实现

原理:

重要性采样主要用于难以直接采样的数据分布上,采样是指从已知的某个分布采样一些数据进行后续运算,但是数据分布比较复杂不容易进行采样,针对这种问题使用蒙特卡罗法,例如:

复杂的概率密度函数p(x),求解随机变量基于此概率下的某个数学期望,根据蒙特卡罗法转换为

虽然p(x)比较复杂,但是我们可以对上面的公式进行一些变换,使用常见的分布采样,复杂的采样分布为p(x),另一个简单的可采样且定义域与p(x)相同的概率密度函数q(x),因此可以得到:

代码

  1. #encoding=utf-8  
  2.   
  3. """ 
  4.     created on  2018-08-12 
  5.     @author wt 
  6.     Description:重要性采样表示从某一个分布获取某些数据,并利用这些数据完成更多的运算 
  7.     当某一个密度函数很复杂的时候可以采用近似他的分布代替它 
  8. """  
  9.   
  10. import numpy as np  
  11. import math  
  12.   
  13. """x服从的分布"""  
  14. def gaussian(x,u,sigma):  
  15.     return math.exp(-(x-u)**2/(2*sigma*sigma))/math.sqrt(2*math.pi*sigma*sigma)  
  16.   
  17. def importance_sampling(sigma,sample_sigma):  
  18.   
  19.     """作用相当于取f(x)"""  
  20.     origin = []  
  21.     for i in range(100000):  
  22.         a = np.random.normal(1.0,sigma)  
  23.     origin.append(a)  
  24.   
  25.     sample = []  
  26.     for i in range(100000):  
  27.         """计算f(x)的值"""  
  28.         fx = np.random.normal(1.0,sample_sigma)  
  29.   
  30.         """原始复杂分布为px,现找同分布的q(x)来代替"""  
  31.         qx = gaussian(a,1.0,sample_sigma)  
  32.         px = gaussian(a,1.0,sigma)  
  33.     sample.append(fx*px/qx)  
  34.   
  35.     origin = np.array(origin)  
  36.     sample = np.array(sample)  
  37.     print(np.mean(origin),np.std(origin))  
  38.     print(np.mean(sample),np.std(sample))  
  39.   
  40. importance_sampling(1.0,1.0)  
  41. importance_sampling(1.0,0.5)  
  42. importance_sampling(1.0,2)  
  43.   
  44. xs = np.linspace(-10,10,101)  
  45. y1 = [gaussian(x,1.0,1.0) for x in xs]  
  46. y2 = [gaussian(x,1.0,0.5) for x in xs]  
  47. y3 = [gaussian(x,1.0,2) for x in xs]  
  48.   
  49. import matplotlib.pyplot as plt  
  50.   
  51. fig = plt.figure(figsize=(8,5))  
  52. plt.plot(xs,y1,label='sigma=1.0')  
  53. plt.plot(xs,y2,label='sigma=0.5',linestyle=':')  
  54. plt.plot(xs,y3,label='sigma=2.0',linestyle='--')  
  55. plt.legend()  
  56. plt.show()  
  57. 结果:

  1. 方差更应该使用1.0和2.0的分布,方差取0.5时出现采样分布不均匀情况,结果略差一些
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值