📄 kullbackleiblerdistancecalculator.java
字号:
/* jahmm package - v0.3.1 *//* * Copyright (c) 2004, Jean-Marc Francois. * * This file is part of Jahmm. * Jahmm is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Jahmm is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Jahmm; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */package be.ac.ulg.montefiore.run.jahmm.toolbox;import java.util.*;import be.ac.ulg.montefiore.run.jahmm.*;/** * Computes the distance between HMMs. * <p> * The distance metric is similar to the Kullback-Leibler distance defined * on distributions. More information can be found in * <i>A Probabilistic Distance Measure For HMMs</i> by * <i>Rabiner</i> and <i>Juang</i> (AT&T Technical Journal, vol. 64, Feb. 1985, * pages 391-408). * <p> * This distance measure is not symetric: <code>distance(hmm1, hmm2)</code> * is not necessary equal to <code>distance(hmm2, hmm1)</code>. To get a * symetric distance definition, compute * <code>(distance(hmm1, hmm2) + distance(hmm2, hmm1)) / 2</code>. */public class KullbackLeiblerDistanceCalculator { private double distance; private final int generatedSequencesLength = 10000; /** * Computes the Kullback-Leibler distance between two HMMs. * * @param hmm1 The first HMM against which the distance is computed. * The distance is mesured with regard to this HMM (this must * be defined since the Kullback-Leibler distance is not * symetric). * @param hmm2 The second HMM against which the distance is computed. */ public KullbackLeiblerDistanceCalculator(Hmm hmm1, Hmm hmm2) { distance = KLCompute(hmm1, hmm2); } private double KLCompute(Hmm hmm1, Hmm hmm2) { Vector oseq = new MarkovGenerator(hmm1). observationSequence(generatedSequencesLength); return (new ForwardBackwardScaledCalculator(oseq, hmm1).lnProbability() - new ForwardBackwardScaledCalculator(oseq, hmm2).lnProbability()) / generatedSequencesLength; } /** * Returns the distance between <code>hmm1</code> and <code>hmm2</code> with * regard to <code>hmm1</code>, where <code>hmm1</code> and * <code>hmm2</code> are the HMM given to * {@link #KullbackLeiblerDistanceCalculator(Hmm, Hmm) contructor}. * * @return The distance between the HMMs. */ public double distance() { return distance; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -