ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从随机游走到状态转移:马氏链核心三要素与稳态分布实战解析

从随机游走到状态转移:马氏链核心三要素与稳态分布实战解析 1. 从“随机游走”到“状态转移”马氏链的直观理解在数据分析、金融预测、搜索引擎排序甚至生物信息学里我们常常会遇到一类特殊的随机过程它未来的状态只和当前的状态有关而与过去的历史路径无关。听起来有点“健忘”但正是这种“无记忆性”让它成为了一个强大而优雅的数学模型——马尔可夫链或者更亲切地叫它马氏链。我第一次深入接触马氏链是在为一个电商平台做用户行为预测的项目里。我们手头有海量的用户点击、浏览、加购、下单日志老板的问题是“能不能预测一个今天只是随便逛逛的用户明天有多大可能性会下单” 如果我们试图用用户所有的历史行为序列来建模维度会爆炸计算几乎不可能。这时马氏链的“无记忆性”假设就成了一个极佳的简化工具我们假设用户下一步的行为只取决于他当前在哪个页面或处于哪种行为状态比如在“商品详情页”的用户下一步可能“加购”也可能“离开”。这个假设虽然不完全精确但在很多场景下足够有效且能让我们用数学工具清晰地刻画和预测系统的演变。简单来说马氏链描述的是一个系统在一系列离散时间点上从一个状态随机跳转到另一个状态的过程。这里的“状态”可以是任何离散的、可定义的情形比如天气的“晴”、“雨”、“阴”比如股市的“牛市”、“熊市”、“震荡市”再比如一个排队系统中顾客的“等待”、“正在服务”、“已离开”。它的核心魅力在于我们可以用一个叫做“转移概率矩阵”的表格来完整地描述这个系统所有可能的跳转规则。掌握了这个矩阵我们就能像看地图一样看清系统未来的各种可能性。2. 构建马氏链模型的核心三要素要亲手搭建一个马氏链模型无论是用于分析还是预测都必须先明确三个核心要素。这就像盖房子前要准备好图纸、砖瓦和地基一样缺一不可。2.1 状态空间定义系统的所有可能“位置”状态空间就是你的系统所有可能情况的集合通常用一个大写字母 S 表示比如 S {S1, S2, ..., Sn}。定义状态是建模的第一步也是最需要结合业务思考的一步。一个常见的坑是把状态定义得过于粗糙或过于精细。比如在刚才的用户行为模型中如果你只定义“活跃”和“流失”两个状态那模型可能无法区分正在浏览和即将下单的用户预测会不准。但如果你把每一个页面ID都定义为一个状态状态空间会变得极其庞大导致转移矩阵稀疏且难以估计。我的经验是状态的定义应该遵循“同质性”原则即同一个状态下的所有个体其下一步转移到其他状态的概率分布应该是相近的。在实践中我们常常通过聚类分析或者基于业务知识来划分状态。例如将用户行为状态定义为“首页浏览”、“列表页筛选”、“详情页查看”、“购物车页”、“支付页”、“离开”。这样的划分既有业务意义又能保证状态数量在可控范围内。2.2 转移概率刻画状态间的“跳跃规则”这是马氏链的心脏——转移概率。它表示在已知当前状态为 i 的条件下下一步转移到状态 j 的概率记作 P(i-j) 或 P_ij。对于有 n 个状态的马氏链所有这些概率可以排列成一个 n×n 的矩阵这就是转移概率矩阵 P。P [P_ij] 其中每个元素 P_ij ≥ 0并且对于矩阵的每一行 i所有元素之和必须等于 1。这是因为从状态 i 出发下一步必然跳转到状态空间 S 中的某个状态包括可能停留在自身。如何得到这个矩阵在理论模型中我们可以根据问题的物理规律或游戏规则直接写出。但在实际数据驱动项目中我们通常从历史数据中统计估计。例如统计所有从“详情页查看”状态i出发的下一跳计算其中跳到“购物车页”状态j的比例这个比例就可以作为 P_ij 的估计值。注意这里有一个关键假设即转移概率是平稳的不随时间变化。在实际应用中如果系统存在明显的季节性或趋势可能需要引入时齐马氏链或更复杂的模型。2.3 初始分布系统从何处“起跑”初始概率分布记作一个行向量 π(0) [π1(0), π2(0), ..., πn(0)]其中 πi(0) 表示在初始时刻t0系统处于状态 i 的概率。所有 πi(0) 之和也为 1。初始分布决定了我们分析的起点。例如如果我们想分析“一个新用户首次进入网站后的行为路径”那么初始分布 π(0) 可能就是 [1, 0, 0, ...]表示100%的概率从“首页浏览”开始。如果我们分析的是“当前所有在线用户的整体行为趋势”那么 π(0) 可能就是当前时刻观测到的各状态用户数的比例。明确了这三个要素一个马氏链模型就正式建立起来了。模型建立后我们最关心的就是它的“长期行为”和“预测能力”。3. 马氏链的长期行为与稳态分布求解我们建模不只是为了描述当下更是为了预测未来。马氏链一个最强大的性质就是在许多情况下无论系统从何处开始经过足够长时间的演变后其处于各个状态的概率会稳定下来不再随时间变化。这个稳定的概率分布称为稳态分布或平稳分布。3.1 稳态分布的存在性与意义并不是所有马氏链都有稳态分布。一个马氏链要存在唯一的稳态分布通常需要满足两个条件不可约和非周期。不可约直观理解就是从任何一个状态出发都有机会概率大于0在有限步内到达任何其他状态。整个状态空间是“连通”的没有孤立的小团体。非周期系统返回某个状态的步长没有固定的周期。避免出现类似“今天晴则后天必晴”这种确定性循环。对于满足条件的马氏链当时间步数 k 趋向于无穷大时k步转移概率矩阵 P^k 的每一行都会收敛到同一个行向量 π。这个向量 π 就是稳态分布。它的物理意义极其重要它代表了系统长期运行下处于各个状态的时间占比。比如一个服务器的“繁忙”状态稳态概率是0.7就意味着从长期看它有70%的时间处于繁忙状态。3.2 求解稳态分布两种实用方法稳态分布 π 满足一个关键方程πP π。也就是说用稳态分布作为初始分布经过一步转移后分布保持不变。这为我们提供了求解方法。方法一解线性方程组根据方程 πP π以及概率之和为1的条件π1 π2 ... πn 1我们可以列出一个包含 n 个方程的线性方程组。由于其中一个方程是冗余的我们通常用“概率和为1”的条件替换掉原方程组中的任意一个方程。 例如对于一个两状态链转移矩阵为 P [[0.8, 0.2], [0.3, 0.7]] 设稳态分布 π [a, b]则有 a * 0.8 b * 0.3 a (从 πP 的第一列等于 a) a * 0.2 b * 0.7 b (从 πP 的第二列等于 b) a b 1 解这个方程组得到 a 0.6, b 0.4。这意味着长期来看系统有60%的时间处于状态140%的时间处于状态2。方法二矩阵幂的迭代计算对于复杂系统直接解方程可能计算量大。我们可以利用计算机进行迭代计算任取一个初始分布 π(0)然后反复计算 π(k1) π(k) * P。当连续两次迭代的结果差异小于一个很小的阈值如1e-8时我们就认为收敛到了稳态分布 π。import numpy as np P np.array([[0.8, 0.2], [0.3, 0.7]]) pi np.array([0.5, 0.5]) # 任意初始分布 for _ in range(100): pi_new pi.dot(P) if np.max(np.abs(pi_new - pi)) 1e-8: break pi pi_new print(稳态分布:, pi)这种方法非常直观也是许多实际应用中的首选尤其是当状态空间很大时。实操心得在迭代计算中初始分布的选择不影响最终的稳态分布只要链满足条件但会影响收敛速度。选择更接近真实情况的初始分布可以加快收敛。另外一定要设置最大迭代次数防止不收敛的链进入死循环。4. 马氏链的进阶分析首达时间与吸收态除了预测长期比例马氏链还能回答一些更精细的问题比如“平均需要多少步才能第一次到达某个目标状态”或者“一旦进入某个状态就永远出不来了怎么办”。4.1 首达时间与平均吸收时间首达时间是指从某个状态 i 出发首次到达某个目标状态 j 所需的步数。它是一个随机变量。我们更常关心的是它的期望值称为平均首达时间或平均吸收时间如果目标状态是吸收态。计算平均吸收时间通常需要解另一个线性方程组。假设我们有一个马氏链其中某些状态是“吸收态”一旦进入就永远停留其转移概率到自身为1其他状态是“非吸收态”。设从非吸收态 i 出发被某个吸收态吸收的平均步数为 m_i。那么对于每个非吸收态 i都有 m_i 1 Σ_{k (非吸收)} P_ik * m_k 这个方程的意思是从 i 出发先走一步这消耗了1步然后到了某个状态 k如果 k 是非吸收态那么从 k 开始还需要平均 m_k 步才能被吸收。对所有可能的 k 求和并以概率 P_ik 加权就得到了等式右边。对于吸收态 j显然 m_j 0。通过求解这个方程组我们就可以得到从任何一个非吸收态出发被吸收的平均时间。这在设备故障分析从“正常”到“故障”的平均时间、赌徒破产问题、客户流失分析中非常有用。4.2 吸收态与吸收链吸收态是一个一旦进入就无法离开的状态即 P_ii 1。包含至少一个吸收态并且从任何非吸收态出发都能以正概率到达某个吸收态的马氏链称为吸收链。吸收链的转移概率矩阵可以写成标准形式 P [ I O R Q ] 其中 I 是吸收态部分的单位矩阵O 是零矩阵R 是非吸收态到吸收态的转移子矩阵Q 是非吸收态之间的转移子矩阵。对于吸收链有两个非常重要的矩阵基本矩阵 N (I - Q)^(-1)。这个矩阵的妙处在于它的元素 n_ik 表示从非吸收态 i 出发在最终被吸收前访问非吸收态 k 的平均次数。吸收概率矩阵 B N * R。它的元素 b_ij 表示从非吸收态 i 出发最终被吸收态 j 吸收的概率。我曾经用这个模型分析过一个“用户升级漏斗”。将“免费用户”和“试用用户”定义为非吸收态将“付费用户”和“彻底流失用户”定义为两个吸收态。通过历史数据估算出 Q 和 R 矩阵后计算出的吸收概率矩阵 B 直接告诉我们一个免费用户最终转化为付费用户的概率有多大以及从试用阶段开始促使用户付费的关键点在哪里。平均吸收时间则告诉我们整个转化过程平均需要多长时间。这些洞见对于制定运营策略至关重要。5. 实战案例基于马氏链的简单天气预报模型让我们用一个经典的、简化的天气预报例子把上面的概念串起来进行一次完整的建模与计算实战。5.1 问题定义与模型假设假设一个地方的天气只有三种状态晴S、阴C、雨R。我们假设明天的天气只与今天的天气有关满足马氏性。通过分析历史气象数据我们得到了如下的转移概率矩阵今天\明天晴(S)阴(C)雨(R)晴(S)0.60.30.1阴(C)0.40.40.2雨(R)0.20.30.5矩阵解读如果今天是晴天那么明天有60%概率还是晴天30%概率转阴10%概率下雨。5.2 多步预测与稳态分析问题1如果今天是晴天预测后天天气的概率分布。今天是晴天初始分布 π(0) [1, 0, 0]。 明天的分布 π(1) π(0) * P [1, 0, 0] * P [0.6, 0.3, 0.1]。 后天的分布 π(2) π(1) * P [0.6, 0.3, 0.1] * P。 计算过程后天为晴的概率0.60.6 0.30.4 0.1*0.2 0.36 0.12 0.02 0.5后天为阴的概率0.60.3 0.30.4 0.1*0.3 0.18 0.12 0.03 0.33后天为雨的概率0.60.1 0.30.2 0.1*0.5 0.06 0.06 0.05 0.17 所以 π(2) [0.5, 0.33, 0.17]。这意味着从晴天开始后天有50%的可能性是晴天。问题2长期的天气趋势稳态分布是怎样的我们需要解方程 πP π且 π_S π_C π_R 1。 设 π [a, b, c]则有 0.6a 0.4b 0.2c a - -0.4a 0.4b 0.2c 0 ...(1) 0.3a 0.4b 0.3c b - 0.3a - 0.6b 0.3c 0 ...(2) 0.1a 0.2b 0.5c c - 0.1a 0.2b - 0.5c 0 ...(3) a b c 1 ...(4)用(4)式替换(1)式或其他任意一式来解。经过计算具体消元过程略可以得到稳态分布约为 π ≈ [0.468, 0.333, 0.199] 这个结果告诉我们从很长的时间跨度来看这个地方大约有46.8%的日子是晴天33.3%是阴天19.9%是雨天。这个分布与初始天气无关是天气系统内在的稳定规律。5.3 模型评估与局限性讨论这个简单的模型展示了马氏链的核心应用但它显然有局限性。真实的天气系统受到季节、气压系统、地理等多种因素影响远非“一阶无记忆”能完全描述。高阶马氏链明天天气依赖于今天和昨天或隐马尔可夫模型HMM假设观测到的天气背后有一个不可见的状态在驱动会更合适。然而这个简单模型的巨大价值在于其解释性和计算简便性。它为我们提供了一个分析随机动态系统的基准框架。在实际工作中我们常常从这样一个简单模型开始计算其稳态和预测将其结果与复杂模型或真实数据进行对比从而深刻理解系统中真正的驱动因素是什么。马氏链模型更像是一把钥匙帮你打开理解随机过程的大门门后的世界还有更精彩的排队论、蒙特卡洛模拟、PageRank算法等应用在等待着。
返回列表