6.3. Example

The following bash script generates sequences of observations that match the ${hmm} HMM. It then learns the parameters of a HMM given those sequences using the Baum-Welch algorithm and prints the distance between the learnt HMM and ${hmm} after each iteration.

#!/bin/bash


#
# CLI-related variables
#

cli="java be.ac.ulg.montefiore.run.jahmm.apps.cli.Cli"
opdf="-opdf integer -r 2"


#
# File names
#

tmp_dir="."
hmm="${tmp_dir}/hmmExample.hmm"
initHmm="${tmp_dir}/hmmExampleInit.hmm"
learntHmm="${tmp_dir}/hmmExampleLearnt.hmm"
seqs="${tmp_dir}/hmmExample.seq"


#
# Functions
#

create_files ()
{
    cat > ${hmm} <<EOF
Hmm v1.0

NbStates 2

State
Pi 0.95
A 0.95 0.05
IntegerOPDF [0.95 0.05 ]

State
Pi 0.05
A 0.10 0.90
IntegerOPDF [0.20 0.80 ]
EOF

    cat > ${initHmm} <<EOF
Hmm v1.0

NbStates 2

State
Pi 0.50
A 0.80 0.20
IntegerOPDF [0.80 0.20 ]

State
Pi 0.05
A 0.20 0.80
IntegerOPDF [0.10 0.90 ]
EOF
}

erase_files ()
{
    rm -f ${hmm} ${initHmm} ${learntHmm} ${seqs}
}


#
# Main section
#

# Create sample HMMs
create_files;

# Generate sequences of observations using ${hmm}
${cli} generate ${opdf} -i ${hmm} -os ${seqs}

# Baum-Welch learning based on ${initHmm}
cp ${initHmm} ${learntHmm}
for i in 0 1 2 3 4 5 6 7
do
 echo $i `${cli} distance-kl ${opdf} -i ${learntHmm} -ikl ${hmm}`
 ${cli} learn-bw ${opdf} -i ${initHmm} -o ${learntHmm} -is ${seqs} -ni 1
done

# Print resulting HMM
echo
echo "Resulting HMM:"
${cli} print -i ${learntHmm}

# Erase the files created
erase_files;

exit 0