python做马尔科夫模型预测法_通过Python的Networkx和Sklearn来介绍隐性马尔科夫模型...

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

文章梗概

马尔科夫是何人?

马尔科夫性质是什么?

马尔科夫模型是什么?

是什么让马尔科夫模型成为隐性的?

一种能够用于条件检测的马尔科夫模型

结论

参考文献

马尔科夫是何人?

马尔科夫是一位俄国的数学家,他最为人所知的是他在随机过程方面的研究。他早期研究的重点是数论而在1900年之后他所研究的重点转向了概率论。他研究的成果颇丰以至于在他1905年正式退休之后他仍然在教授课程直至去世。在他的研究中,马尔科夫成功地拓展了大数定理以及中心极限定理,并将其应用于由独立随机变量组成的特定序列中,如今这也被称为马尔可夫链。马尔可夫链被广泛的运用于物理学,经济学,统计学,生物学等方面。两个最著名的应用是布朗运动以及随机漫步。

什么是马尔科夫性质?

一类随机过程:在给定当前状态的条件下,将来的状态独立于过去的状态。

假定我们用一枚正反面概率一样的硬币玩一个简单的抛硬币的游戏。抛去质疑,假设马尔科夫性质不是已知的,并且我们希望去预测在十次抛掷以后,第11次正面朝上的概率。在条件依赖的假设之下(硬币对于过去的状态有记忆特性并且未来的状态也依赖于过去状态的序列),我们必须记录导致第11次结果的前十次结果的特定序列,并计算它们的联合概率。这个序列的联合概率就是0.5^10 = 0.0009765625。在条件依赖下,第十一次抛掷正面朝上的概率就是0.0009765625 * 0.5 = 0.00048828125。

这真的是第十一次抛掷正面朝上的概率吗?当然不是!

我们知道硬币抛掷这一事件并不依赖于先前抛掷的结果。这枚硬币并没有记忆特性。这个连续抛掷的过程并没有编码先前的结果。每个抛掷都是独立事件并且是正反面概率一致的,又叫做与过去状态的条件独立。这就是马尔科夫性质。

什么是马尔科夫模型?

马尔科夫链(模型)描述了一类随机过程,假定未来状态的概率仅仅依赖于当前状态,不依赖于先前的状态。

让我们以一个简单的例子开始。假设你的小狗处于三类状态之一,在给定当前状态的条件下,你想要模拟出未来状态的可能性。为此我们需要去指定状态空间,初始概率和转移概率。

想象一下你有一只非常懒的胖狗,所以我们定义了状态空间为:睡觉,吃饭,赖皮。我们设置对应的初始概率为 35%, 35%,和 30% 。

下一步就是定义转移概率。在给定当前状态的条件下,他们就是保持相同状态的概率或者转移到不同状态的概率。

既然我们有了初始概率和转移概率,我们就能用Networkx包来创建马尔科夫图表了。

要做到这一点需要一点点灵活思考。Networkx创造了包含很多节点和边的图形。

在我们这个小例子中,小狗可能的状态是这些节点,而边则是连接各个节点的连线。而转移概率则是权重。它们代表了在当前状态已知的情况下转移至下一状态的概率。

有一点需要指出的是networkx主要是用来处理字典对象的。也就是说,我们需要去创建一个包含边以及对应权重的字典对象。

现在我们能够创建这个图表。为了能够使得马尔科夫模型可视化需要使用nx.MultiDiGraph()。一个多有向图简单来说就是有方向的图表,能够拥有多条弧,同时单个节点既可以是起始点也可以是终点。

在接下来的代码中,我们将创建图标对象,添加我们的节点,边和标签,接着画一个大致的netwokx图线,并且将其输出为dot文件。

现在让我们看看这个dot文件。

还可以吧。如果你想从任意节点开始沿着某一条边,他会告诉你这条小狗从一个状态转化为另一个状态的概率。举个例子来说吧,如果这条狗正在睡觉,我们能够发现有40%几率这条狗会继续睡觉,40%的几率狗会醒来并且耍赖皮,还有20%的概率狗会醒过来吃饭。

什么使得马尔科夫模型成为隐性的?

假设这样一种情况:你的狗突然举止怪异,你想要去模拟出狗是由于生病而有怪异行为的概率或者是在健康状态下纯粹地搞怪的概率。

在这一情形下,狗的真正状态是未知的,并且你也是不知晓的。一条可行的方法就是假设狗有一些可被观察的行为,这些行为能够代表正确而隐性的状态。让我们通过一个例子来了解。

首先我们创建状态空间,健康或生病。我们假设它们是等概的。

现在我们为隐藏状态创建转移矩阵。

这就让它变得更有趣一点了。现在我们创建发射或者观察概率矩阵。这个矩阵的大小是M x O 的,并且M是隐藏状态的个数,而O则是可能观察到的状态的个数。

这个发射矩阵告诉我们,在可能当前以及可观察的状态条件下,狗处于其中一个隐藏状态的概率。

让我们保留前一个例子中的可观察状态。这条狗能够睡觉,吃饭或者耍赖皮。这样我们就能根据这些概率做出最准确的猜测。

现在我们创建图表的边和图表对象。

这个隐性的马尔科夫的图表有一些复杂但其原理是一样。举个例子来说,你能够预测到,如果你的小狗在吃饭,那它有极高的可能是健康的(60%),而有非常低的可能是生病的(10%)。

现在,给定一组你的小狗的行为序列,如果你需要识别出小狗随着时间变化的健康状态又该怎么办呢?

使用维特比算法我们可以在给定行为序列的条件下,求出其最可能的对应的隐藏状态的序列。

高水平下,这个维特比算法增量随着每个时间的步进,找到所有路径中能够以最大可能性到达时间t下的状态i的路径,这条路径也是到达时间t的正确观察行为序列。

这个算法也能够保存在每一个阶段下有最高概率的状态的踪迹。在序列的结尾,这一算法将会向后迭代计算出在每一个时间步长中“胜利”的状态,并建立最有可能的路径,或者最有可能的隐藏状态的序列,这些都与已知的行为序列相对应。

让我们看一下结果吧。

一种可用于条件检测的隐性马尔科夫模型

到现在,你可能想知道我们怎么样去将我们所学的马尔科夫模型应用在定量金融中。

但考虑到当我们想要尝试在资产收益率中应用预测技术时,所面临最大的困难就是资产收益率是非平稳时间序列。简单来说,这就是意味着资产收益率的预期均值以及波动性都会随着时间而变化。

大多数时间序列的模型都是假设数据是平稳的。这就是这些模型主要的缺陷。

但是,让我们从问题的另外一面思考。我们知道这个时间序列其实表明了当前的时间点下预期均值以及波动性是固定不变的。而这些时间点或者说是条件就可以比喻为隐性状态。

如果是这样的话,我们就只需要得到这些拥有与隐性状态对应特征的观察变量就可以了。如果我们能够更好地预估出资产所处在的最可能的环境,包括它的联合均值和方差,那么我们的预测模型就能变得更加灵活,并且能够提高准确度。当然如果给定的这些条件预估参数能够组成更有利于情景分析的框架,我们也能够成为更优秀的风险管理人员。

在这个例子中,我使用的观测变量有:潜在的资产回报,泰德价差,10年- 2年连续成熟的范围,和10年-3个月的连续成熟的范围。

我们能从雅虎财经上采集这些数据。

下面我们将会用到sklearn的高斯混合模型来组成一个能够预测这些条件的模型。我们将会在这个系列的第二部分深度探讨混合模型这个版块。而最重要的特点是,混合模型应用一种密度估算中无人监测的形式来进行实现。他利用最大化均值算法来估算隐性状态的的均值和协方差。现在,就可以按下这个按钮,来猜猜转移和发射概率以及最可能的路径。

我们必须选定混合模型中组件的数量来和时间序列相拟合。在这个例子中这些组件就被当作隐性状态。我们将这些状态任意划分为高,中和低波动性并且将组件部分设置为3。

在上面的图片中,我圈出了每个条件下所对应的每日收入的预期均值和方差。我们的低波动性环境就是我们序号为1的隐性状态。我们也能发现序号为1的隐性状态下有最高额的收入均值和最小的方差。而序号为0的隐性状态即为中性的波动性环境,对应的是第二高的回报和方差。最后的序号为2的隐性状态即为高的波动性环境,对应的是负的回报以及最大的方差。

下面的图是用颜色代表各个隐性状态的美容价格走势。

总结:

这篇文章中我们讨论了马尔科夫性质的概念,马尔可夫模型和隐性的马尔可夫模型。我们使用NetworkX包创建马尔科夫链图,并用sklearn的高斯混合模型预测以往各个节点的状态。在第2部分,我们将深入讨论混合模型。为了了解更详细的信息,我建议你多看看参考文献中的内容。特别是Setosa.io这个网站由于其有极好的交互式的视觉体验,有助于你更好地理解这篇文章。

参考文献:

1.     https://en.wikipedia.org/wiki/Andrey_Markov

2.     https://www.britannica.com/biography/Andrey-Andreyevich-Markov

3.     https://www.reddit.com/r/explainlikeimfive/comments/vbxfk/eli5_brownian_motion_and_what_it_has_to_do_with/

4.     http://www.math.uah.edu/stat/markov/Introduction.html

5.     http://setosa.io/ev/markov-chains/

6.     http://www.cs.jhu.edu/~langmea/resources/lecture_notes/hidden_markov_models.pdf

7.     https://github.com/alexsosn/MarslandMLAlgo/blob/master/Ch16/HMM.py

8.     http://hmmlearn.readthedocs.io

英文原文:http://www.blackarbs.com/blog/introduction-hidden-markov-models-python-networkx-sklearn/2/9/2017

译者:铁柱哥爱33

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给JAVA初学者的50个忠告

给JAVA初学者的50个忠告 摘自: http://wenku.baidu.com/link?urlp5vDKt5bKzUXxG_hAsB9XopHJRROeovOGGh4jnXGZXiUedR-fNOLO7zb6ddENo5UhJTjRS9KdugEBL_7t13Nz5vZnvCmLRbHrwwjfGSi8XC 给JAVA初学者的50个忠告   1.把JAVA当成一门新的语言学习(和其他语言没啥关系&a…

换乐网redis应用分析

没听过换乐网?没错,它在我的电脑里 用法用途 在项目中,redis主要用作缓存。而在作为缓存,意义最大的是缓存计算结果,因为有些计算是一个很耗时间和资源的过程,而计算的结果不会经常改变,这时使…

AutoLayout--masonry使用

[label1 mas_makeConstraints:^(MASConstraintMaker *make) { //使左边间距为 make.left.equalTo(self.view.mas_left).offset(11); //顶部间距 make.top.equalTo(self.view.mas_top).offset(70); //高度 make.height.equalTo(30); }]; [label2 mas_makeConstraints:^(MASConst…

matplotlib 热力图_5分钟入门 Seaborn 热力图可视化

Seaborn是基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,不需要经过大量的调整就能使你的图变得精致。注:所有代码均在IPy…

换乐网GridFS应用分析

GridFS是MongoDB提供的一种存储大文件的规范,文件在存储的过程中会分成一小块一小块(chunks),文件的信息会保存在另外一个集合中。 通过MD5校验过滤重复上传文件 在换乐网中,所有用户上传的文件都会保存在GridFS中: …

JavaWeb学习过程 之c3p0的使用

这几天在学习使用MVC模式来做几个小项目,在学习的过程中,用到了数据库连接池。便特意去学习了一下。 一、谈一谈为什么要使用数据库连接池 在开发基于数据库的web程序时,传统的模式(在servlet,beans 中建立数据库链接&…

python爬虫高级项目管理师培训学校_推荐一条高效的Python爬虫学习路径!

如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得简单、容易上手。对于小白…

redis报错:jedis connection exception unexpected end of stream

一般的话,原因是你在spring中把jedis客户端配置成了单例模式(singleton),所以当在极短时间内,有多个请求连续发送过来时,jedis就会报错,说一个连接还没结束。 所以正确的配置是,将jedis配置成原…

Linq(拓展方法+select())

拓展方法: 目的:对于已存在类型的行为进行拓展 注意事项: 1:扩展方法必须是一种特殊的静态方法 2:扩展方法必须是在静态类中 3: 扩展方法的优先级低于同名类的方法 4:扩展方法只在特定的命名空间内有效 5&a…

Spring MVC:The request sent by the client was syntactically incorrect

一般是由于参数类型不正确所致。比如表单如下&#xff1a; <form:form action"" method"post" commandName"shop"><form:hidden path"id"/><form:input type"text" path"shopName" /><inpu…

Android中解析XML

Android中解析XML转载于:https://www.cnblogs.com/zhujiabin/p/5895340.html

手机全部零件名称图片_【直播课】一条记录中显示多张图片

↑点击上方“Access软件网”免费订阅温馨提示这是一节免费课&#xff0c;干货太多&#xff0c;强烈推荐&#xff01;今天(2019年1月10日)晚上8点&#xff0c;准时开讲&#xff0c;欢迎大家前来听课&#xff01;点击文章末尾左下角的原 理本课示例是显示某个零件的图片&#xf…

Spring MVC使用指示符重定向

在JSP中&#xff0c;可以使用response.sendRedirect("");来重定向&#xff0c;但这条语句不会终止函数执行&#xff0c;即执行完这条语句之后&#xff0c;后面的语句还会执行&#xff0c;这就会造成一些问题。 例如有如下显示店铺的控制器&#xff0c;如果用户设置类…

微信小程序会改变大世界吗?

微信小程序来了&#xff0c; 我们期待很久。关于“小程序”的信息还不是很多&#xff0c;但结合官方的表述已经可以看到一些端倪了。微信小程序会改变大世界吗&#xff1f;以下是徐磊的观点 “应用号”怎么变成“小程序”了 官方的表述里&#xff0c;小程序和原有的三种公众号是…

python筛选法求素数讲解_埃氏筛选法求素数 Python

代码如下def _odd_iter(): # 构建奇数序列 从3开始n 1while True:n n 2yield ndef _not_divisible(n):return lambda x: x % n > 0def primes():yield 2it _odd_iter()while True:n next(it) # 返回序列中的数yield nit filter(_not_divisible(n), it) # 埃氏筛选法,产…

JS循环执行函数setInterval

setInterval&#xff0c;每隔一个时间段执行一遍函数。 调用方法&#xff1a; setInterval&#xff08;functionname,time&#xff09;; 注意&#xff1a;functionname不能带括号&#xff0c;如果要传参要使用另外的方法&#xff0c;否则函数只会执行一次。

android学习的一点点网站资料

一些android的网站资料&#xff0c;可供一些基础者学习和了解&#xff0c;对于大神来说可能就比较小儿科了&#xff0c;主要也是给自己在项目中有时候会遇到某个功能做参考。如果哪位读者有其它的学习资料也可留言共享哈&#xff0c;再次先说声谢谢&#xff01; http://www.run…

python中表达式4**0.5的值为_Python内置函数__用来返回序列中的最小元素

【填空题】表达式 int(4**0.5) 的值为【判断题】34j不是合法的Python表达式。【填空题】已知列表对象x [‘11’, ‘2’, ‘3’],则表达式 max(x) 的值为【填空题】表达式 sum(range(10)) 的值为【判断题】Python变量使用前必须先声明,并且一旦声明就不能再当前作用域内改变其类…

Spring MVC Ajax返回中文乱码

因为Spring MVC中返回json要使用ResponseBody注解&#xff0c;而在Spring源码中这个注解的默认编码是“iso-8859-1”&#xff0c;所以传中文的话会乱码。解决办法是&#xff0c;直接使用response的writer来返回json数据。 RequestMapping(path"/receive",methodReque…

OC Swift中UITextFiled、UITextView限制输入字数

OC中限制字数的方法 我是用通知实现的&#xff0c;首先添加UITextFiled和UITextView的接收中心 [[NSNotificationCenter defaultCenter] addObserver:self selector:selector(textViewNotifitionAction:) name:UITextViewTextDidChangeNotification object:nil];[[NSNotificati…