画星星高手

It nerver rains but it pours.

机器学习之MarkovChains简单应用

MarkovChains原理简介

马尔可夫链是满足马尔可夫性质的随机过程。

《机器学习之MarkovChains简单应用》马尔可夫链(Markov Chain),描述了一种状态序列,其每个状态值取决于前面有限个状态。马尔可夫链是具有马尔可夫性质的随机变量的一个数列。这些变量的范围,即它们所有可能取值的集合,被称为“状态空间”,而 的值则是在时间n的状态。如果 对于过去状态的条件概率分布仅是 的一个函数,则
《机器学习之MarkovChains简单应用》

理论发展

马尔可夫在1906年首先做出了这类过程。而将此一般化到可数无限状态空间是由柯尔莫果洛夫在1936年给出的。

马尔可夫链通常用来建模排队理论和统计学中的建模,还可作为信号模型用于熵编码技术,如算术编码(著名的LZMA数据压缩算法就使用了马尔可夫链与类似于算术编码的区间编码)。马尔可夫链也有众多的生物学应用,特别是人口过程,可以帮助模拟生物人口过程的建模。隐蔽马尔可夫模型还被用于生物信息学,用以编码区域或基因预测。

现实应用

蒙特卡洛模型

在现实生活中,鉴于未知参数的后验分布多为高维、复杂的非常见分布,对这些高维积分进行计算十分困难,这一困难使得贝叶斯推断方法在实践中的应用受到很大的限制,在很长一段时间,贝叶斯推断主要用于处理简单低维的问题,以避免计算上的困难。MCMC(Markov Chain MonteCarlo)方法突破了这一原本极为困难的计算问题,它通过模拟的方式对高维积分进行计算,进而使原本异常复杂的高维积分计算问题迎刃而解,使贝叶斯方法仅适用于解决简单低维问题的状况大有改观,为贝叶斯方法的应用开辟了新的道路。MCMC———马尔科夫链蒙特卡罗方法产生于19世纪50年代早期,是在贝叶斯理论框架下,通过计算机进行模拟的 MonteCarlo方法,该方法将Markov过程引入到MonteCarlo模拟中,实现随着抽样分布随机模拟的进行而改变的动态模拟,弥补了传统的蒙特卡罗积分只能静态模拟的缺陷,是近年来广泛应用的统计计算方法。

状态统计建模

马尔可夫链通常用来建模排队理论和统计学中的建模,还可作为信号模型用于熵编码技术,如算法编码。马尔可夫链最近的应用是在地理统计学(geostatistics)中。其中,马尔可夫链用在基于观察数据的二到三维离散变量的随机模拟。这一应用类似于“克里金”地理统计学(Kriging geostatistics),被称为是“马尔可夫链地理统计学”。这一马尔可夫链地理统计学方法仍在发展过程中。除此之外,马尔科夫链预测法是一种适用于随机过程的科学、有效的动态预测方法。其基本原理和方法可用来预测企业产品的市场占有率。

本文所涉及的

单纯看这个MarkovChains是很复杂的,涉及到的东西很多,今天本文主要研究的是它在文章分析、词汇联想方面的运用。
其实很多输入法都有这个应用,输入法可以根据用户的输入习惯动态调节联想词的词频,这个也是涉及到机器学习的内容,可以说,机器学习技术在我们的生活中无处不在。

本文使用的编程语言

Python
原因无他,就是简单,MarkovChains大量用到字典结构,Python可以很方便构建与处理这类结构,详情见我之前写的这篇文章:享受Python和PHP动态类型检查语言的快感

基本思路分析

  1. 输入一段话(本文以英文作为分析语言)
  2. 将每个词放到一个数据集合中
  3. 为数据集合中的每一个元素设定一个状态
  4. 计算状态间转化的概率
    简单来说就是某个单词后面出现的下一个单词是什么,出现的概率为多少。

代码

首先是对输入数据的预处理,删掉标点符号以及数字。

import re

InputData = input("Please enter the data:").lower()
InputData = InputData.replace('.', '')
InputData = InputData.replace('"', '')
InputData = InputData.replace(',', '')
InputData = InputData.replace('“', '')
InputData = InputData.replace('”', '')
InputData = re.sub("\d+", '', InputData) # 去掉数字

接下来创建数据模型:

InputArray = InputData.split(' ')

Dict = {}

index = 0

for item in InputArray:
    item = item.strip()

    # 是否为最后一个元素
    if not index >= len(InputArray) - 1:
        nextItem = InputArray[index + 1]
    else:
        break

    if item not in Dict:
        Dict[item] = {}

    if InputArray[index + 1] in Dict[item]:
        Dict[item][nextItem] += 1
    else:
        Dict[item][nextItem] = 1

    index += 1

结果匹配:

InputData = input("Please enter the word:").lower()

    if InputData in Dict:
        candidates = ''
        for item in Dict[InputData]:
            candidates += item + ','

        print("Candidates:%s" % candidates)

这里只是做了最基本的数据模型构建,还没有计算转化频率,由于我最近空闲时间不多,我会在接下来的更新中完善本文。

(待续…)


我的微信公众号:DealiAxy

《机器学习之MarkovChains简单应用》

It never rains but it pours. 欢迎关注我的公众号:DealiAxy 提供更多技术文章

点赞

发表评论