在这篇文章中我将介绍因为一时心血来潮写的关于马尔科夫链的代码以及关于它的简介。
一、 马尔科夫链的简介
马尔科夫链是一种数学模型,用于描述一系列状态之间的转换过程,其中每个状态的概率仅依赖于当前状态,而不依赖于先前的状态。这种特性被称为“马尔科夫性质”或“无后效性”。
二、有关概念
在马尔科夫链中存在一些概念,下面我将简单介绍下这些概念:
2.1 状态
马尔科夫链是由系列的状态组成,每一种状态都代表同一种可能。
2.2 状态转移
在马尔科夫链中,一种状态可以转移至另一种状态,而这种转换的概率只依靠当前的状态。
2.3 状态转移矩阵
在状态转移转移中,我们可以用一个矩阵来表示它,而这个表示它的矩阵就是状态转移矩阵。矩阵中的每个元素 pij表示从状态 i 转移到状态 j 的概率。
三、马尔科夫链的应用
马尔科夫链可以在多方面应用,比如我接下来用代码展示的自然语言的处理,其中我们通过训练文本的单词序列来生成新的句子;此外,其还可以应用于金融中来模拟资产价格的变化,以此规避风险等;然后在一些算法中比如优先搜索策略等同样应用了它,而关于这方面的具体案例就是谷歌的PageRank算法,除却上述这些还有应用,不过在此不再赘述。
四、python代码实例
import random
import re
def Markov_generate(path):# 生成一个马尔科夫链
frequency_list = []
word_list = []
first_words_list = []
# 读取文件
with open(path,'r',encoding='utf-8') as file:
text = file.read()
words = re.findall(r'\b\w+\b|[.,!?"]',text)
first_words_list.append(words[0])
for i in range(len(words)-1):
if words[i] == '.': # 存储所有句子开头第一个单词,作为生成的起始
first_words_list.append(words[i+1])
if words[i] in word_list: # 往单词顺序表与频率表中添加与补充
index = word_list.index(words[i])
if words[i+1] in frequency_list[index]:
frequency_list[index][words[i+1]] += 1
else:
frequency_list[index][words[i+1]] = 1
else:
word_list.append(words[i])
dic = {}
dic[words[i+1]] = 1
frequency_list.append(dic)
return word_list, frequency_list, first_words_list
def article_generate(word_list, frequency_list, first_words_list):# 通过马尔科夫链生成句子
now_word = random.choice(first_words_list)
while True:
print(now_word,end=" ")
index = word_list.index(now_word)
temporary_list = [key for key, value in frequency_list[index].items()
for _ in range(value)]
now_word = random.choice(temporary_list)
temporary_list.clear()
if now_word == '.':# 遇到句号直接休止
print(now_word)
break
def main():
path = r"C:\Users\20349\Desktop\ArtificialIntelligence\Markov\Markov_text.txt"
word_list, frequency_List, first_words_list = Markov_generate(path)
article_generate(word_list, frequency_List, first_words_list)
if __name__ == '__main__':
main()
下图是该代码生成的句子:
从这些生成的句子中,我们不难发现它们会出现语法结构的错误,但这不可避免,因为它是依靠概率产生的,除非进行更高阶的马尔科夫链、NLP技术或预处理或后处理等。
五、代码流程图
此上