zoukankan      html  css  js  c++  java
  • 白话马尔可夫链

    1. 古板的定义

      马尔可夫链因俄国数学家Andrey Andreyevich Markov得名,为状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备“无记忆”的性质:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。这种特定类型的“无记忆性”称作马尔可夫性质。马尔科夫链作为实际过程的统计模型具有许多应用。

    看完这个定义我的表情是下面这样的

    看过大佬的一些通俗解释的例子:   假如每天的天气是一个状态:  比如昨天是阴天, 今天是晴天,则明天的天气是什么只和今天的天气(晴天)有关,和今天之前的任何天气都没有关系.(就是当前的状态只和前一个状态有关系,和别的任何状态都无关)

    所以根据定义可以知道数学定义的公式如下:

     2. 举个例子解释马尔可夫链

    这个例子是参考一个博客的:(链接等下我会发在底部)

    这个例子是用来描述股市如下图:

     

    总共是三个状态:  Bull market: 表示牛市       Bear market 表示熊市     Stagnant表示横盘 

    接下来根据图我们可以定义状态转移矩阵 

    从一个状态转移为另一个状态的表示为P(i,j) 表示从状态 i 转变为状态 j 的概率  其中Bull market 表示为状态 0  Bear market 表示为状态1 Stagnant表示为状态2 

    接下来是一个有意思的事情:

    我们假设现在的市场是牛市: 状态矩阵为[1,0,0] 

    import numpy as np
    def markov():
        init_array = np.array([1,0,0])
        transfer_matrix = np.array([[0.9, 0.075, 0.025],
                                   [0.15, 0.8, 0.05],
                                   [0.25, 0.25, 0.5]])
        restmp = init_array
        for i in range(25):
            res = np.dot(restmp, transfer_matrix)
            print(res)
            restmp = res
    markov()

    则输出的结果为:

     1 [0.25 0.25 0.5 ]
     2 [0.3875  0.34375 0.26875]
     3 [0.4675  0.37125 0.16125]
     4 [0.51675  0.372375 0.110875]
     5 [0.54865  0.364375 0.086975]
     6 [0.570185  0.3543925 0.0754225]
     7 [0.585181  0.3451335 0.0696855]
     8 [0.5958543  0.33741675 0.06672895]
     9 [0.60356362 0.33130471 0.06513167]
    10 [0.60918588 0.32659396 0.06422016]
    11 [0.61331143 0.32301915 0.06366943]
    12 [0.61635051 0.32033103 0.06331846]
    13 [0.61859473 0.31832073 0.06308454]
    14 [0.6202545  0.31682232 0.06292318]
    15 [0.62148319 0.31570774 0.06280907]
    16 [0.6223933 0.3148797 0.062727 ]
    17 [0.62306768 0.31426501 0.06266732]
    18 [0.62356749 0.31380891 0.0626236 ]
    19 [0.62393798 0.31347059 0.06259143]
    20 [0.62421263 0.31321968 0.0625677 ]
    21 [0.62441624 0.31303361 0.06255015]
    22 [0.62456719 0.31289565 0.06253716]
    23 [0.62467911 0.31279335 0.06252754]
    24 [0.62476209 0.3127175  0.06252042]
    25 [0.62482361 0.31266126 0.06251514]

    在第20次之后值就趋于一个固定的值     [0.62421263 0.31321968 0.0625677 ]

    然后假设现在是熊市: 即状态为[0,1,0] 

    import numpy as np
    def markov():
        init_array = np.array([0,1,0])
        transfer_matrix = np.array([[0.9, 0.075, 0.025],
                                   [0.15, 0.8, 0.05],
                                   [0.25, 0.25, 0.5]])
        restmp = init_array
        for i in range(25):
            res = np.dot(restmp, transfer_matrix)
            print(res)
            restmp = res
    markov()

    结果如下:

     1 [0.15 0.8  0.05]
     2 [0.2675  0.66375 0.06875]
     3 [0.3575  0.56825 0.07425]
     4 [0.42555  0.499975 0.074475]
     5 [0.47661  0.450515 0.072875]
     6 [0.514745  0.4143765 0.0708785]
     7 [0.5431466 0.3878267 0.0690267]
     8 [0.56426262 0.36825403 0.06748335]
     9 [0.5799453  0.35379376 0.06626094]
    10 [0.59158507 0.34309614 0.06531879]
    11 [0.60022068 0.33517549 0.06460383]
    12 [0.60662589 0.3293079  0.06406621]
    13 [0.61137604 0.32495981 0.06366415]
    14 [0.61489845 0.32173709 0.06336446]
    15 [0.61751028 0.31934817 0.06314155]
    16 [0.61944687 0.3175772  0.06297594]
    17 [0.62088274 0.31626426 0.062853  ]
    18 [0.62194736 0.31529086 0.06276178]
    19 [0.6227367  0.31456919 0.06269412]
    20 [0.62332193 0.31403413 0.06264394]
    21 [0.62375584 0.31363743 0.06260672]
    22 [0.62407756 0.31334332 0.06257913]
    23 [0.62431608 0.31312525 0.06255867]
    24 [0.62449293 0.31296357 0.0625435 ]
    25 [0.62462404 0.3128437  0.06253225]

    在20次之后结果也会趋近一个值  [0.62407756 0.31334332 0.06257913]

    通过使用转换矩阵,可以计算市场从持平到牛市所需的平均周数等。使用转换概率,稳态概率表明,在给定的周数中,62.5%的周将处于牛市中,31.25%的周将处于熊市中,6.25%的周将停滞,因为:

    由此可知马尔科夫链又 细致平稳的性质(就是能收敛)

    3.马尔可夫链细致平稳的条件 

      3.1 可能的状态数是有限的 

     3.2 状态间的转移概率需要不变( 状态转移矩阵不要变)

     3.3 状态之间可以互相转换

     3.4 状态不能是简单的循环 (比如状态是两个  互相循环) 

    针对3.4 举个例子: 

     假设只有两个状态互相循环转变: 

    import numpy as np
    def markov():
        init_array = np.array([0,1])
      
        restmp = init_array
        transfer_matrix1=[[0.1,0.2],
                         [0.4,0.3]]
        for i in range(25):
            res = np.dot(restmp, transfer_matrix1)
            print(res)
            restmp = res
    markov()

    得到结果如下: 

     1 [0.4 0.3]
     2 [0.16 0.17]
     3 [0.084 0.083]
     4 [0.0416 0.0417]
     5 [0.02084 0.02083]
     6 [0.010416 0.010417]
     7 [0.0052084 0.0052083]
     8 [0.00260416 0.00260417]
     9 [0.00130208 0.00130208]
    10 [0.00065104 0.00065104]
    11 [0.00032552 0.00032552]
    12 [0.00016276 0.00016276]
    13 [8.13802084e-05 8.13802083e-05]
    14 [4.06901042e-05 4.06901042e-05]
    15 [2.03450521e-05 2.03450521e-05]
    16 [1.0172526e-05 1.0172526e-05]
    17 [5.08626302e-06 5.08626302e-06]
    18 [2.54313151e-06 2.54313151e-06]
    19 [1.27156576e-06 1.27156576e-06]
    20 [6.35782878e-07 6.35782878e-07]
    21 [3.17891439e-07 3.17891439e-07]
    22 [1.58945719e-07 1.58945719e-07]
    23 [7.94728597e-08 7.94728597e-08]
    24 [3.97364299e-08 3.97364299e-08]
    25 [1.98682149e-08 1.98682149e-08]

     会发现完全没有收敛

    参考博客: 

    https://blog.csdn.net/bitcarmanlee/article/details/82819860

    https://www.jiqizhixin.com/graph/technologies/fdebe132-cd51-43ba-8bda-a42abc478cbb

     

  • 相关阅读:
    匀速不间断旋转动画
    调用底层不能直接访问的类和方法
    当SD卡拔出时,返回首页,栈中的activity都要清除,只留下首页的activity
    Android 视频播放器切换到下个视频时残留上个视频画面的解决办法
    监听SD卡状态
    Android之SeekBar定制
    setRequestedOrientation设置屏幕方向
    【初级算法】15. 有效的字母异位词
    【初级算法】14. 字符串中的第一个唯一字符
    【初级算法】13. 颠倒整数
  • 原文地址:https://www.cnblogs.com/qiujichu/p/12875178.html
Copyright © 2011-2022 走看看