Ejemplo n.º 1
0
        public double[][] Estimate(AlphaBetaTransitionProbabiltyMatrixParameters <TDistribution> parameters)
        {
            if (_estimatedTransitionProbabilityMatrix != null)
            {
                return(_estimatedTransitionProbabilityMatrix);
            }
            var T = parameters.Observations.Length;

            _estimatedTransitionProbabilityMatrix = new double[parameters.Model.N][];

            for (var i = 0; i < parameters.Model.N; i++)
            {
                _estimatedTransitionProbabilityMatrix[i] = new double[parameters.Model.N];
                for (var j = 0; j < parameters.Model.N; j++)
                {
                    double nominator = (parameters.Normalized) ? double.NaN : 0.0d, denominator = (parameters.Normalized) ? double.NaN : 0.0d;
                    for (var t = 0; t < T - 1; t++)
                    {
                        var probability = parameters.Model.Emission[j].ProbabilityDensityFunction(parameters.Observations[t + 1]);
                        if (parameters.Normalized)
                        {
                            nominator   = LogExtention.eLnSum(nominator, LogExtention.eLnProduct(parameters.Weights[t], LogExtention.eLnProduct(parameters.Alpha[t][i], LogExtention.eLnProduct(LogExtention.eLn(parameters.Model.TransitionProbabilityMatrix[i][j]), LogExtention.eLnProduct(LogExtention.eLn(probability), parameters.Beta[t + 1][j])))));
                            denominator = LogExtention.eLnSum(denominator, LogExtention.eLnProduct(parameters.Weights[t], LogExtention.eLnProduct(parameters.Alpha[t][i], parameters.Beta[t][j])));
                        }
                        else
                        {
                            nominator   += parameters.Weights[t] * parameters.Alpha[t][i] * parameters.Model.TransitionProbabilityMatrix[i][j] * probability * parameters.Beta[t + 1][j];
                            denominator += parameters.Weights[t] * parameters.Alpha[t][i] * parameters.Beta[t][j];
                        }
                    }
                    _estimatedTransitionProbabilityMatrix[i][j] = CalculateTransitionProbabilityMatrixEntry(nominator, denominator, parameters.Normalized);
                }
            }
            return(_estimatedTransitionProbabilityMatrix);
        }
        public void Estimate_AlphaBetaParameters_TransitionProbabilityMatrixCalculatedAndReturned()
        {
            const int numberOfStates = 2;

            var util         = new TestDataUtils();
            var observations = util.GetSvcData(util.FTSEFilePath, new DateTime(2010, 12, 18), new DateTime(2011, 12, 18));
            var model        = HiddenMarkovModelStateFactory.GetState(new ModelCreationParameters <NormalDistribution>()
            {
                NumberOfStates = numberOfStates, Emissions = CreateEmissions(observations, numberOfStates)
            });

            model.Normalized = true;
            var baseParameters = new BasicEstimationParameters <NormalDistribution> {
                Model = model, Observations = Helper.Convert(observations), Normalized = model.Normalized
            };
            var alphaEstimator = new AlphaEstimator <NormalDistribution>();
            var alpha          = alphaEstimator.Estimate(baseParameters);

            var betaEstimator = new BetaEstimator <NormalDistribution>();
            var beta          = betaEstimator.Estimate(baseParameters);
            var weights       = new double[observations.Length];

            var estimator  = new TransitionProbabilityEstimator <NormalDistribution>();
            var parameters = new AlphaBetaTransitionProbabiltyMatrixParameters <NormalDistribution>
            {
                Alpha        = alpha,
                Beta         = beta,
                Model        = model,
                Observations = observations,
                Normalized   = model.Normalized,
                Weights      = weights
            };

            var estimatedTransitionProbabilityMatrix = estimator.Estimate(parameters);

            Assert.AreEqual(1d, Math.Round(estimatedTransitionProbabilityMatrix[0][0] + estimatedTransitionProbabilityMatrix[0][1], 5));
            Assert.AreEqual(1d, Math.Round(estimatedTransitionProbabilityMatrix[1][0] + estimatedTransitionProbabilityMatrix[1][1], 5));
        }
        public void Compare_AlphaBetaAndKsiGammaCalculation_EqualTransitionProbabilityMatrixes()
        {
            const int numberOfStates = 2;

            var util         = new TestDataUtils();
            var observations = util.GetSvcData(util.FTSEFilePath, new DateTime(2010, 12, 18), new DateTime(2011, 12, 18));
            var model        = HiddenMarkovModelStateFactory.GetState(new ModelCreationParameters <NormalDistribution>()
            {
                NumberOfStates = numberOfStates, Emissions = CreateEmissions(observations, numberOfStates)
            });

            model.Normalized = true;
            var observationsList = new List <IObservation>();
            var weights          = new double[observations.Length];

            for (var i = 0; i < observations.Length; i++)
            {
                observationsList.Add(new Observation(observations[i], i.ToString()));
            }
            var baseParameters = new BasicEstimationParameters <NormalDistribution> {
                Model = model, Observations = Helper.Convert(observations), Normalized = model.Normalized
            };
            var alphaEstimator = new AlphaEstimator <NormalDistribution>();
            var alpha          = alphaEstimator.Estimate(baseParameters);

            var betaEstimator = new BetaEstimator <NormalDistribution>();
            var beta          = betaEstimator.Estimate(baseParameters);

            var @params = new AdvancedEstimationParameters <NormalDistribution>
            {
                Alpha        = alpha,
                Beta         = beta,
                Observations = observationsList,
                Model        = model,
                Normalized   = model.Normalized
            };
            var gammaEstimator = new GammaEstimator <NormalDistribution>();
            var ksiEstimator   = new KsiEstimator <NormalDistribution>();

            var estimatorKsiGamma  = new TransitionProbabilityEstimator <NormalDistribution>();
            var parametersKsiGamma = new KsiGammaTransitionProbabilityMatrixParameters <NormalDistribution>
            {
                Model      = model,
                Ksi        = ksiEstimator.Estimate(@params),
                Gamma      = gammaEstimator.Estimate(@params),
                T          = observations.Length,
                Normalized = model.Normalized
            };
            var estimatorAlphaBeta  = new TransitionProbabilityEstimator <NormalDistribution>();
            var parametersAlphaBeta = new AlphaBetaTransitionProbabiltyMatrixParameters <NormalDistribution>
            {
                Alpha        = alpha,
                Beta         = beta,
                Model        = model,
                Observations = observations,
                Normalized   = model.Normalized,
                Weights      = weights
            };

            var estimatedTransitionProbabilityMatrixKsiGamma  = estimatorKsiGamma.Estimate(parametersKsiGamma);
            var estimatedTransitionProbabilityMatrixAlphaBeta = estimatorAlphaBeta.Estimate(parametersAlphaBeta);

            Assert.AreEqual(Math.Round(estimatedTransitionProbabilityMatrixKsiGamma[0][0], 5), Math.Round(estimatedTransitionProbabilityMatrixAlphaBeta[0][0], 5));
            Assert.AreEqual(Math.Round(estimatedTransitionProbabilityMatrixKsiGamma[0][1], 5), Math.Round(estimatedTransitionProbabilityMatrixAlphaBeta[0][1], 5));
            Assert.AreEqual(Math.Round(estimatedTransitionProbabilityMatrixKsiGamma[1][0], 5), Math.Round(estimatedTransitionProbabilityMatrixAlphaBeta[1][0], 5));
            Assert.AreEqual(Math.Round(estimatedTransitionProbabilityMatrixKsiGamma[1][1], 5), Math.Round(estimatedTransitionProbabilityMatrixAlphaBeta[1][1], 5));
        }