生活随笔
收集整理的這篇文章主要介紹了
重要性采样原理及实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原理:
重要性采樣主要用于難以直接采樣的數據分布上,采樣是指從已知的某個分布采樣一些數據進行后續運算,但是數據分布比較復雜不容易進行采樣,針對這種問題使用蒙特卡羅法,例如:
復雜的概率密度函數p(x),求解隨機變量基于此概率下的某個數學期望,根據蒙特卡羅法轉換為
雖然p(x)比較復雜,但是我們可以對上面的公式進行一些變換,使用常見的分布采樣,復雜的采樣分布為p(x),另一個簡單的可采樣且定義域與p(x)相同的概率密度函數q(x),因此可以得到:
代碼:
#encoding=utf-8????"""?????created?on??2018-08-12?????@author?wt?????Description:重要性采樣表示從某一個分布獲取某些數據,并利用這些數據完成更多的運算?????當某一個密度函數很復雜的時候可以采用近似他的分布代替它?"""????import?numpy?as?np??import?math????"""x服從的分布"""??def?gaussian(x,u,sigma):??????return?math.exp(-(x-u)**2/(2*sigma*sigma))/math.sqrt(2*math.pi*sigma*sigma)????def?importance_sampling(sigma,sample_sigma):????????"""作用相當于取f(x)"""??????origin?=?[]??????for?i?in?range(100000):??????????a?=?np.random.normal(1.0,sigma)??????origin.append(a)????????sample?=?[]??????for?i?in?range(100000):??????????"""計算f(x)的值"""??????????fx?=?np.random.normal(1.0,sample_sigma)????????????"""原始復雜分布為px,現找同分布的q(x)來代替"""??????????qx?=?gaussian(a,1.0,sample_sigma)??????????px?=?gaussian(a,1.0,sigma)??????sample.append(fx*px/qx)????????origin?=?np.array(origin)??????sample?=?np.array(sample)??????print(np.mean(origin),np.std(origin))??????print(np.mean(sample),np.std(sample))????importance_sampling(1.0,1.0)??importance_sampling(1.0,0.5)??importance_sampling(1.0,2)????xs?=?np.linspace(-10,10,101)??y1?=?[gaussian(x,1.0,1.0)?for?x?in?xs]??y2?=?[gaussian(x,1.0,0.5)?for?x?in?xs]??y3?=?[gaussian(x,1.0,2)?for?x?in?xs]????import?matplotlib.pyplot?as?plt????fig?=?plt.figure(figsize=(8,5))??plt.plot(xs,y1,label='sigma=1.0')??plt.plot(xs,y2,label='sigma=0.5',linestyle=':')??plt.plot(xs,y3,label='sigma=2.0',linestyle='--')??plt.legend()??plt.show()??結果:
方差更應該使用1.0和2.0的分布,方差取0.5時出現采樣分布不均勻情況,結果略差一些
總結
以上是生活随笔為你收集整理的重要性采样原理及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。