GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1665|回复: 22
收起左侧

[技术交流] 【Python】【原创】马尔可夫链与动态行为和长期行为分析

[复制链接] |关注本帖

邪恶的面具海盗弯钩神秘的红茶冒险用绷带魔法石碑箭术卷轴质量效应三部曲

     楼主| 白冥 发表于 2025-2-10 05:50:20 | 显示全部楼层 |阅读模式 <
    本帖最后由 白冥 于 2025-2-11 02:13 编辑

    概述      

            在生活中,一个离散系统可能有三种可能的结局,一种是永远在不停地变化,没有止息;一种是逐渐稳定,最终定格在遥远的明天;还有一种摇摆不定,振荡不止,似曾相识的昨日
    不期而至。马尔可夫链便是这样的存在。
            本贴重点讨论马尔可夫链状态的可达性、类划分、首达概率、常返与瞬过、周期性等问题,并讨论平稳分布的概念。
            本帖代码经过重构,因此类结构和方法全部列出。代码和板书均由本人写就。

    技术系列贴      
            马尔可夫链(1):马尔可夫链与马尔可夫性质

    主要功能      
            1)结构分解:使用互通性将转移图分解成多个互不干扰、彼此独立的环境进行局部性质的分析。
            2)动态行为分析:通过研究转移图的常返性和周期性间接测试系统的动态性质。
            3)长期稳态研究:通过局部规律模拟状态的长期分布。


    类结构与方法      
            Markov_chain 类
                ├ __init__ 方法
                ├ _build_P 方法
                ├ _get_classes 方法
                ├ is_irreducible 方法
                ├ _is_recurring_class 方法
                ├ get_recurring_classes 方法
                ├ _mul 方法
                ├ _get_period 方法
                ├ get_all_period_of_classes 方法
                └ get_stationary_distribution 方法


    源代码      
    1. from math import gcd
    2. from math import inf as INFTY
    3. class Markov_chain:
    4.     def __init__(self, status:List[int],  cpd:Dict[Tuple[int, int],float]):
    5.         self._status=status
    6.         self._P=self._build_P(status, cpd)
    7.     def _build_P(self, cpd):
    8.         n=len(status)
    9.         P=[[0]*n for _ in range(n)]
    10.         for e,p in cpd.items():
    11.             s_0,s_1=e
    12.             P[s_0][s_1]=p
    13.         return P
    14.     def _get_classes(self):
    15.         n = len(self._P)
    16.         reachable = [[self._P[i][j]>0 for j in range(n)] for i in range(n)]
    17.         for k in range(n):
    18.             for i in range(n):
    19.                 for j in range(n):
    20.                     reachable[i][j] = reachable[i][j] or (reachable[i][k] and reachable[k][j])
    21.         mutual = [[reachable[i][j] and reachable[j][i] for j in range(n)] for i in range(n)]
    22.         visited = [False]*n
    23.         classes = []
    24.         for i in range(n):
    25.             if visited[i]: continue
    26.             current_class=[i]
    27.             visited[i]=True
    28.             for j in range(n):
    29.                 if mutual[i][j]:
    30.                     visited[j]=True
    31.                     current_class.append(j)
    32.             classes.append(current_class)
    33.         return classes
    34.     def is_irreducible(self):
    35.         return len(self._get_classes())==1
    36.     def _is_recurring_class(self, class_):
    37.         return not any(any(self._P[s_i][s_j]>0 for s_j in self._status if s_j not in class_)for s_i in class_)
    38.     def get_recurring_classes(self):
    39.         recurring_classes=[]
    40.         irreccurring_status=[]
    41.         for class_ in self._get_classes():
    42.             if self._is_recurring_class(class_):
    43.                 recurring_classes.append(class_)
    44.             else:
    45.                 for state in class_:
    46.                     irreccurring_status.append(state)
    47.         return recurring_classes, irrecurring_status
    48.     def _mul(self, Q,P):
    49.         n=len(self._P)
    50.         return [[sum(Q[i][k]*P[k][j] for k in range(n))for j in range(n)] for i in range(n)]
    51.     def _get_period(self, class_):
    52.         s_0=class_[0]
    53.         n = len(self._P)
    54.         m = len(class_)
    55.         X=[]
    56.         P=[[p for p in r]for r in self._P]
    57.         Q=[[(1 if i=j else 0) for j in range(n)]for i in range(n)]
    58.         for k in range(1,m+1):
    59.             Q=self._mul(Q,P)
    60.             if Q[s_0][s_0]>0:
    61.                 X.append(k)
    62.         return gcd(*X)
    63.     def get_all_period_of_classes(self):
    64.         recurring, irrecurring = self.get_recurring_classes()
    65.         period={}
    66.         for class_ in recurring:
    67.             period[tuple(class_)] = self._get_period(class_)
    68.         period[tuple(irrecurring)] = None
    69.         return period
    70.     def get_stationary_distribution(self,class_):
    71.         C=[[self._P[i][j] for j in class_] for i in class_]
    72.         n = len(C)
    73.         b = [0.0]*(n-1)+[1.0]
    74.         A=[]
    75.         for i in range(n-1):
    76.             A.append([-C[j][i] if i != j else 1 - C[j][i] for j in range(n)])
    77.         A.append([1.0]*n)
    78.         for i in range(n):
    79.             max_row = max(range(i, n), key=lambda r: abs(A[r][i]))
    80.             A[i], A[max_row] = A[max_row], A[i]
    81.             b[i], b[max_row] = b[max_row], b[i]
    82.             pivot = A[i][i]
    83.             for j in range(i, n):
    84.                 A[i][j] /= pivot
    85.             b[i] /= pivot
    86.             for k in range(i+1, n):
    87.                 factor = A[k][i]
    88.                 for j in range(i, n):
    89.                     A[k][j] -= factor * A[i][j]
    90.                 b[k] -= factor * b[i]
    91.         pi = [0] * n
    92.         for i in range(n-1, -1, -1):
    93.             pi[i] = b[i]
    94.             for j in range(i+1, n):
    95.                 pi[i] -= A[i][j] * pi[j]
    96.         return pi
    复制代码


    主要方法      
    1) _get_classes 方法
            功能:识别所有强连通类。
            步骤:这个方法的目标是将状态分成不同的强连通组件。首先,它初始化了一个reachable矩阵,记录每个状态i到j是否可达。然后通过三重循环进行传递闭包计算,这实际上是Floyd-Warshall算法的变种,用于检测可达性。之后,mutual矩阵用来记录i和j是否相互可达,从而确定强连通组件。然后通过遍历每个未被访问的节点,将同一类的节点收集起来。
            

    2) _is_recurring_class方法
            功能:检查给定的类是否是常返的。
            步骤:这里判断的是类中的状态是否不会转移到类外的状态。具体来说,检查类中的任一状态s_i是否有任何转移到不在类中的s_j的概率大于0。如果有,则不是常返类。常返类意味着无法离开这个类。
            

    3) _get_period 方法:
            功能:计算给定类的周期。
            步骤:这里选择类中的第一个状态s_0,然后计算从s_0出发返回s_0的所有可能步数的最大公约数。其中,只需要考虑最多m步(m是类的大小),因为超过m步的路径会有重复状态,从而可以分解成更小的环。
            

    4) get_stationary_distribution 方法
            功能:用于计算平稳分布。
            步骤:首先将转移矩阵限制在类中的状态,然后构建增广矩阵A和b,用高斯消元法解平稳方程。
            


    概念补充      
            

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    评分

    参与人数 1血液 +2 收起 理由
    空玄君 + 2

    查看全部评分

    回复

    使用道具 举报

    西弗勒斯·斯内普冒险用绷带魔眼护符堕落之舞GM論壇榮譽勛章箭术卷轴牧羊人把菊花卖了

      老六不六 发表于 2025-2-10 08:14:06 | 显示全部楼层 <
      回复

      举报

      John Reese裸体克里斯位于左侧的随从已派遣远征虚空之海的鲸黄粱一梦【新春限定】果体 隆新神的赐福都市:天际线2永远的克叔業火死鬥

        娱乐法师火布偶 发表于 2025-2-10 08:59:37 | 显示全部楼层 <
        第二种情况是收敛了,第一种是不收敛
          收起(3)
        回复

        举报

        月亮提灯吸血魔蝠阿努比斯信徒業火死鬥自定义男从Homunculus虚空之海的鲸璀璨闪蝶『搓粉团珠』

          归北溟 发表于 2025-2-10 09:06:08 | 显示全部楼层 <
          回复

          举报

          质量效应三部曲上古卷轴V:天际業火死鬥龙血指环不灭狂雷守护者三角头铁牛邪恶圣杯龙腾世纪:审判赛博朋克2077

            傲瑞龍兽 发表于 2025-2-10 09:20:39 | 显示全部楼层 <
            救命,我毕业了啊喂,在高色色时突然被死去的知识攻击,另外感觉还是需要一些数学基础,所以不如大家一起来学实变复变和泛函
            回复

            举报

              RudeRide 发表于 2025-2-10 09:41:04 | 显示全部楼层 <
              Markov Decision Process作为Reinforcement Learning的基础,现在真的就是必不可缺了,马氏链相关性质,尤其是最终平稳的性质在解动态规划相关问题有指导意义,而且随着多智能体的热点兴起,这一理论基石的地位又抬了起来。
                收起(1)
              回复

              举报

              超人位于左侧的随从已派遣远征【夏日限定】夏日的泰凯斯自定义男从Homunculus猫咪点唱机『搓粉团珠』金牌矿工人鱼之泪和你一起飞行的皮卡丘天灾骑士

                PURO_ 发表于 2025-2-10 09:47:03 | 显示全部楼层 <
                回复

                举报

                超人位于左侧的随从已派遣远征火柴 - Gamemale和你一起飞行的皮卡丘虚空之海的鲸

                  找乐子企鹅仔 发表于 2025-2-10 10:56:03 | 显示全部楼层 <
                  回复

                  举报

                    520mariah 发表于 2025-2-10 11:44:58 | 显示全部楼层 <
                    回复

                    举报

                    享受美食的小伯『搓粉团珠』结晶火鹰幼崽春之歌驯化红龙幼崽布衣+10 史诗的驯化黑龙幼崽最终幻想XVI

                      空玄君 发表于 2025-2-10 12:11:54 | 显示全部楼层 <
                      回复

                      举报

                      『搓粉团珠』小小舞台狱炎魔犬探险三杰士『星河碎片』不灭的蓝宝石不曾寄出的信件破损的旧书

                        gamemalen99 发表于 2025-2-10 12:25:53 | 显示全部楼层 <
                        回复

                        举报

                        艾吉奥位于左侧的随从已派遣远征

                          万俟 发表于 2025-2-10 12:33:15 | 显示全部楼层 <
                          这不是我线性代数课上的讲稿嘛?好酷啊
                            收起(9)
                          • 白冥 白冥 :但马尔可夫链是测度论的内容,不是线性代数的
                            2025-02-10 13:32 回复
                          • 万俟 万俟 :回复 白冥 : 马可夫链是概率论里的,但跟测度扯不上边啊,你用的方法里面求矩阵的特征值特征向量这些就是线性代数啊
                            2025-02-10 13:35 回复
                          • 白冥 白冥 :回复 万俟 :那你还敢说是你线性代数课的讲稿?(=^-ω-^=)
                            2025-02-10 13:47 回复
                          • 万俟 万俟 :回复 白冥 :我的讲稿里确实有这个啊,倒数第二周就讲马可夫链啊,又不涉及概率论的知识,就作为特征值特征向量的应用而已,很简单的
                            2025-02-10 13:50 回复
                          • 白冥 白冥 :回复 万俟 :嗷,你应该不知道,一般形式的马尔可夫链(就是说不止是针对有限时齐离散马氏链)要求变量是可测的,到后面的定理和推论更是用到不少分析学的证明(=^-ω-^=)
                            2025-02-10 14:02 回复
                          • 万俟 万俟 :回复 白冥 :我读书少你别骗我,可测不是说的集合性质嘛?不是变量吧
                            2025-02-10 16:06 回复
                          • 还有3条回复 点击查看

                            我也说一句

                          回复

                          举报

                          用过的粪桶奇思妙想寶可夢 Pokémon牧羊人森林羊男龙鳞石

                            星回 发表于 2025-2-10 15:14:09 | 显示全部楼层 <
                            回复

                            举报

                            【新手友好】昆進寻觅牧羊人

                              huafa 发表于 2025-2-10 16:38:38 | 显示全部楼层 <
                              回复

                              举报

                              夏日柯基自定义男从Homunculus璀璨闪蝶裸体克里斯吃饱金币的Doge永亘环青鸾林中松鼠

                                Yang羊 发表于 2025-2-10 16:40:34 | 显示全部楼层 <
                                回复

                                举报

                                『搓粉团珠』永亘环牧羊人士兵 76GM論壇進階勛章驯化黑龙幼崽冬之歌杰西·麦克雷莱因哈特·威尔海姆

                                  kimidave 发表于 2025-2-10 16:59:56 | 显示全部楼层 <
                                  回复

                                  举报

                                  蜘蛛侠位于左侧的随从已派遣远征40x43 隐形➀格拉迪欧拉斯40x43 隐形➁16x43 隐形➀【新春限定】果体 隆街头霸王

                                    莲一 发表于 2025-2-10 17:26:35 | 显示全部楼层 <
                                    回复

                                    举报

                                    奥兹大陆莱因哈特·威尔海姆上古卷轴V:天际约翰-117吉姆‧雷诺铁牛虎头怪

                                      l312687174 发表于 2025-2-10 18:56:58 | 显示全部楼层 <
                                      回复

                                      举报

                                      森林羊男最终幻想XIV都市:天际线2堕落之舞驯化红龙幼崽驯化黑龙幼崽瑞雪兆丰年,生灵万物新眼镜蛇图腾

                                        themental 发表于 2025-2-10 19:37:39 | 显示全部楼层 <
                                        回复

                                        举报

                                        最终幻想XIV最终幻想XVI赛博朋克2077丹妮莉丝·坦格利安希尔瓦娜斯·风行者官复原职塞巴斯蒂安·斯坦杰森‧斯坦森荒野大镖客:救赎 II

                                          tuxonstar 发表于 2025-2-11 11:53:34 | 显示全部楼层 <
                                          回复

                                          举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2025-5-8 14:01 , Processed in 0.223753 second(s), 144 queries , Redis On.

                                          Copyright © 2013-2025 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表