コード例 #1
0
ファイル: MainWindow.xaml.cs プロジェクト: Apolotary/HMM
        private void learnButton_Click(object sender, RoutedEventArgs e)
        {
            ReadSequenceBox();
            ReadCharBox();
            ReadStateBox();
            ReadLikelihoodBox();

            int[][] sequenceArray = SequenceListToArray();

            hmm = new HiddenMarkovModel(alphabet, states);

            hmm.Learn(sequenceArray, likelihood);
        }
コード例 #2
0
        public override void Learn(SequenceData trainingData, SequenceData validationData, SequenceData testData)
        {
            //hmm = SparseHiddenMarkovModel.FromCompleteGraph(2, trainingData.NumSymbols);
            hmm = new HiddenMarkovModel(trainingData.NumSymbols, 4);

            double likelihood = 0.0;
            double newLikelihood = Double.MinValue;

            do
            {
                //HMMGraph graph = hmm.ToGraph();
                HMMGraph graph = ModelConverter.HMM2Graph(hmm);

                //CutEdges(graph, epsilon);

                double[] viterbyScores = ComputeViterbyScores(validationData, true);

                int[] statesToSplit = IdentifyWeakStates(viterbyScores).ToArray();
                foreach (int weakPoint in statesToSplit)
                {
                    SplitState(graph, weakPoint);
                }

                WriteLine(String.Format("Added {0} states", statesToSplit.Length));
                //WriteLine(String.Format("Removed {0} states", RemoveUnpopularStates(graph, viterbyScores)));

                //hmm = SparseHiddenMarkovModel.FromGraph(graph);
                hmm = ModelConverter.Graph2HMM(graph);

                WriteLine("Running Baum Welch...");
                //hmm.Learn(trainingData.GetNonempty(), 0.0, 8);
                hmm.Learn(trainingData.GetNonempty(), 8);

                likelihood = newLikelihood;
                newLikelihood = 0.0;

                foreach (int[] signal in validationData.GetNonempty())
                {
                    newLikelihood += hmm.Evaluate(signal, true);
                }

                WriteLine(String.Empty);
                WriteLine(String.Format("Number of HMM States: {0}", NumberOfStates));
                //WriteLine(String.Format("Transition Sparsity; {0}", hmm.TransitionSparsity));
                WriteLine(String.Format("Log Likelihood: {0}", newLikelihood));
                WriteLine(String.Empty);
            }
            while (Math.Abs(newLikelihood - likelihood) > convergenceThreshold);
        }
コード例 #3
0
        public override void Learn(SequenceData trainingData, SequenceData validationData, SequenceData testData) {
            //trainingData.AddSequences(validationData);

            double[] initialProbabilities = new double[states];

            double sum = 0.0;

            for (int k = 0; k < states; k++)
            {
                initialProbabilities[k] = random.NextDouble();
                sum += initialProbabilities[k];
            }

            for (int k = 0; k < states; k++)
            {
                initialProbabilities[k] /= sum;
            }

            double[,] transitionMatrix = new double[states, states];

            for (int k = 0; k < states; k++)
            {
                sum = 0.0;

                for (int l = 0; l < states; l++)
                {
                    transitionMatrix[k, l] = random.NextDouble();
                    sum += transitionMatrix[k, l];
                }

                for (int l = 0; l < states; l++)
                {
                    transitionMatrix[k, l] /= sum;
                }
            }

            double[,] emissionMatrix = new double[states, testData.NumSymbols];

            for (int k = 0; k < states; k++)
            {
                sum = 0.0;

                for (int l = 0; l < testData.NumSymbols; l++)
                {
                    emissionMatrix[k, l] = random.NextDouble();
                    sum += emissionMatrix[k, l];
                }

                for (int l = 0; l < testData.NumSymbols; l++)
                {
                    emissionMatrix[k, l] /= sum;
                }
            }

            //hmm = new HiddenMarkovModel(trainingData.NumSymbols, states);
            hmm = new HiddenMarkovModel(transitionMatrix, emissionMatrix, initialProbabilities);
            Stopwatch sw = new Stopwatch();
            sw.Start();
            hmm.Learn(trainingData.GetNonempty(), tolerance);
            sw.Stop();
            Console.WriteLine(sw.Elapsed.TotalSeconds);
        }
コード例 #4
0
        public void EquivalenceTest() {
            double[] pi = new double[]{0.23, 0.52, 0.25};

            double[,] A = new double[,]{{ 3.0 / 6.0, 2.0 / 6.0, 1.0 / 6.0 },
                                        { 11.0 / 17.0, 2.0 / 17.0, 4.0 / 17.0},
                                        {4.0 / 20.0, 7.0 / 20.0, 9.0 / 20.0}};

            double[,] B = new double[,]{{ 1.0 / 6.0, 1.0 / 6.0, 4.0 / 6.0 },
                                        { 2.0 / 17.0, 3.0 / 17.0, 12.0 / 17.0},
                                        {13.0 / 20.0, 2.0 / 20.0, 5.0 / 20.0}};

            int[][] observations = new int[][]{
                new int[] {0, 0, 1, 2, 1, 1, 1, 2, 0, 0, 0, 1, 2, 1, 2, 1, 0, 1},
                new int[] {1, 1, 2, 1, 2, 0},
                new int[] {1, 1, 2, 2, 2, 2, 1, 1, 2, 1, 2, 1, 2, 1},
                new int[] {1, 1, 2, 1, 0, 0, 2, 1, 0, 1, 1, 1},
                new int[] {1, 2, 2, 0, 2},
                new int[] {1, 1, 1, 1, 2, 1, 2, 1}
            };

            //Run BW with 20 iterations

            HiddenMarkovModel hmm = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi));
            hmm.Learn(observations, 20);

            HiddenMarkovModel hmmLM = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi));
            hmmLM.Learn(observations, 20);

            for (int i = 0; i < hmm.Probabilities.Length; i++)
                Assert.AreEqual(hmm.Probabilities[i], hmmLM.Probabilities[i]);

            for (int i = 0; i < hmm.Transitions.GetLength(0); i++)
                for (int p = 0; p < hmm.Transitions.GetLength(1); p++)
                    Assert.AreEqual(hmm.Transitions[i, p], hmmLM.Transitions[i, p]);

            for (int i = 0; i < hmm.Emissions.GetLength(0); i++)
                for (int p = 0; p < hmm.Emissions.GetLength(1); p++)
                    Assert.AreEqual(hmm.Emissions[i, p], hmmLM.Emissions[i, p]);

            //Run BW with 1 iteration

            hmm = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi));
            hmm.Learn(observations, 1);

            hmmLM = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi));
            hmmLM.Learn(observations, 1);

            for (int i = 0; i < hmm.Probabilities.Length; i++)
                Assert.AreEqual(hmm.Probabilities[i], hmmLM.Probabilities[i]);

            for (int i = 0; i < hmm.Transitions.GetLength(0); i++)
                for (int p = 0; p < hmm.Transitions.GetLength(1); p++)
                    Assert.AreEqual(hmm.Transitions[i, p], hmmLM.Transitions[i, p]);

            for (int i = 0; i < hmm.Emissions.GetLength(0); i++)
                for (int p = 0; p < hmm.Emissions.GetLength(1); p++)
                    Assert.AreEqual(hmm.Emissions[i, p], hmmLM.Emissions[i, p]);

            //Run BW with threshold 0.1

            hmm = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi));
            hmm.Learn(observations, 0.1);

            hmmLM = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi));
            hmmLM.Learn(observations, 0.1);

            for (int i = 0; i < hmm.Probabilities.Length; i++)
                Assert.AreEqual(hmm.Probabilities[i], hmmLM.Probabilities[i]);

            for (int i = 0; i < hmm.Transitions.GetLength(0); i++)
                for (int p = 0; p < hmm.Transitions.GetLength(1); p++)
                    Assert.AreEqual(hmm.Transitions[i, p], hmmLM.Transitions[i, p]);

            for (int i = 0; i < hmm.Emissions.GetLength(0); i++)
                for (int p = 0; p < hmm.Emissions.GetLength(1); p++)
                    Assert.AreEqual(hmm.Emissions[i, p], hmmLM.Emissions[i, p]);

        }