从序列数据估计马尔可夫转移概率

机器算法验证 r matlab 马尔科夫过程
2022-02-01 20:02:18

我有 4 个状态的全套序列(准确地说是 432 个观察值)AD:例如

Y=(ACDDBACBAACABCADABA)

编辑:观察序列的长度不等!这有什么改变吗?

有没有计算转移矩阵的方法

Pij(Yt=j|Yt1=i)
在 Matlab 或 R 或​​类似的?我认为 HMM 包可能会有所帮助。有什么想法吗?

例如:估计马尔可夫链概率

3个回答

请检查上面的评论。这是 R 中的快速实现。

x <- c(1,2,1,1,3,4,4,1,2,4,1,4,3,4,4,4,3,1,3,2,3,3,3,4,2,2,3)
p <- matrix(nrow = 4, ncol = 4, 0)
for (t in 1:(length(x) - 1)) p[x[t], x[t + 1]] <- p[x[t], x[t + 1]] + 1
for (i in 1:4) p[i, ] <- p[i, ] / sum(p[i, ])

结果:

> p
          [,1]      [,2]      [,3]      [,4]
[1,] 0.1666667 0.3333333 0.3333333 0.1666667
[2,] 0.2000000 0.2000000 0.4000000 0.2000000
[3,] 0.1428571 0.1428571 0.2857143 0.4285714
[4,] 0.2500000 0.1250000 0.2500000 0.3750000

MATLAB 中的一个(可能是愚蠢的)实现(我从未使用过,所以我不知道这是否可行。我刚刚搜索了“声明向量矩阵 MATLAB”以获取语法):

x = [ 1, 2, 1, 1, 3, 4, 4, 1, 2, 4, 1, 4, 3, 4, 4, 4, 3, 1, 3, 2, 3, 3, 3, 4, 2, 2, 3 ]
n = length(x) - 1
p = zeros(4,4)
for t = 1:n
  p(x(t), x(t + 1)) = p(x(t), x(t + 1)) + 1
end
for i = 1:4
  p(i, :) = p(i, :) / sum(p(i, :))
end

这是我在 R 中的实现

x <- c(1,2,1,1,3,4,4,1,2,4,1,4,3,4,4,4,3,1,3,2,3,3,3,4,2,2,3)
xChar<-as.character(x)
library(markovchain)
mcX<-markovchainFit(xChar)$estimate
mcX

这是在 Matlab 中执行此操作的一种方法:

x = [1,2,1,1,3,4,4,1,2,4,1,4,3,4,4,4,3,1,3,2,3,3,3,4,2,2,3];
counts_mat = full(sparse(x(1:end-1),x(2:end),1));
trans_mat = bsxfun(@rdivide,counts_mat,sum(counts_mat,2))

感谢 SomptingGuy:http ://www.eng-tips.com/viewthread.cfm?qid=236532