布朗运动过程、复合泊松过程及马尔科夫链的离散模拟
前言
本篇文章主要聊一聊常见的随机过程的模拟(暂不涉及机器学习数据挖掘等),随机过程的相关理论还是非常深奥的,比如带跳的多维伊藤公式,鞅表示定理,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}) ΔZ∼N(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()
**
二:泊松过程模拟
- 概括
我们在 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+1−Ei,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()
三:复合泊松过程与补偿泊松过程
理解了一般泊松过程后,复合和补偿是相当容易的两个拓展过程。
- 复合泊松过程
泊松事件计数值依然为 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) Yi∼U(0,1) 即可,相应代码在上述泊松过程中进行简单修改即可(参数days依旧为60),我们不再重复编写,直接作出模拟图如下:
对于图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×M,rn 为马氏链在 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+δ=j∣rt=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+δ=j∣rt=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δQ−1, 当 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=1i1−1Pi0j(δ)≤ξ1≤∑j=1i1Pi0j(δ) 时,有 r 1 δ = i 1 ∈ S − { M } r_1^\delta=i_1\in S-\{M\} r1δ=i1∈S−{ 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=1M−1Pi0j(δ)≤ξ1时,有r1δ=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=1i2−1Pi1δj(δ)≤ξ2≤∑j=1i2Pi1δj(δ)
时,有 r 2 δ = i 2 ∈ S − { M } r_2^\delta=i_2\in S-\{M\} r2δ=i2∈S−{ 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=1M−1Pi1δ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我们发现随着 δ \delta δ 变小,马氏链状态转移的越少,由于转移速率矩阵到转移概率矩阵公式,我们知道 δ \delta δ 越小,转移概率矩阵的对角值越大,越接近1,再由马氏链定义可知,状态之间的切换概率越小。
五:总结
本文主要讲述了一些随机过程中最常见的几种随机过程的离散模拟,这些常见过程在实际中运用还是相当广泛的,我们将在下一篇文章继续学习有关机器学习数据挖掘的内容,望与有兴趣的朋友多多交流。