重要性取樣

2021-09-11 08:40:50 字數 1618 閱讀 9320

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();

先上段**,占個坑。過幾天補上文字說明;

結合新章節深入;

mh取樣演算法推導 重要性取樣小結

最近在看一篇講ssr的ppt,裡面提到了根據ggx分布做重要性取樣,其實之前或多或少的了解過重要性取樣演算法,不過當時沒有認真的總結過這個問題,也沒有想過要認真的推導相關的公式。這篇給文章的主要目的就是給看過的一些文章做個總結,推導一下相關的公式,以免自己會忘記。接下來會分幾個步驟介紹一下與重要性取...

強化學習中的重要性取樣

在之前內容的整理中涉及了一些重要性取樣的內容,在介紹蒙特卡羅離線策略 時有所提及。其中詳細介紹了到底什麼是重要性取樣。這篇博文主要想更加深刻得思考為什麼用的是重要性取樣方法?參考鏈結中一句話說的很好 重要性取樣出現的原因是因為原始分布難以直接取樣,故需要借助乙個簡單 可取樣的分布來計算期望。但強化學...

定時的重要性

2.wm timer訊息 是又定時器發出的訊息 首先我們先建立乙個定時器 函式原型 unit settimer hwnd hwnd,uint nidevent,uint nelapse,timerproc lptimerfunc 要建立定時器,還需要 a.視窗控制代碼 b.選擇識別符號 c.微秒級的...