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)); }