布朗运动过程、复合泊松过程及马尔科夫链的离散模拟

前言

本篇文章主要聊一聊常见的随机过程的模拟(暂不涉及机器学习数据挖掘等),随机过程的相关理论还是非常深奥的,比如带跳的多维伊藤公式,鞅表示定理,Mallivian微积分等等,这篇文章将暂只涉及浅显知识点的概括,重点是模拟这些常见的过程,望对有兴趣的朋友提供些帮助,望志同道合的朋友在一起多多交流。
在这里插入图片描述
虽曰如云,匪我思存,写作不易,走过路过的朋友们,别忘了点赞收藏加关注一下哈,谢谢!

一:布朗运动模拟

  • 概括
    假设 ε ∼ N ( u , σ 2 ) \varepsilon\sim N(u,\sigma^2) εN(u,σ2),其中 μ , σ \mu,\sigma μ,σ分别是正态分布的均值和标准差,当 μ = 0 , σ = 1 \mu=0,\sigma=1 μ=0σ=1 时为标准正态分布。令 Δ Z = ε Δ t \Delta Z=\varepsilon\sqrt{\Delta t} ΔZ=εΔt ,则标准正态下有 Δ Z ∼ N ( 0 , Δ t ) \Delta Z \sim N(0,\sqrt{\Delta t}) ΔZN(0,Δt )

  • 代码模拟

def bm(days):
    dt = 1 / days
    rand_nums = np.random.normal(0, 1, days)
    shock = rand_nums * np.power(dt,0.5)
    W = np.cumsum(shock)
    W = list(W)
    W.insert(0,0)
    return W
days = 365
fig = plt.figure(figsize=(15,8))
plt.plot(bm(days),label='轨迹1')
plt.plot(bm(days),label='轨迹2')
plt.plot(bm(days),label='轨迹3')
plt.legend(fontsize=18)
plt.tick_params(labelsize=15)
plt.show()

**
在这里插入图片描述

图1

二:泊松过程模拟

  • 概括
    我们在 t = 0 t=0 t=0 时,令泊松事件计数值 N t 0 = 0 N_{t_0}=0 Nt0=0 ,定义指数分布随机数 E = − 1 λ l n ( U ) E=-\frac{1}{\lambda}ln(U) E=λ1ln(U) ,其中 λ \lambda λ 为泊松强度是一常数,可以理解为单位时间内发生的次数,很明显强度越大,我们到达指定发生的次数的时间就越短 U U U 为均匀分布随机数(下同)。
    我们划分 0 = t 0 < t 1 < . . . < t n = T , Δ t i = t i + 1 − E i , N t i + 1 = N t i + 1 0=t_0<t_1<...<t_n=T,\Delta t_i = t_{i+1}-E_i , N_{t_{i+1}}=N_{t_{i}}+1 0=t0<t1<...<tn=TΔti=ti+1Ei,Nti+1=Nti+1 ,直到时间为 T T T 时结束或者计数达到。
  • 代码模拟
def pm(days,lamd):
    rand_nums = np.random.uniform(0,1,days)
    N = np.ones((1,days))
    E = - np.log(rand_nums) / lamd
    P = np.cumsum(N)
    T = np.cumsum(E)
    P = list(P)
    T = list(T)
    P.insert(0,0)
    T.insert(0,0)
    return P,T
fig = plt.figure(figsize=(15,8))
days = 60
res1 = pm(days,1)
res2 = pm(days,3)
res3 = pm(days,5)
plt.step(res1[1], res1[0], lw=2, label='强度为1')
plt.step(res2[1], res2[0], lw=2, label='强度为3')
plt.step(res3[1], res3[0], lw=2, label='强度为5')
plt.ylabel('计数次数',fontsize=15)
plt.xlabel('时间',fontsize=15)
plt.legend(fontsize=18)
plt.tick_params(labelsize=15)
plt.show()

在这里插入图片描述

图2

三:复合泊松过程与补偿泊松过程

理解了一般泊松过程后,复合和补偿是相当容易的两个拓展过程。

  • 复合泊松过程

泊松事件计数值依然为 N t N_t Nt ,强度为 λ \lambda λ ,再令 Y 1 , Y 2 , . . . Y n Y_1,Y_2,...Y_n Y1,Y2,...Yn 为独立同分布随机变量,那么我们有 X t = ∑ i = 1 N t Y i ( t > 0 ) X_t=\sum_{i=1}^{N_t}{Y_i}(t>0) Xt=i=1NtYi(t>0) 为复合泊松过程。

  • 补偿泊松过程
    我们记符号 N ~ t \tilde{N}_t N~t 为补偿泊松过程,则有 N ~ t = N t − λ t \tilde{N}_t=N_t-\lambda t N~t=Ntλt
  • 模拟上述两个过程
    基于模拟考虑,我们简单令 Y i ∼ U ( 0 , 1 ) Y_i\sim U(0,1) YiU(0,1) 即可,相应代码在上述泊松过程中进行简单修改即可(参数days依旧为60),我们不再重复编写,直接作出模拟图如下:
    在这里插入图片描述
图3

在这里插入图片描述

图4

对于图4,我们从一般泊松过程期望出发( E ( N t ) = λ t E(N_t)=\lambda t E(Nt)=λt ,这里不再深入展开),那么对于补偿泊松过程,理论上在整个过程中,其值是在0附近上下扰动

四:离散马尔科夫链模拟

  • 概括
    设离散马氏链 S = { r n δ , n = 0 , 1 , 2 , . . . , M } S=\{r_n^\delta,n=0,1,2,...,M\} S={ rnδ,n=0,1,2,...,M} ,转移速率矩阵 Q = ( q i j ) M × M , r n Q=(q_{ij})_{M\times M}, r_n Q=(qij)M×Mrn 为马氏链在 n n n 时的状态值, δ \delta δ
    为离散步长大小,那么我们定义转移概率矩阵如下: 当 i ≠ j i\ne j i=j时,有 P ( r t + δ = j ∣ r t = i ) = q i j δ + o ( δ ) P(r_{t+\delta}=j|r_t=i)=q_{ij}\delta+o(\delta) P(rt+δ=jrt=i)=qijδ+o(δ) , 当 i = j i=j i=j 时,有
    P ( r t + δ = j ∣ r t = i ) = 1 + q i j δ + o ( δ ) P(r_{t+\delta}=j|r_t=i)=1+q_{ij}\delta+o(\delta) P(rt+δ=jrt=i)=1+qijδ+o(δ) , 这里
    δ > 0 , q i j > 0 \delta>0,q_{ij}>0 δ>0,qij>0 并且当 i ≠ j i\ne j i=j 时有 q i i = − ∑ i ≠ j q i j q_{ii}=-\sum_{i\ne j}{q_{ij}} qii=i=jqij
    ,很明显由泰勒定理知,当 δ → 0 \delta\rightarrow0 δ0 时,转移概率矩阵也可以定义为 当 i ≠ j i\ne j i=j
    时, P = e δ Q − 1 P=e^{\delta Q}-1 P=eδQ1, 当 i = j i=j i=j 时, P = e δ Q P=e^{\delta Q} P=eδQ

最后定义马氏链如下:

  • r 0 = i 0 r_0=i_0 r0=i0 为初始状态,同时生成服从$ [0,1]$ 之间的均匀分布随机数 ξ 1 \xi_1 ξ1 ,定义下个状态值如下 当
    ∑ j = 1 i 1 − 1 P i 0 j ( δ ) ≤ ξ 1 ≤ ∑ j = 1 i 1 P i 0 j ( δ ) \sum_{j=1}^{i_1-1}{P_{i_0j}(\delta)}\leq \xi_1\leq \sum_{j=1}^{i_1}{P_{i_0j}(\delta)} j=1i11Pi0j(δ)ξ1j=1i1Pi0j(δ) 时,有 r 1 δ = i 1 ∈ S − { M } r_1^\delta=i_1\in S-\{M\} r1δ=i1S{ M}
    , 当 ∑ j = 1 M − 1 P i 0 j ( δ ) ≤ ξ 1 时 , 有 r 1 δ = M \sum_{j=1}^{M-1}{P_{i_0j}(\delta)}\leq\xi_1 时,有 r_1^\delta=M j=1M1Pi0j(δ)ξ1r1δ=M

  • 通常我们令 ∑ j = 1 0 P i 0 j ( δ ) = 0 \sum_{j=1}^{0}{P_{i_0j}(\delta)}=0 j=10Pi0j(δ)=0接着再生成一个服从 [ 0 , 1 ] [0,1] [0,1]之间的均匀分布随机数 ξ 2 \xi_2 ξ2来计算 r 2 h r_2^h r2h , 当 ∑ j = 1 i 2 − 1 P i 1 δ j ( δ ) ≤ ξ 2 ≤ ∑ j = 1 i 2 P i 1 δ j ( δ ) \sum_{j=1}^{i_2-1}{P_{i_1^\delta j}(\delta)}\leq\xi_2\leq \sum_{j=1}^{i_2}{P_{i_1^\delta j}(\delta)} j=1i21Pi1δj(δ)ξ2j=1i2Pi1δj(δ)
    时,有 r 2 δ = i 2 ∈ S − { M } r_2^\delta=i_2\in S-\{M\} r2δ=i2S{ M} , 当 ∑ j = 1 M − 1 P i 1 δ j ( δ ) ≤ ξ 2 \sum_{j=1}^{M-1}{P_{i_1^\delta j}(\delta)}\leq\xi_2 j=1M1Pi1δj(δ)ξ2 时,有 r 2 δ = M r_2^\delta=M r2δ=M 。 接着重复上面步骤就可以得到离散时间的马氏链

    S = { r n δ , n = 0 , 1 , 2 , . . . , M } S=\{r_n^\delta,n=0,1,2,...,M \} S={ rnδ,n=0,1,2,...,M}

  • 代码模拟

def markov_m(days,delta):

    original_value = 1## 设置初始状态
    r = np.array([[-1, 0.1, 0.9], [0.05, -2, 1.95], [2, 3, -5]])  ###根据定义随意给的转移速率矩阵
    p = r * delta
    for i in range(r.shape[1]):
        p[i, i] = 1 + p[i, i]
    print(p)
    U = np.random.uniform(0,1,days)
    q = np.zeros((1,days))

    # P = np.exp(delta * r) - 1
    # for i in range(r.shape[1]):
    #     P[i, i] = 1 + P[i, i]
    # print(P)###delta越小,P跟p越接近

    for i in range(days):
        u = U[i]
        v_temp = original_value
        q[:,i] = v_temp
        original_value = 1
        s = 0
        while original_value <= p.shape[1] and u > s:
            s = s + p[v_temp - 1, original_value - 1]###概率值叠加
            original_value = original_value + 1###矩阵列索引变大
        original_value = original_value - 1##由于开始original_value =1,所以要减1
    return q.tolist()[0]
fig = plt.figure(figsize=(18,8))
days = 1000
x = [i for i in range(days)]
plt.tick_params(labelsize=15)
plt.subplot(1,3,1)
plt.ylim([0.5,3.5])
plt.ylabel('状态值',fontsize=15)
plt.step(x,markov_m(days,0.1),label='delta=0.1')
plt.legend(fontsize=15)
plt.subplot(1,3,2)
plt.ylim([0.5,3.5])
plt.ylabel('状态值',fontsize=15)
plt.step(x,markov_m(days,0.01),label='delta=0.01')
plt.legend(fontsize=15)
plt.subplot(1,3,3)
plt.ylim([0.5,3.5])
plt.ylabel('状态值',fontsize=15)
plt.step(x,markov_m(days,0.001),label='delta=0.001')
plt.legend(fontsize=15)
plt.ylim([0.5,3.5])
plt.show()

在这里插入图片描述

图5

从图5我们发现随着 δ \delta δ 变小,马氏链状态转移的越少,由于转移速率矩阵到转移概率矩阵公式,我们知道 δ \delta δ 越小,转移概率矩阵的对角值越大,越接近1,再由马氏链定义可知,状态之间的切换概率越小。

五:总结

本文主要讲述了一些随机过程中最常见的几种随机过程的离散模拟,这些常见过程在实际中运用还是相当广泛的,我们将在下一篇文章继续学习有关机器学习数据挖掘的内容,望与有兴趣的朋友多多交流。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43577256/article/details/120068058
今日推荐