FindHiddenMarkovStates[data,hmm]
找出输出数据 data 对应的隐马尔可夫过程(HiddenMarkovProcess)hmm 的最大似然隐状态.
FindHiddenMarkovStates[data,hmm,crit]
按给定的准则 crit 来找出隐状态.
FindHiddenMarkovStates
FindHiddenMarkovStates[data,hmm]
找出输出数据 data 对应的隐马尔可夫过程(HiddenMarkovProcess)hmm 的最大似然隐状态.
FindHiddenMarkovStates[data,hmm,crit]
按给定的准则 crit 来找出隐状态.
更多信息
- FindHiddenMarkovStates 也被称为隐状态破译或 Viterbi 破译.
- 输出数据 data 可以是列表或 TemporalData 对象.
- FindHiddenMarkovStates 以和输出数据 data 相同的形式返回隐状态路径. 若在 data 中有多条路径,则也会返回多条隐状态路径.
- 准则 crit 可能的值包括:
-
"ViterbiDecoding" 隐状态序列的最大似然(默认) "PosteriorDecoding" 每个时间点隐状态的最大似然 - 给定一个输出序列
,"ViterbiDecoding" 最大化状态序列作为一个整体的概率
,而 "PosteriorDecoding" 最大化每个时刻状态值的概率
.
范例
打开所有单元 关闭所有单元基本范例 (1)
假设我们观察一枚公平硬币(状态 1)和一枚不公平硬币(状态 2)的输出:
hmm = HiddenMarkovProcess[{0.8, 0.2}, {{0.8, 0.2}, {0.3, 0.7}}, {{0.5, 0.5}, {0.1, 0.9}}];tosses = TemporalData[Automatic, {{{1, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2}},
{{0, 20, 1}}, 1, {"Discrete", 1}, {"Discrete", 1}, 1,
{ValueDimensions -> 1, MetaInformation -> {}}}, False, 10.];FindHiddenMarkovStates[tosses, hmm]BarChart[%, Ticks -> {Automatic, {{1, "Fair"}, {2, "Unfair"}}}]范围 (7)
输入为列表时,FindHiddenMarkovStates 也把隐状态序列输出为列表:
hmm = HiddenMarkovProcess[{0.8, 0.2}, {{0.8, 0.2}, {0.3, 0.7}}, {ExponentialDistribution[1.1], ExponentialDistribution[0.3]}];FindHiddenMarkovStates[{0.3, 3.8, 3.2, 1.2, 0.8}, hmm]对 TemporalData 形式的输入,输出也是和输入有同样类型的时间序列对象:
ts = TimeSeries[{0.3, 3.8, 3.2, 1.2, 0.8}];FindHiddenMarkovStates[ts, hmm]FindHiddenMarkovStates 映射到独立的路径上:
𝒫 = HiddenMarkovProcess[{0.3, 0.7}, {{0.5, 0.5}, {0.3, 0.7}}, {NormalDistribution[-0.1, 0.03], NormalDistribution[0.4, 0.05]}];em1 = {0.3, -0.2, 0.1};
em2 = {0.1, 0.2, 0.3};FindHiddenMarkovStates[{em1, em2}, 𝒫]{FindHiddenMarkovStates[em1, 𝒫], FindHiddenMarkovStates[em2, 𝒫]}𝒫 = HiddenMarkovProcess[{1 / 2, 1 / 2}, {{0.7, 0.3}, {0.2, 0.8}}, {{1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6}, {1 / 10, 1 / 10, 1 / 10, 1 / 10, 1 / 10, 1 / 2}}];data = {6, 6, 6, 3, Missing[], Missing[], 5, 1, Missing[], 5, 4};FindHiddenMarkovStates[data, 𝒫]hmm = HiddenMarkovProcess[{0.4, 0.3, 0.3}, {{0, 0.5, 0.5}, {0.4, 0, 0.6}, {0.55, 0.45, 0}}, {{0.7, 0.2, 0.1}, {0.2, 0.6, 0.2}, {0, 0.3, 0.7}}];obs = {1, 3, 2, 3, 3, 2, 2, 3, 2, 1, 2, 2, 3, 1, 2, 2};FindHiddenMarkovStates[obs, hmm, "ViterbiDecoding"]FindHiddenMarkovStates[obs, hmm, "PosteriorDecoding"]𝒫 = HiddenMarkovProcess[{0.3, 0.7}, {{0.5, 0.5}, {0.3, 0.7}}, {NormalDistribution[-1.2, 0.3], NormalDistribution[2.3, 0.5]}];data = RandomFunction[𝒫, {0, 20}, Method -> {"IncludeHiddenStates" -> True}]stateseq = FindHiddenMarkovStates[data, 𝒫]actualstates = data["HiddenStates"];
ArrayPlot[{stateseq["Values"], actualstates["Values"]}, Mesh -> All, ColorRules -> {1 -> White, 2 -> Black}]emdists = {BinormalDistribution[{1, 0}, {0.45, 0.45}, -0.4], BinormalDistribution[{0, -1}, {0.45, 0.45}, 0.4], BinormalDistribution[{-1, 0}, {0.45, 0.45}, -0.4], BinormalDistribution[{0, 1}, {0.45, 0.45}, 0.4]};𝒫 = HiddenMarkovProcess[{0.25, 0.25, 0.25, 0.25}, {{0.4, 0.6, 0, 0}, {0.4, 0, 0.6, 0}, {0.4, 0, 0, 0.6}, {0, 0.9, 0.1, 0}}, emdists];data = RandomFunction[𝒫, {0, 23}, Method -> {Automatic, "IncludeHiddenStates" -> True}];estates = FindHiddenMarkovStates[data, 𝒫]actualstates = data["HiddenStates"];
ArrayPlot[{estates["Values"], actualstates["Values"]}, Mesh -> All]jointLogLikelihood[states_, obs_] := LogLikelihood[DiscreteMarkovProcess[𝒫], states] + Sum[LogLikelihood[emdists[[k]], Pick[obs, states, k]], {k, 4}]Viterbi 破译的状态序列有着和实际序列相等或更高的对数似然:
jointLogLikelihood[estates["Values"], data["Values"]]jointLogLikelihood[actualstates["Values"], data["Values"]]tm = SparseArray[{{1, 2} -> 0.2, {1, 3} -> 0.8, {2, 3} -> 0.8, {2, 4} -> 0.1, {2, 2} -> 0.1, {3, 2} -> 0.3, {3, 4} -> 0.7, {4, 2} -> 0.9, {4, 5} -> 0.1, {5, 5} -> 1.}, {5, 5}];hmm = HiddenMarkovProcess[1, tm, {None, {0.4, 0.6, 0}, {0, 0, 0}, None, {0, 0, 1}}];FindHiddenMarkovStates[{1, 2, 1, 2, 2, 1, 3}, hmm]% /. {es : (2 | 5) :> Framed[es]}应用 (3)
一个偶尔不诚实的赌场提供了一种硬币博彩游戏,用一枚正面朝上概率三倍于反面朝上的偏差硬币来进行不公平的欺诈行为. 已知赌场庄家会以 10% 的概率在公平与偏差硬币之间秘密的切换:
{fair, biased} = {1, 2};
tm = SparseArray[{{fair, fair} -> 9 / 10, {fair, biased} -> 1 / 10, {biased, fair} -> 1 / 10, {biased, biased} -> 9 / 10}];fairCoin = {1 / 2, 1 / 2};
biasedCoin = {3 / 4, 1 / 4};作为结果的隐马尔可夫过程,假设选哪个作为起始硬币的概率相等:
UnfairCasinoHMM = HiddenMarkovProcess[{1 / 2, 1 / 2}, tm, {fairCoin, biasedCoin}];给定一个抛掷结果的序列,猜测在哪些时间点庄家使用了有偏差的硬币:
tosses = TemporalData[Automatic, {{{1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2,
2, 2, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1,
1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 1}}, {{0, 100, 1}}, 1, {"Discrete", 1}, {"Discrete", 1}, 1,
{ValueDimensions -> 1, MetaInformation -> {}}}, False, 10.];probableCoinTypes = FindHiddenMarkovStates[tosses, UnfairCasinoHMM];ListPlot[probableCoinTypes, Ticks -> {Automatic, {{1, "Fair"}, {2, "Biased"}}}]emissions = {1.47, 1.94, 1.51, 1.97, 2.2, 2.4, 2.43, -1.37, 2.71, -0.69, 1.64, 2., 2.83, -1.45, -1.28, -1.67, -0.89, -1.16, -0.83, -1.55, -0.87};hmm = HiddenMarkovProcess[{0.3, 0.7}, {{0.5, 0.5}, {0.3, 0.7}}, {NormalDistribution[-1.2, 0.3], NormalDistribution[2.3, 0.5]}];states = FindHiddenMarkovStates[emissions, hmm]empath = Normal[TimeSeries[emissions]];ListPlot[{Pick[empath, states, 1], Pick[empath, states, 2]}, Filling -> Axis, PlotStyle -> PointSize[Medium], PlotLegends -> {"state 1", "state 2"}]一个玩具机器人在一个 4×4 的网格上移动,灰色的方格表示墙而机器人不能离开此地图. 机器人在四个方向中随机选一个然后试图移动. 如果不能按选定的方向移动则它会停留在原来的位置:
map = {{Gray, Orange, Yellow, White}, {Brown, White, Orange, Gray}, {Orange, Gray, Brown, Yellow}, {Gray, Brown, Yellow, White}};colors = DeleteCases[Union[Flatten[map]], Gray];
colorRules = Thread[colors -> Range[Length[colors]]];v = pos@@@Position[map, Except[Gray | List], {2}];
vCoords = MapThread[Rule, {v, (v /. pos[i_, j_] :> {j - 1 / 2, 4 - i + 1 / 2})}];okQ[{from : Repeated[_, {2}], to : Repeated[(1 | 2 | 3 | 4), {2}]}] := Total[Abs[{to} - {from}]] == 1 && FreeQ[{map[[from]], map[[to]]}, Gray]
okQ[_] := Falseedges = Select[Tuples[Range[4], 4], okQ] /. {i1_, j1_, i2_, j2_} :> pos[i1, j1]pos[i2, j2];gr = Graph[v, edges, VertexCoordinates -> vCoords, EdgeShapeFunction -> "HalfUnfilledDoubleArrow"];backgr = ArrayPlot[map, Mesh -> True, MeshStyle -> Directive[Thick, Black]];
Show[backgr, gr]为底层的隐状态建立 DiscreteMarkovProcess:
adjm = AdjacencyMatrix[gr];
tm = adjm / 4 + DiagonalMatrix[1 - Total[adjm, {2}] / 4];
p0 = Normalize[ConstantArray[1, Length[tm]], Total];
dmp = DiscreteMarkovProcess[p0, tm];机器人的光学感应器的精确度为 90%,当识别失败时会均匀选取用过的颜色:
emPr[i_] := (9/10)UnitVector[4, i] + (1/10)Table[(1/4), {4}]em = v /. pos[i_, j_] :> emPr[Part[map, i, j] /. colorRules];hmm = HiddenMarkovProcess[dmp, em];对给定的感应器读取结果序列,用该模型找出机器人在地图上的最大似然动作:
measurements = {RGBColor[1, 0.5, 0], RGBColor[0.6, 0.4, 0.2], RGBColor[0.6, 0.4, 0.2], RGBColor[0.6, 0.4, 0.2], RGBColor[0.6, 0.4, 0.2], RGBColor[1, 1, 0], RGBColor[1, 1, 0], RGBColor[0.6, 0.4, 0.2], RGBColor[1, 0.5, 0], RGBColor[1, 1, 0], RGBColor[1, 0.5, 0], RGBColor[1, 0.5, 0], RGBColor[1, 0.5, 0], RGBColor[1, 0.5, 0], GrayLevel[1], GrayLevel[1]};tileseqVt = Part[v, FindHiddenMarkovStates[measurements /. colorRules, hmm]]tileseqPos = Part[v, FindHiddenMarkovStates[measurements /. colorRules, hmm, "PosteriorDecoding"]]可视化用 "ViterbiDecoding" 和 "PosteriorDecoding" 准则破译的路径:
{Show[backgr, HighlightGraph[gr, Subgraph[gr, tileseqVt]]], Show[backgr, HighlightGraph[gr, Subgraph[gr, tileseqPos]]]}属性和关系 (3)
"ViterbiDecoding" 最大化状态和输出的联合对数似然:
hmm = HiddenMarkovProcess[{0.5, 0.5}, {{0.4, 0.6}, {0.3, 0.7}}, em = {{0.5, 0.5}, {0.2, 0.8}}];
obs = {2, 1, 2};jointLogLikelihood[states_, emissions_] := LogLikelihood[DiscreteMarkovProcess[hmm], states] + Total[Log[MapThread[Part[em, #1, #2]&, {states, emissions}]]]statepaths = Tuples[{1, 2}, 3];loglikes = Table[jointLogLikelihood[stseq, obs], {stseq, statepaths}];FindHiddenMarkovStates 返回有最大联合对数似然的状态路径:
Part[statepaths, First@Ordering[loglikes, -1, Less]]FindHiddenMarkovStates[obs, hmm, "ViterbiDecoding"]"PosteriorDecoding" 找出单独每个时间点的最大似然状态的序列:
dmp = DiscreteMarkovProcess[{0.5, 0.5}, {{0.4, 0.6}, {0.8, 0.2}}];
em = {{0.5, 0.5}, {0.2, 0.8}};slices = {s0, s1, s2}dmp[{0, 1, 2}];em𝒟s1 = EmpiricalDistribution[em[[1]] -> {1, 2}];
em𝒟s2 = EmpiricalDistribution[em[[2]] -> {1, 2}];emConds1 = {e0s1, e1s1, e2s1}ProductDistribution[{em𝒟s1, 3}];emConds2 = {e0s2, e1s2, e2s2}ProductDistribution[{em𝒟s2, 3}];定义时间点 0、1 和 2 的输出为状态值及条件输出值的函数:
emVec = {Boole[s0 == 1]e0s1 + Boole[s0 == 2]e0s2, Boole[s1 == 1]e1s1 + Boole[s1 == 2]e1s2, Boole[s2 == 1]e2s1 + Boole[s2 == 2]e2s2};obs = {1, 1, 2};cond = Thread[emVec == obs];Table[ArgMax[{Probability[sv == kcond, {slices, emConds1, emConds2}], k == 1 || k == 2}, k, Integers], {sv, {s0, s1, s2}}]hmm = HiddenMarkovProcess[dmp, em];FindHiddenMarkovStates[obs, hmm, "PosteriorDecoding"]FindHiddenMarkovStates 返回确切的输出,即只有一条路径:
hmm = HiddenMarkovProcess[{33 / 302, 269 / 302}, {{82 / 203, 121 / 203}, {36 / 85, 49 / 85}}, em = {{15 / 17, 2 / 17}, {1893 / 2057, 164 / 2057}}];𝒪 = {2, 2, 2};FindHiddenMarkovStates[𝒪, hmm]ℒ[states_, obs_] := Fold[Times, Likelihood[DiscreteMarkovProcess[hmm], states], MapThread[Part[em, #1, #2]&, {states, obs}]]{ℒ[{2, 1, 1}, 𝒪], ℒ[{2, 1, 2}, 𝒪]}𝒮 = Tuples[{1, 2}, 3];Take[SortBy[{#, N@ℒ[#, 𝒪]}& /@ 𝒮, Last], -3]可能存在的问题 (2)
若路径和给定的 HMM(隐马尔可夫模型)不一致则 FindHiddenMarkovStates 不求值:
hmm = HiddenMarkovProcess[2, {{3 / 7, 4 / 7}, {3 / 8, 5 / 8}}, {GeometricDistribution[.2], PascalDistribution[8, .3]}];FindHiddenMarkovStates[{1, 2, 3}, hmm]Likelihood[hmm, {1, 2, 3}]"PosteriorDecoding" 的结果状态序列可能和状态拓扑不一致:
𝒫 = HiddenMarkovProcess[1, {{1 / 2, 0, 1 / 2}, {1 / 3, 1 / 3, 1 / 3}, {2 / 3, 1 / 3, 0}}, {{3 / 4, 1 / 4}, {1 / 3, 2 / 3}, {2 / 5, 3 / 5}}];𝒪 = {1, 1, 2, 2, 1, 1};
Likelihood[𝒫, 𝒪]states = FindHiddenMarkovStates[𝒪, 𝒫, "PosteriorDecoding"]Likelihood[DiscreteMarkovProcess[𝒫], states]文本
Wolfram Research (2014),FindHiddenMarkovStates,Wolfram 语言函数,https://reference.wolfram.com/language/ref/FindHiddenMarkovStates.html.
CMS
Wolfram 语言. 2014. "FindHiddenMarkovStates." Wolfram 语言与系统参考资料中心. Wolfram Research. https://reference.wolfram.com/language/ref/FindHiddenMarkovStates.html.
APA
Wolfram 语言. (2014). FindHiddenMarkovStates. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/FindHiddenMarkovStates.html 年
BibTeX
@misc{reference.wolfram_2026_findhiddenmarkovstates, author="Wolfram Research", title="{FindHiddenMarkovStates}", year="2014", howpublished="\url{https://reference.wolfram.com/language/ref/FindHiddenMarkovStates.html}", note=[Accessed: 07-October-2026]}
BibLaTeX
@online{reference.wolfram_2026_findhiddenmarkovstates, organization={Wolfram Research}, title={FindHiddenMarkovStates}, year={2014}, url={https://reference.wolfram.com/language/ref/FindHiddenMarkovStates.html}, note=[Accessed: 07-October-2026]}