其他分享
首页 > 其他分享> > 《概率统计》由静向动:随机过程导引

《概率统计》由静向动:随机过程导引

作者:互联网

随机变量与随机过程

在详细介绍完随机变量的内容之后,这一部分我们开始进入到随机过程的部分中来。简单点说,随机过程就是一串随机变量的序列,在这个序列当中,每一个数据都可以被看作是一个随机变量,因此我们在随机过程的概率模型处理过程中,重点关注的就是时间和数据这两方面内容。所以简单地说,随机过程就是一串(有限或无限)随机变量序列。

常见的随机过程建模场景数不胜数,比如:

等等等等,可以说这种例子涵盖了生活中的方方面面。

在讨论随机变量的时候,我们关注的是它的分布、数字特征等等,而此时,对于随机过程,将它们连成一个序列之后,我们的关注点更多的聚焦在序列之间的相关关系、序列整体的长期统计特征以及一些我们所包含的特定事件的发生概率。

随机过程实际场景举例

当然说了这么多,大家肯定感觉很抽象,我们来看几个实际的场景,并用随机过程对其进行建模,同时运用蒙特卡罗方法对其过程进行模拟。

赌博的例子非常普遍,这里我们举一个大家非常熟悉的例子,我们尽量挖掘得更深入一些。

赌徒和庄家对赌抛硬币,如果为正面,本轮赌徒赢,庄家付给赌徒 1 元,结果为反面,本轮赌徒输,赌徒付给庄家 1 元。赌徒有初始赌本 10 元,手上的钱一旦输光则退出赌局,如何来模拟这个赌博过程?

我们首先来分析一下这个过程,赌徒的赌博结果本质上依托于每次抛掷硬币的结果,每一轮赌博就是一个伯努利试验,赢的概率是 p=0.5,赌博的过程就是由这一串伯努利试验构成的伯努利随机过程,每轮赌局中,如果赢则赌本增加 1 元,输则赌本减少 1 元。

当然了,如果对某一个特定的赌徒,一旦开始进入赌局,则最终由每轮赌局结果构成的序列就是唯一的。那么如果我们想观察整个赌博过程的整体特征,我们该怎么办?好办,还是使用之前讲过的蒙特卡罗方法,采用大量的样本,最终观察样本结果的整体特征。

这里,我们为了说明问题,先采用的样本数也就是赌徒数为 10 个,轮数为 100 轮,也就是每个赌徒最多和庄家对赌 100 轮,如果在这个过程中输光了赌本,则提前退出,如果到 100 轮还有赌本,赌局也停止。

import random
from prettytable import PrettyTable


def bet(n: int):
    """
    从0和1之间随机选择,如果为0,赌徒赢,为1,庄家赢
    """
    money = 10
    sample = []

    _ = 0
    for _ in range(1, 101):
        result = random.choice([0, 1])
        if money == 0:
            break
        if result == 0:
            money += 1
        else:
            money -= 1
    sample.extend([n, _, money])
    return sample


pt = PrettyTable(["person", "round", "month"])
for _ in range(1, 11):
    pt.add_row(bet(_))

print(pt)
"""
+--------+-------+-------+
| person | round | month |
+--------+-------+-------+
|   1    |  100  |   4   |
|   2    |   29  |   0   |
|   3    |   65  |   0   |
|   4    |   35  |   0   |
|   5    |  100  |   10  |
|   6    |   39  |   0   |
|   7    |   17  |   0   |
|   8    |  100  |   16  |
|   9    |   75  |   0   |
|   10   |  100  |   14  |
+--------+-------+-------+
"""

我们看到有6个赌徒还没有打满100场就提前输光退场了,剩下的打满100场的4个赌徒中有两个赢了钱、一个没赚没赔、一个赔了钱。当然我们用的样本比较少,每次执行可能结果会有所差别。

当然,我们这里是为了打印出所有的结果,所以样本数选择的比较少。蒙特卡洛方法讲求大的样本量,我们把样本数和轮数都修改一下,并且统计一些指标。我们把赌徒的总人数设置为 1000000 人,轮数设置为 100(我们依次修改了轮数为 100、1000、10000),来观察样本总体的表现。

import random
from prettytable import PrettyTable


def bet(round_number):
    """
    从0和1之间随机选择,如果为0,赌徒赢,为1,庄家赢
    """
    samples = []

    for person in range(1, 10001):
        money = 10
        round = 0
        for round in range(1, round_number + 1):
            if money == 0:
                break
            if (result := random.choice([0, 1])) == 0:
                money += 1
            else:
                money -= 1
        samples.append([round, money])

    return samples


pt = PrettyTable(["总轮数", "输光赌本提前出局的人数", "堵满全场盈利的人数", "堵满全场赔本的人数"])
for round_number in [100, 1000, 10000]:
    """
    100场、1000场、10000场
    """
    pt.add_row([round_number,
                len([_ for _ in bet(round_number) if _[0] < round_number]),
                len([_ for _ in bet(round_number) if _[0] == round_number and _[1] >=10]),
                len([_ for _ in bet(round_number) if _[0] == round_number and _[1] < 10]),
                ])

print(pt)
"""
+--------+------------------------+--------------------+--------------------+
| 总轮数 |  输光赌本提前出局的人数   |  堵满全场盈利的人数 |  堵满全场赔本的人数 |
+--------+------------------------+--------------------+--------------------+
|  100   |          3236          |        5062        |        1705        |
|  1000  |          7548          |        2404        |         97         |
| 10000  |          9197          |        853         |         5          |
+--------+------------------------+--------------------+--------------------+
"""
# 我屮艸芔茻,程序执行的好慢啊。我还以为死循环了,仔细一看,代码正常啊
# 等了一会发现,发现真的只是跑的慢,不得不吐槽python。

从结果中不难发现,这种和庄家 1:1 的对赌,随着轮数的增加,基本上都破产被收割了。换句话说,哪怕庄家不出千,输赢概率各半,赌的越久,基本上都是输光破产走人,原因是什么?原因是庄家的资金量是无穷的。

两类重要的随机过程概述

随机过程的种类非常多,应用也非常广,上面的例子中,我们通过赌博的例子进行了直观的随机过程模拟和展示,那么下面,我们回归到经典的模型中来。

有两类重要且常用的随机过程:到达过程马尔科夫过程

第一类:到达过程。

即关注的是某种“到达”的事件是否发生,比如在一个服务窗口前,顾客的到达时刻;十字路口车辆依次通过的时刻,这里面我们重点关注的就是相邻两次到达时刻之间的时间(我们称之为相邻间隔时间)为相互独立的随机变量的模型。

这里面又细分为了两类情况:在到达时间为离散的情况下,随机过程为伯努利过程,相邻间隔时间服从几何分布。另一类是相对应的,到达时间为连续的情况下,随机过程为泊松过程,相邻间隔时间服从指数分布。

这一类过程最明显的特征就是相邻间隔时间相互独立,且随机过程无记忆性,比如该窗口上一时刻来没来一个顾客,都不对下一个时刻是否来顾客提供信息,包括之前举的赌博的例子也是这样,这一轮赌徒是赢还是输,并不对下一轮赌局的输赢带来任何影响。

而与之相对的,就是未来的数据与历史数据有关联、有联系,比如股价变化。未来的股价是和历史股价有关联关系的。在这一类随机过程里,有一种模型最为重要,即我们要介绍的第二类:马尔科夫过程。未来的数据只依赖于当前的数据,而与过去的历史数据无关。马尔科夫过程非常重要,我们将重点花篇幅详细讨论。

标签:导引,由静,number,赌徒,随机,向动,100,过程,round
来源: https://www.cnblogs.com/traditional/p/12607561.html