/// <summary> /// Constructor /// </summary> /// <param name="data"></param> /// <param name="mixturesDistribution"></param> /// <param name="haploidMeans"></param> public HiddenMarkovModel(List <List <double> > data, List <MultivariateNegativeBinomial> mixturesDistribution, List <double> haploidMeans) { // HMM set-up nStates = mixturesDistribution.Count; length = data.Count; _stateProbabilities = new double[nStates]; _emission = new NegativeBinomialMixture(mixturesDistribution, haploidMeans); _variances = mixturesDistribution.Select(x => x.Variances).ToList(); _transition = CanvasCommon.Utilities.MatrixCreate(nStates, nStates); for (int i = 0; i < nStates; i++) { for (int j = 0; j < nStates; j++) { if (i == j) { _transition[i][j] = selfTransition; } else { _transition[i][j] = (1.0 - selfTransition) / (nStates - 1); } } } // alpha-beta algorithm _beta = CanvasCommon.Utilities.MatrixCreate(length, nStates); _alpha = CanvasCommon.Utilities.MatrixCreate(length, nStates); // marginal posterior distibution _gamma = CanvasCommon.Utilities.MatrixCreate(nStates, length); // joint posterior distibution _epsilon = CanvasCommon.Utilities.MatrixCreate(length, nStates, nStates); }
/// <summary> /// Constructor /// </summary> /// <param name="data"></param> /// <param name="mixturesDistribution"></param> /// <param name="haploidMeans"></param> public HiddenMarkovModel(List <List <double> > data, List <MultivariateNegativeBinomial> mixturesDistribution, List <double> haploidMeans, bool isPerSample) { // HMM set-up nStates = mixturesDistribution.Count; length = data.Count; _stateProbabilities = new double[nStates]; _emission = new NegativeBinomialMixture(mixturesDistribution, haploidMeans, isPerSample); _transition = CanvasCommon.Utilities.MatrixCreate(nStates, nStates); for (int i = 0; i < nStates; i++) { for (int j = 0; j < nStates; j++) { if (i == j) { _transition[i][j] = selfTransition; } else { _transition[i][j] = (1.0 - selfTransition) / (nStates - 1); } } _stateProbabilities[i] = 1f / nStates; } // alpha-beta algorithm CanvasCommon.Utilities.MatrixCreate(length, nStates); CanvasCommon.Utilities.MatrixCreate(length, nStates); // marginal posterior distibution CanvasCommon.Utilities.MatrixCreate(nStates, length); // joint posterior distibution CanvasCommon.Utilities.MatrixCreate(length, nStates, nStates); }