- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个函数,可以将给定的输入序列转换为请求顺序的转换矩阵。我找到了一阶马尔可夫转移矩阵的实现。
现在,我希望能够提出一个可以计算二阶和三阶转换矩阵的解决方案。
一阶矩阵实现示例:
import numpy as np
# sequence with 3 states -> 0, 1, 2
a = [0, 1, 0, 0, 0, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2, 2, 2, 0, 0, 2]
def transition_matrix_first_order(seq):
M = np.full((3, 3), fill_value = 1/3, dtype= np.float64)
for (i,j) in zip(seq, seq[1:]):
M[i, j] += 1
M = M / M.sum(axis = 1, keepdims = True)
return M
print(transition_matrix_first_order(a))
这给了我这个:
[[0.61111111 0.19444444 0.19444444]
[0.38888889 0.38888889 0.22222222]
[0.22222222 0.22222222 0.55555556]]
创建二阶矩阵时,它应该具有 unique_state_count ** order
行和 unique_state_count
列。在上面的示例中,我有 3 个独特的状态,因此矩阵将具有 9x3 结构。期望的功能示例:cal_tr_matrix(seq, unique_state_count, order)
最佳答案
我认为您对马尔可夫链及其转移矩阵有轻微的误解。
首先,不幸的是,您的函数生成的估计转移矩阵不正确。为什么?让我们刷新一下。
具有 N
个不同状态的离散时间的离散马尔可夫链具有大小为 N x N
的转移矩阵 P
,其中 a (i , j) 元素为P(X_1=j|X_0=i)
,即a中从状态i
转移到状态j
的概率单时间步长。
现在,n
阶的转换矩阵(表示为 P^{n}
)又是一个大小为 N x N
的矩阵,其中(i, j)元素为P(X_n=j|X_0=i)
,即从状态i
转换到状态j
的概率在n
个时间步内。
一个美妙的结果是:P^{n} = P^n
,即采用单步转移矩阵的 n
次幂可以得到 n
-步转移矩阵。
现在回顾一下,所需要的只是根据给定序列估计 P
,然后估计 P^{n}
就可以使用已经估计的P
并取矩阵的 n
次方。那么如何估计矩阵P
呢?好吧,如果我们将 N_{ij}
表示为从状态 i
转换到状态 j
的观察次数,并且 N_{i*}
处于状态 i
的观测值数量,则 P_{ij} = N_{ij}/N_{i*}
。
Python 中的总体情况:
import numpy as np
def transition_matrix(arr, n=1):
""""
Computes the transition matrix from Markov chain sequence of order `n`.
:param arr: Discrete Markov chain state sequence in discrete time with states in 0, ..., N
:param n: Transition order
"""
M = np.zeros(shape=(max(arr) + 1, max(arr) + 1))
for (i, j) in zip(arr, arr[1:]):
M[i, j] += 1
T = (M.T / M.sum(axis=1)).T
return np.linalg.matrix_power(T, n)
transition_matrix(arr=a, n=1)
>>> array([[0.63636364, 0.18181818, 0.18181818],
>>> [0.4 , 0.4 , 0.2 ],
>>> [0.2 , 0.2 , 0.6 ]])
transition_matrix(arr=a, n=2)
>>> array([[0.51404959, 0.22479339, 0.26115702],
>>> [0.45454545, 0.27272727, 0.27272727],
>>> [0.32727273, 0.23636364, 0.43636364]])
transition_matrix(arr=a, n=3)
>>> array([[0.46927122, 0.23561232, 0.29511645],
>>> [0.45289256, 0.24628099, 0.30082645],
>>> [0.39008264, 0.24132231, 0.36859504]])
有趣的是,当您将阶 n
设置为相当高的数字时,P
矩阵的越来越高的幂似乎会收敛到一些非常特定的值。这被称为马尔可夫链的平稳/不变分布,它很好地表明了该链在很长一段时间内/过渡期间的行为方式。另外:
P = transition_matrix(a, 1)
P111 = transition_matrix(a, 111)
print(P)
print(P111.dot(P))
编辑:现在根据您的评论调整解决方案,我建议使用更高维的矩阵来实现更高的阶数,而不是增加行数。一种方法是这样的:
def cal_tr_matrix(arr, order):
_shape = (max(arr) + 1,) * (order + 1)
M = np.zeros(_shape)
for _ind in zip(*[arr[_x:] for _x in range(order + 1)]):
M[_ind] += 1
return M
res1 = cal_tr_matrix(a, 1)
res2 = cal_tr_matrix(a, 2)
现在元素 res1[i, j]
表示 i->j 发生了多少次转换,而元素 res2[i, j, k]
表示发生了多少次转换很多次 i->j->k 的转变发生了。
关于python - 从给定序列构建 N 阶马尔可夫转移矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58048810/
如果我将我的个人 repo 转移到一个组织(由我创建),我将失去所有 见解 例如来自原始 Repo 的流量历史记录、拉取请求、贡献者、 fork 等? 最佳答案 拉取请求被保留:参见“About re
如何为解析 if-then[-else] 案例制定正确的规则?这是一些语法: { module TestGram (tparse) where } %tokentype { String }
如何为解析 if-then[-else] 案例制定正确的规则?这是一些语法: { module TestGram (tparse) where } %tokentype { String }
我读过有关mutex的信息,这些信息由线程拥有,并且只能由拥有的线程使用。在this answer中,该解决方案建议每个进程在发出互斥信号之前,必须拥有互斥锁的所有权。我必须在这里承认自己的愚蠢,不知
我只能从回调函数之一中想到 curl_close() 。 但是 php 抛出了一个警告: PHP 警告:curl_close():尝试从回调中关闭 cURL 句柄。 任何想法如何做到这一点? 最佳答案
带有冲突的语法的精简版本: body: variable_list function_list; variable_list: variable_list variable | /* empty
我创建了新的开发者帐户,然后将应用程序转移到新帐户。然后我在新帐户下创建了相同的标识符。并构建App并上传到AppStore。 I have got the warning with WARNING
我想像这样管理类主任的所有 Activity : 此外所有 Activity 都扩展基本 Activity 以使用公共(public) View 。 在这种情况下,我想处理传输 Activity ,例
使用 C 中的简单链表实现,我如何告诉 Splint 我正在转让 data 的所有权? typedef struct { void* data; /*@null@*/ void* ne
请参阅以下 yacc 代码。如果我删除生产因素:'!' expr,解析冲突消失。这里发生了什么? %{ #include #include %} %token TRUE %token FALSE
是否可以将 props 向下传输到子组件,其中 { ..this.props } 用于更简洁的语法,但是排除某些 props,如 className 或 id? 最佳答案 您可以使用解构来完成这项工作
如果我有以下数据框: date A B M S 20150101 8 7 7.5 0 20150101 10 9 9
我需要将一个 __m128i 变量(比如 v)移动 m 位,以便位移动所有变量(因此,结果变量表示 v*2^m)。执行此操作的最佳方法是什么?! 请注意 _mm_slli_epi64 分别移动 v0
我需要这样调用我的程序: ./program hello -r foo bar 我从 argv[1] 中打招呼,但我在使用值 bar 时遇到问题,我是否也应该将“r:”更改为其他内容? while((
我是新来的 Bison我在转换/减少冲突方面遇到了麻烦...我正在尝试从文件加载到 array data[] : struct _data { char name[50]; char sur
当然有很多关于解决移位/归约错误的文档和方法。 Bison 文档建议正确的解决方案通常是%期待它们并处理它。 当你遇到这样的事情时: S: S 'b' S | 't' 您可以像这样轻松解决它们: S:
我有以下(大量精简的)快乐语法 %token '{' { Langle } '}' { Rangle } '..' { DotDot } '::' { ColonC
我的 Bison 解析器中有很多错误,即使它运行良好,我也想了解这些冲突。代码如下: 词法分析器: id ([[:alpha:]]|_)([[:alnum:]]|_)* %% {id
在我的项目中,我有这样的情况,一个 Activity 应该将值(value)转移到另一个 Activity 。并且根据这个值应该选择需要的菜单元素。我试图在 bundle 的帮助下做到这一点,但我不知
我一直在阅读 NSIndexPaths 以获得 uitableviews 等。但是我很难操纵现有的索引路径。 我想在保留行的同时采用现有的索引路径递增/移动每个部分。因此 indexPath.sect
我是一名优秀的程序员,十分优秀!