隐马尔科夫模型2分类matlab,训练隐马尔可夫模型和分类用法的问题

Amro..

36

我没有回答每个问题,而是让我演示如何使用HMM工具箱作为示例 - 在引入隐藏马尔可夫模型时通常使用的天气示例.

基本上模型的状态是三种可能的天气类型:晴天,下雨和有雾.在任何一天,我们都假设天气只是这些值中的一个.因此,HMM状态集合是:

S = {sunny, rainy, foggy}

然而在这个例子中,我们无法直接观察天气(显然我们被锁在地下室!).相反,我们唯一的证据就是每天检查你的人是否携带雨伞.在HMM术语中,这些是离散的观察:

x = {umbrella, no umbrella}

HMM模型的特点是三件事:

先验概率:处于序列的第一状态的概率的向量.

过渡概率:矩阵描述从一种天气状态到另一种状态的概率.

排放概率:矩阵描述在给定状态(天气)的情况下观察输出(伞或非伞)的概率.

接下来我们要么给出这些概率,要么我们必须从训练集中学习它们.完成后,我们可以做出推理,例如计算观察序列相对于HMM模型(或一组模型,并挑选最可能的模型)的可能性......

1)已知的模型参数

下面是一个示例代码,演示如何填充现有概率以构建模型:

Q = 3; %# number of states (sun,rain,fog)

O = 2; %# number of discrete observations (umbrella, no umbrella)

%# prior probabilities

prior = [1 0 0];

%# state transition matrix (1: sun, 2: rain, 3:fog)

A = [0.8 0.05 0.15; 0.2 0.6 0.2; 0.2 0.3 0.5];

%# observation emission matrix (1: umbrella, 2: no umbrella)

B = [0.1 0.9; 0.8 0.2; 0.3 0.7];

然后我们可以从这个模型中抽取一堆序列:

num = 20; %# 20 sequences

T = 10; %# each of length 10 (days)

[seqs,states] = dhmm_sample(prior, A, B, num, T);

例如,第五个例子是:

>> seqs(5,:) %# observation sequence

ans =

2 2 1 2 1 1 1 2 2 2

>> states(5,:) %# hidden states sequence

ans =

1 1 1 3 2 2 2 1 1 1

我们可以评估序列的对数似然性:

dhmm_logprob(seqs(5,:), prior, A, B)

dhmm_logprob_path(prior, A, B, states(5,:))

或计算维特比路径(最可能的状态序列):

vPath = viterbi_path(prior, A, multinomial_prob(seqs(5,:),B))

e4a015dc4222698648497d104d619a8d.png

2)未知的模型参数

使用EM算法进行训练,最好使用一组观察序列.

继续使用相同的示例,我们可以使用上面生成的数据来训练新模型并将其与原始模型进行比较:

%# we start with a randomly initialized model

prior_hat = normalise(rand(Q,1));

A_hat = mk_stochastic(rand(Q,Q));

B_hat = mk_stochastic(rand(Q,O));

%# learn from data by performing many iterations of EM

[LL,prior_hat,A_hat,B_hat] = dhmm_em(seqs, prior_hat,A_hat,B_hat, 'max_iter',50);

%# plot learning curve

plot(LL), xlabel('iterations'), ylabel('log likelihood'), grid on

RBDcs.png

请记住,州令不必匹配.这就是为什么我们需要在比较两个模型之前对状态进行置换.在此示例中,训练的模型看起来接近原始模型:

>> p = [2 3 1]; %# states permutation

>> prior, prior_hat(p)

prior =

1 0 0

ans =

0.97401

7.5499e-005

0.02591

>> A, A_hat(p,p)

A =

0.8 0.05 0.15

0.2 0.6 0.2

0.2 0.3 0.5

ans =

0.75967 0.05898 0.18135

0.037482 0.77118 0.19134

0.22003 0.53381 0.24616

>> B, B_hat(p,[1 2])

B =

0.1 0.9

0.8 0.2

0.3 0.7

ans =

0.11237 0.88763

0.72839 0.27161

0.25889 0.74111

使用隐藏的马尔可夫模型可以做更多的事情,例如分类或模式识别.你会有不同的obervation序列集属于不同的类.首先,训练每组的模型.然后给出一个新的观察序列,您可以通过计算每个模型的可能性对其进行分类,并预测具有最高对数似然的模型.

argmax[ log P(X|model_i) ] over all model_i

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用MATLAB训练马尔科夫模型的基本步骤: 1. 准备数据:首先需要准备一个数据集,其中包含观测序列和对应的状态序列。观测序列是模型的输入,而状态序列是模型需要学习的输出。 2. 定义模型:使用MATLAB中的hmmcreate函数定义一个马尔科夫模型。该函数需要指定模型的状态数、观测数以及初始概率、转移概率和发射概率矩阵。 3. 训练模型:使用MATLAB中的hmmtrain函数训练模型。该函数需要输入观测序列和对应的状态序列,以及先前定义的模型。 4. 预测:使用MATLAB中的hmmdecode函数对新的观测序列进行预测。该函数需要输入观测序列和训练好的模型,输出最可能的状态序列。 下面是一个简单的MATLAB代码示例,演示了如何训练和预测一个马尔科夫模型: ``` % 准备数据 obs = [1 2 2 1 1 2 1 1 2 2]; % 观测序列 states = [1 2 1 1 2 1 2 2 2 2]; % 状态序列 % 定义模型 numStates = 2; % 状态数 numObs = 2; % 观测数 prior = [0.5 0.5]; % 初始概率 trans = [0.7 0.3; 0.4 0.6]; % 转移概率矩阵 emit = [0.9 0.1; 0.2 0.8]; % 发射概率矩阵 model = hmmcreate(numStates, numObs, prior, trans, emit); % 训练模型 [model, loglik] = hmmtrain(obs, states, model); % 预测 newObs = [2 1 1]; % 新的观测序列 [newStates, logprob] = hmmdecode(newObs, model); disp(newStates); ``` 在此示例中,我们首先定义了一个包含10个观测值和对应的状态值的数据集。然后,我们使用hmmcreate函数定义了一个包含2个状态和2个观测值的马尔科夫模型,并将其用于训练数据集。最后,我们使用hmmdecode函数对一个新的3个观测值的序列进行预测,输出最可能的状态序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值