【学术】马尔可夫链的详细介绍及其工作原理
AiTechYun
编辑:xiaoshan
马尔可夫链是一种相当常见的、相对简单的统计模型随机过程的方法。它们已经被应用于许多不同的领域,从文本生成到金融建模。一个常见的例子是r/SubredditSimulator,它使用马尔可夫链来自动创建整个subreddit的内容。总的来说,马尔可夫链在概念上是相当直观的,并且非常容易理解,因为它们可以在不使用任何高级统计或数学概念的情况下实现。它们是学习概率建模和数据科学技术的好方法。
(来自http://setosa.io/ev/markov-chains/)
- r/SubredditSimulator地址:https://www.reddit.com/r/SubredditSimulator/
场景
首先,我将用一个非常常见的例子来描述它们:
假设天气有两种可能的状态:晴天或阴天。
你可以直接观察当前的天气状态,并且保证始终是前面提到的两个状态之一。
现在,你想要预测明天的天气。直觉上,你假设在这个过程中有一个内在的转移,因为
当前的天气对第二天的天气有一定的影响。所以,作为尽职尽责的人,你收集了数年的
天气数据,并计算出在阴天之后的晴天的概率是0.25。你还注意到,通过类推,可以得
出在阴天之后出现阴天的概率必须是0.75,因为天气只有两个可能的状态。
你现在可以利用这个分布,根据当时的天气状况来预测未来几天的天气。
这个例子说明了马尔可夫链的许多关键概念。马尔可夫链本质上由一组转移组成,这些转移由一些满足马尔可夫性质的概率分布决定。
在这个例子中,通过观察从当前的一天到下一天的过渡,得到的概率分布。这说明了马尔可夫属性,马尔可夫过程的独特特征,使它们无记忆。这通常会使他们无法成功地产生一些潜在趋势可能会发生的序列。例如,虽然马尔可夫链可以基于单词频率来模仿作者的写作风格,但是由于这些是经过更长的文本序列开发的,因此无法产生包含深层含义或主题意义的文本。它们缺乏产生与上下文相关的内容的能力,因为他们无法将之前的所有状态考虑在内。
天气可视化的例子
模型
马尔可夫链是一种概率自动机。状态转移的概率分布通常表示为马尔可夫链的转移矩阵(transition matrix)。如果马尔可夫链有N个可能状态,矩阵将是一个N * N矩阵,例如条目【entry】(I,J)从状态I转移到状态J的概率。此外,转移矩阵必须是一个随机矩阵,矩阵的每一行中的条目必须加起来为1。这是完全合理的,因为每一行代表它自己的概率分布。
示例:马尔可夫链的一般视图
示例:转移矩阵有3个可能的状态
此外,马尔可夫链也有一个初始状态向量,表示为一个N×1矩阵(一个向量),它描述了在N个可能状态中的每一个状态下开始的概率分布。向量的条目I从状态I开始描述链状态的概率。
初始状态向量有4个可能的状态
模型和场景通常是表示马尔可夫链所需的全部。
我们现在知道了如何获得从一个状态转移到另一个状态的机会,但是如何找到在多个步骤中找到转移的机会呢?为了使它正式化,我们现在想要确定在M步中从状态I转移到状态J的概率。事实证明,这其实很简单。给定一个转移矩阵P,这可以通过提高P的M次幂来计算矩阵条目(I,J)的值来确定,对于M的小值,可以通过重复的乘法运算手动实现。然而,对于M的大值,如果你熟悉简单的线性代数,将矩阵对角化是更有效的方法。
结论
现在你已经了解了马尔可夫链的基本知识,现在你应该能够轻松地用你选择的语言实现它们。如果编码不是你的强项,那么还有很多更高级的马尔可夫链和马尔可夫过程的特征可以去深入研究。在我看来,沿着理论路线的自然前进方向是隐藏的马尔可夫过程或MCMC。简单的马尔可夫链是其他更复杂的建模技术的构建模块,因此,通过这些知识,你现在可以在诸如信念建模和取样等主题中使用各种技术。
- 《Redis设计与实现》读书笔记(三) ——Redis中的链表
- 《Redis设计与实现》读书笔记(四) ——Redis中的跳跃表
- 解析Linux中的VFS文件系统之文件系统的注册(二)
- vivi虚拟摄像头驱动程序
- 系统架构 | 基于微服务架构,改造企业核心系统之实践
- 《Redis设计与实现》读书笔记(五) ——Redis中的整数集合
- 《Redis设计与实现》读书笔记(七) ——Redis对象综述及字符串对象实现原理
- 自动登录脚本
- 极致之处,精彩无限 - 优化了一半的SQL
- 编程修炼 | Scala中Stream的应用场景及其实现原理
- Linux之内存描述符mm_struct
- 大数据 | Spark的现状与未来发展
- 信号量、互斥锁、自旋锁、原子操作
- 理解OAuth 2.0
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springmvc之自定义视图
- 【colab pytorch】训练和测试常用模板代码
- django-VIews之HttpResponse(一)
- django-Views之request(二)
- django-Views之常见的几种错误视图代码(三)
- django-Views之装饰器(四)
- django-Views之使用视图渲染模板(五)
- springmvc实例之显示雇员相关信息(一)
- django-Views之类视图 (六)
- springmvc之重定向
- django-模板之自定义模板路径(一)
- spring配置Bean之基于xml文件的方式
- django-模板之模板变量(二)
- 【猫狗数据集】计算数据集的平均值和方差
- django-模板之extends(三)