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


16

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

Y=(ACDDBACBAACABCADABA)

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

有没有一种方法可以在Matlab或R或类似程序中计算转换矩阵?我认为HMM软件包可能会有所帮助。有什么想法吗?

Pij(Yt=j|Yt1=i)

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


3
您有4个状态:S={1:=A,2:=B,3:=C,4:=D}。让nij是的次数的链由从状态转变i到状态j,为ij,=1,2,3,4。计算nij“从试样S并估计转移矩阵(pij)使用由估计最大似然pĴ = Ñ Ĵ / Σ 4 Ĵ = 1 ñ Ĵp^ij=nij/j=14nij
2012年



@B_Miner您能为我以伪代码形式编写代码吗?或以通俗易懂的方式对其进行解释...但是,我发现它可以在我的R控制台中使用。
HCAI

我有一个问题:我理解您的实现,并且对我来说很好,但是我想知道为什么我不能简单地使用Matlab hmmestimate函数来计算T矩阵?诸如此类:states = [1,2,3,4] [T,E] = hmmestimate(x,状态);T是我感兴趣的转换矩阵。我是Markov链和HMM的新手,所以我想了解两个实现之间的区别(如果有)。
任何

Answers:


18

请检查上面的评论。这是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中的一个(可能是愚蠢的)实现(我从未使用过,所以我不知道这是否行得通。我只是在Google上搜索“声明矢量矩阵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

看起来很棒!我不确定第三行在代码中的作用(主要是因为我熟悉Matlab)。您有可能用Matlab或伪代码编写它吗?我有义务。
HCAI 2012年

2
第三行执行此操作:链值为。对于t = 1 n 1,递增p xx1,,xnt=1,,n1pxt,xt+1
2012年

第四行归一化矩阵的各行(pij)
2012年

裸露我的迟钝。我确实感谢MATLAB代码翻译,尽管我仍然看不到它在第一个for循环中试图做什么。原始代码的第三行计算从状态x i到状态x j的次数。如果您能说出来,我将非常感激。干杯xxixj
HCAI 2012年

1
No, x is just one row. Don't concatenate because you will introduce "false" transitions: last state of one line first state of the next line. You have to change the code to loop through the lines of your matrix and count the transitions. At the end, normalize each line of the transition matrix.
Zen

9

这是我在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

1
user32041的请求(由于他/她缺乏声誉,因此被发布为编辑而不是评论):如何将markovchainFit结果的transitionMatrix强制转换为data.frame?
chl 2013年

您可以将其转换为使用一个小号ç X d 一个˚F ř ë data.frameas(mcX,"data.frame")
乔治Spedicato

@GiorgioSpedicato您能否在您的包装中评论如何处理不等长的序列(我无法串联)?
HCAI

@HCAI,请查看当前的小插曲页35-36
乔治Spedicato

@GiorgioSpedicato感谢您提供参考cran.r-project.org/web/packages/markovchain/vignettes/…。我仍然有n个转换矩阵,每个序列一个。我所追求的是一种将所有序列观察都考虑在内的通用方法。有什么我想念的吗?
HCAI

2

这是在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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.