🍠Python | R 雌雄配对和鱼仔变异马尔可夫链

关键词

Python | R | 算法 | 天气 | 马尔可夫 | 矩阵 | 数学 | 概率 | 统计 | 多项式 | 高斯 | 似然 | 贝叶斯 | 近似 | 词类 | 决策过程 | 张量 | 动物 | 文本 | 语义 | 情感 | 基调 | 雌雄 | 配对 | 光谱 | 辐射 | 传输 | 鱼仔 | 变异 | 种群 | 谱系 | 麻疹 | 传播 | 卡尔曼 | 逆向 | 受限玻尔兹曼机 | 数学

🏈指点迷津 | Brief

🎯要点

🎯马尔可夫链:🖊天气状态马尔可夫链和马尔科夫矩阵 | 🖊多项式隐马尔可夫模型,及其高斯分布 | 🖊算法:前向、后向、前向-后向、维特比算法 | 🖊最大似然学习、特里-韦尔奇算法 | 🖊隐马尔可夫模型贝叶斯学习、估计分布的近似算法 | 🖊词类消歧隐马尔可夫模型 | 🖊马尔可夫决策过程。

🎯马尔可夫模型场景:🎯张量网络分解马尔可夫链 | 🎯动物移动最大似然分析 | 🎯文本语义聚类情感基调分析 | 🎯雌雄动物展示率建模分析配对率 | 🎯光谱能量分布与辐射传输模型 | 🎯鱼仔跨越时间尺度变异运动序列马尔可夫模型 | 🎯种群谱系精确表示 | 🎯麻疹感染传播和潜在风险模型 | 🎯机器人自适应动态学习无迹卡尔曼滤波器和隐马尔可夫模型 | 🎯逆向强化学习逼近正确界限 | 🎯受限玻尔兹曼机训练模型。

🍇Python马尔可夫链计算日常规律

马尔可夫链是具有马尔可夫性质的随机过程。随机过程或通常称为随机性质,是定义为随机变量集合的数学对象。马尔可夫链具有离散状态空间(随机变量的可能值集)或离散索引集(通常表示时间)——鉴于这一事实,马尔可夫链存在许多变体。通常术语“马尔可夫链”专指具有离散时间集的过程,即离散时间马尔可夫链。

离散时间马尔可夫链涉及一个在每个步骤都处于特定状态的系统,并且状态在步骤之间随机变化。这些步数通常被认为是时间上的时刻(但您也可以参考物理距离或任何其他离散测量)。离散时间马尔可夫链是具有马尔可夫性质的随机变量 X1,X2,X3,X_1, X_2, X_3, \ldots 的序列,使得移动到下一个状态的概率仅取决于当前状态而不取决于先前状态。这是数学概率公式:

Pr(Xn+1=xx1=x1,x2=x2,,xn=xn)=Pr(xn+1=xxn=xn)\operatorname{Pr}\left(X_{n+1}=x \mid x_1=x_1, x_2=x_2, \ldots, x_n=x_n\right)=\operatorname{Pr}\left(x_{n+1}=x \mid x_n=x_n\right)

正如您所看到的,Xn+1X_{n+1} 的概率仅取决于它之前的 X_n 的概率。这意味着前一个状态的知识是确定当前状态的概率分布所必需的,满足条件独立规则(或者换句话说:您只需要知道当前状态即可确定下一个状态)。

XiX_i 的可能值形成一个可数集合S,称为链的状态空间。状态空间可以是任何东西:字母、数字、篮球比分或天气状况。虽然时间参数通常是离散的,但离散时间马尔可夫链的状态空间没有任何广泛认可的限制,而是指任意状态空间上的过程。然而,马尔可夫链的许多应用都采用有限或可数无限状态空间,因为它们具有更直接的统计分析。

让我们看一个简单的例子来理解这些概念:

当 C 悲伤时(这种情况并不常见):她要么去跑步,要么吃冰淇淋,要么小睡一会儿。从历史数据来看,如果她度过了悲伤的一天。第二天她有 60% 的可能性会去跑步,20% 的可能性她会躺在床上,还有 20% 的可能性她会大吃冰淇淋。

当她悲伤并去跑步时,她第二天有 60% 的机会去跑步,30% 的机会她狼吞虎咽地吃冰淇淋,只有 10% 的机会她第二天会去睡觉。

最后,当她在悲伤的一天沉迷于冰淇淋时,她第二天继续吃冰淇淋的可能性只有 10%,她有 70% 的可能性会去跑步,有 20% 的可能性她第二天会去睡觉天。

状态图中描绘的马尔可夫链有 3 种可能的状态:睡眠、跑步、冰淇淋。因此,转换矩阵将是 3 x 3 矩阵。请注意,退出状态的箭头总和始终恰好为 1,类似地,转换矩阵中每行的条目总和也必须恰好为 1 - 表示概率分布。在转换矩阵中,单元格的作用与状态图中箭头的作用相同。

 睡觉  跑步  冰激凌  睡觉 0.20.60.2 跑步 0.10.60.3 冰激凌 0.20.70.1\begin{array}{|l|l|l|l|} \hline & \text { 睡觉 } & \text { 跑步 } & \text { 冰激凌 } \\ \hline \text { 睡觉 } & 0.2 & 0.6 & 0.2 \\ \hline \text { 跑步 } & 0.1 & 0.6 & 0.3 \\ \hline \text { 冰激凌 } & 0.2 & 0.7 & 0.1 \\ \hline \end{array}

现在您已经看到了这个示例,这应该能让您了解与马尔可夫链相关的不同概念。

通过您所看到的示例,您现在可以回答以下问题:“从状态:睡眠开始,C 在令人悲伤的 2 天持续时间结束时(状态:跑步)的概率是多少?”

💦建模分析

 import numpy as np
 import random as rm

现在让我们定义状态及其概率:转移矩阵。请记住,该矩阵将是 3 X 3 矩阵,因为您具有三种状态。此外,您还必须定义转换路径,您也可以使用矩阵来完成此操作。

 states = ["Sleep","Icecream","Run"]
 transitionName = [["SS","SR","SI"],["RS","RR","RI"],["IS","IR","II"]]
 transitionMatrix = [[0.2,0.6,0.2],[0.1,0.6,0.3],[0.2,0.7,0.1]]

一定要确保概率总和为 1。而且留下错误消息也没什么坏处,至少在编码时是这样!

 if sum(transitionMatrix[0])+sum(transitionMatrix[1])+sum(transitionMatrix[1]) != 3:
     print("Somewhere, something went wrong. Transition matrix, perhaps?")
 else: print("All is gonna be okay, you should move on!! ;)")
 ​

现在让我们编写实际的代码。您将使用 numpy.random.choice 从可能的转换集合中生成随机样本。虽然它的大多数参数都是不言自明的,但 p 可能不是。它是一个可选参数,可让您输入采样集的概率分布,在本例中为转换矩阵。

 def activity_forecast(days):
     activityToday = "Sleep"
     print("Start state: " + activityToday)
   
     activityList = [activityToday]
     i = 0
     prob = 1
     while i != days:
         if activityToday == "Sleep":
             change = np.random.choice(transitionName[0],replace=True,p=transitionMatrix[0])
             if change == "SS":
                 prob = prob * 0.2
                 activityList.append("Sleep")
                 pass
             elif change == "SR":
                 prob = prob * 0.6
                 activityToday = "Run"
                 activityList.append("Run")
             else:
                 prob = prob * 0.2
                 activityToday = "Icecream"
                 activityList.append("Icecream")
         elif activityToday == "Run":
             change = np.random.choice(transitionName[1],replace=True,p=transitionMatrix[1])
             if change == "RR":
                 prob = prob * 0.5
                 activityList.append("Run")
                 pass
             elif change == "RS":
                 prob = prob * 0.2
                 activityToday = "Sleep"
                 activityList.append("Sleep")
             else:
                 prob = prob * 0.3
                 activityToday = "Icecream"
                 activityList.append("Icecream")
         elif activityToday == "Icecream":
             change = np.random.choice(transitionName[2],replace=True,p=transitionMatrix[2])
             if change == "II":
                 prob = prob * 0.1
                 activityList.append("Icecream")
                 pass
             elif change == "IS":
                 prob = prob * 0.2
                 activityToday = "Sleep"
                 activityList.append("Sleep")
             else:
                 prob = prob * 0.7
                 activityToday = "Run"
                 activityList.append("Run")
         i += 1  
     print("Possible states: " + str(activityList))
     print("End state after "+ str(days) + " days: " + activityToday)
     print("Probability of the possible sequence of states: " + str(prob))
 ​
 activity_forecast(2)
 ​
 Start state: Sleep
 Possible states: ['Sleep', 'Sleep', 'Run']
 End state after 2 days: Run
 Probability of the possible sequence of states: 0.12

从状态“睡眠”开始,您将获得一组随机的可能转换及其发生的概率。进一步扩展程序,可能以相同的起始状态迭代几百次,然后您可以看到在任何特定状态结束的预期概率及其概率。让我们重写函数 activity_forecast 并添加一组新的循环来执行此操作...

 def activity_forecast(days):
     activityToday = "Sleep"
     activityList = [activityToday]
     i = 0
     prob = 1
     while i != days:
         if activityToday == "Sleep":
             change = np.random.choice(transitionName[0],replace=True,p=transitionMatrix[0])
             if change == "SS":
                 prob = prob * 0.2
                 activityList.append("Sleep")
                 pass
             elif change == "SR":
                 prob = prob * 0.6
                 activityToday = "Run"
                 activityList.append("Run")
             else:
                 prob = prob * 0.2
                 activityToday = "Icecream"
                 activityList.append("Icecream")
         elif activityToday == "Run":
             change = np.random.choice(transitionName[1],replace=True,p=transitionMatrix[1])
             if change == "RR":
                 prob = prob * 0.5
                 activityList.append("Run")
                 pass
             elif change == "RS":
                 prob = prob * 0.2
                 activityToday = "Sleep"
                 activityList.append("Sleep")
             else:
                 prob = prob * 0.3
                 activityToday = "Icecream"
                 activityList.append("Icecream")
         elif activityToday == "Icecream":
             change = np.random.choice(transitionName[2],replace=True,p=transitionMatrix[2])
             if change == "II":
                 prob = prob * 0.1
                 activityList.append("Icecream")
                 pass
             elif change == "IS":
                 prob = prob * 0.2
                 activityToday = "Sleep"
                 activityList.append("Sleep")
             else:
                 prob = prob * 0.7
                 activityToday = "Run"
                 activityList.append("Run")
         i += 1    
     return activityList
 ​
 list_activity = []
 count = 0
 ​
 for iterations in range(1,10000):
         list_activity.append(activity_forecast(2))
 ​
 for smaller_list in list_activity:
     if(smaller_list[2] == "Run"):
         count += 1
 ​
 percentage = (count/10000) * 100
 print("The probability of starting at state:'Sleep' and ending at state:'Run'= " + str(percentage) + "%")
 ​
 The probability of starting at state:'Sleep' and ending at state:'Run'= 62.419999999999995%

这其实就是“大数定律”,这是概率原理之一,即只有当试验次数或实例足够多时,发生概率相同的事件的频率才会趋于平衡。换句话说,随着试验次数的增加,实际结果比率将趋近于理论或预期结果比率。

Last updated