基于Pytorch的强化学习(DQN)之蒙特卡罗算法

目录

1. 大数定律

2. 估算圆周率

2.1 公式

2.2 代码

2. 估算定积分

3.1 公式

3.2 代码


1. 大数定律

大数定律是蒙特卡罗算法的理论依据,大数定律的内容如下

在随机事件的大量重复出现中,往往呈现几乎必然的规律,这个规律就是大数定律。

我们来简单看看伯努利大数定律的严格数学表达:

\mun次独立试验中事件A发生的次数,且事件A在每次试验中发生的概率为p,则对任意正数\varepsilon

\lim_{n\rightarrow\infty}P(|\frac{\mu_n}{n}-p|<\varepsilon )=1

通俗地说,这个定理就是在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。

2. 估算圆周率

蒙特卡罗算法可以用来估计面积,而圆的面积和\pi有关,所以我们也可以用蒙特卡罗算法来估计\pi的值。

 基于Pytorch的强化学习(DQN)之蒙特卡罗算法_第1张图片

 

2.1 公式

我们来在正方形内撒n个点,记落在圆内的点的个数为m个,记点落在圆内的概率为p,那么由古典概型我们知道p=\frac{S_{circular}}{S_{square}}=\frac{\pi}{4},由伯努利大数定律我们知道 p=\frac{m}{n}\quad (n\rightarrow\infty),于是我们得到 \pi=\frac{4m}{n} .

2.2 代码

代码基本思路就是生成大量随机数,判断是否在圆内得到m,直接代公式就行。

import random


def pai():
    n = 1000000
    r = 1.0
    a, b = (0.0, 0.0)
    x_neg, x_pos = a - r, a + r
    y_neg, y_pos = b - r, b + r

    m = 0
    for i in range(0, n):
        x = random.uniform(x_neg, x_pos)
        y = random.uniform(y_neg, y_pos)
        if x*x + y*y <= 1.0:
            m += 1

    print 4*m/float(n)

2. 估算定积分

蒙特卡罗算法还常用于计算定积分的近似值。

3.1 公式

首先由积分第一中值定理我们得到:\int_{a}^bf(x)dx=\xi (b-a),这里的 \xi 就相当于这个区间上所有函数值的平均值,我们现在在x轴上随机取n个点(x_1,x_2,...,x_n),计算对应函数值(f(x_1),f(x_2),...f(x_n)),计算平均值\frac{1}{n}\sum_{i=1}^nf(x_i),于是我们有 \frac{1}{n}\sum_{i=1}^nf(x_i)=\xi\quad (n\rightarrow\infty),最后得到 \int_{a}^bf(x)dx=\xi (b-a)=\frac{1}{n}\sum_{i=1}^nf(x_i)(b-a)

3.2 代码

我们以\int_0^1(x^3+2x^2+5)dx 为例。

def integral():
    n = 1000000
    x_min, x_max = 0.0, 1.0
    y_min, y_max = 5.0, 8.0

    m = 0
    for i in range(0, n):
        x = random.uniform(x_min, x_max)
        y = random.uniform(y_min, y_max)
        # x*x*x+2*x*x+5 > y,
        if x*x*x+2*x*x+5 > y:
            m += 1

    integral_value = m / float(n)
    print integral_value

你可能感兴趣的:(深度学习,神经网络)