public IDistribution Evaluate(double[] observations, double[] symbols, double[] gamma)
        {
            var M             = symbols.Length;
            var T             = observations.Length;
            var probabilities = new double[M];

            for (var k = 0; k < M; k++)
            {
                double den = 0, num = 0;
                for (var t = 0; t < T; t++)
                {
                    if (observations[t] == symbols[k])
                    {
                        num = num + gamma[t];
                    }
                    den = den + gamma[t];
                }
                probabilities[k] = 1e-10;
                if (num.EqualsToZero())
                {
                    probabilities[k] = den.EqualsToZero() ? 0.0 : LogExtention.eExp(LogExtention.eLnProduct(num, -den));
                }
            }
            return(new DiscreteDistributionNormalized(symbols, probabilities));
        }
Exemplo n.º 2
0
        public double[] Estimate(MuEstimationParameters <TDistribution> parameters)
        {
            if (_muUnivariate != null)
            {
                return(_muUnivariate);
            }
            _muUnivariate = new double[parameters.Model.N];
            for (var n = 0; n < parameters.Model.N; n++)
            {
                var T    = parameters.Observations.Count;
                var mean = 0d;
                var nK   = 0d;
                for (var t = 0; t < T; t++)
                {
                    if (parameters.Model.Normalized)
                    {
                        nK   += LogExtention.eExp(parameters.Gamma[t][n]);
                        mean += parameters.Observations[t].Value[0] * LogExtention.eExp(parameters.Gamma[t][n]);
                    }
                    else
                    {
                        nK   += parameters.Gamma[t][n];
                        mean += parameters.Observations[t].Value[0] * parameters.Gamma[t][n];
                    }
                }

                _muUnivariate[n] = mean / nK;
            }

            return(_muUnivariate);
        }
Exemplo n.º 3
0
        public void eExp_XisNumber_ePowerXReturned()
        {
            var x = 1d;

            var result = LogExtention.eExp(x);

            Assert.AreEqual(Math.E, result);
        }
Exemplo n.º 4
0
        public void eExp_XisNaN_ZeroReturned()
        {
            var x = double.NaN;

            var result = LogExtention.eExp(x);

            Assert.AreEqual(0, result);
        }
Exemplo n.º 5
0
 private double CalculateTransitionProbabilityMatrixEntry(double nominator, double denominator, bool normalized)
 {
     if (denominator.EqualsToZero())
     {
         return(0);
     }
     return((normalized) ? LogExtention.eExp(LogExtention.eLnProduct(nominator, -denominator)) : nominator / denominator);
 }
Exemplo n.º 6
0
        public double[][,] Estimate(SigmaEstimationParameters <TDistribution, double[][]> parameters)
        {
            if (_sigmaMultivariate != null)
            {
                return(_sigmaMultivariate);
            }
            try
            {
                _sigmaMultivariate = new double[parameters.Model.N][, ];
                var K = parameters.Observations[0].Dimention;
                var T = parameters.Observations.Count;

                for (var n = 0; n < parameters.Model.N; n++)
                {
                    var covariance = new double[K, K];
                    var nK         = 0d;
                    for (var t = 0; t < T; t++)
                    {
                        var x = parameters.Observations[t].Value;
                        var z = x.Substruct(parameters.Mean[n]);
                        var m = z.OuterProduct(z);
                        if (parameters.Model.Normalized)
                        {
                            nK += LogExtention.eExp(parameters.Gamma[t][n]);
                            m   = m.Product(LogExtention.eExp(parameters.Gamma[t][n]));
                        }
                        else
                        {
                            nK += parameters.Gamma[t][n];
                            m   = m.Product(parameters.Gamma[t][n]);
                        }

                        covariance = covariance.Add(m);
                    }
                    _sigmaMultivariate[n] = covariance.Product(1 / nK);
                    var matrix = new Matrix(_sigmaMultivariate[n]);
                    if (!matrix.PositiviDefinite)
                    {
                        _sigmaMultivariate[n] = matrix.ConvertToPositiveDefinite();
                        Debug.WriteLine("HMM State {0} Sigma is not Positive Definite. Converting.", n);
                        Debug.WriteLine("{0}", matrix);
                    }
                    Debug.WriteLine("HMM State {0} Sigma : {1}", n, new Matrix(_sigmaMultivariate[n]));
                }
            }
            catch (Exception)
            {
                for (var n = 0; n < parameters.Model.N; n++)
                {
                    Debug.WriteLine("HMM State {0} Sigma : {1}", n, new Matrix(_sigmaMultivariate[n]));
                }
                throw;
            }

            return(_sigmaMultivariate);
        }
Exemplo n.º 7
0
        public double[, ][,] Estimate(MixtureSigmaEstimationParameters <TDistribution> parameters)
        {
            if (_sigma != null)
            {
                return(_sigma);
            }
            try
            {
                _sigma = new double[parameters.Model.N, parameters.L][, ];
                for (var i = 0; i < parameters.Model.N; i++)
                {
                    for (var l = 0; l < parameters.L; l++)
                    {
                        var denominator = 0.0d;
                        var nominator   = new double[parameters.Observations[0].Dimention, parameters.Observations[0].Dimention];
                        for (var t = 0; t < parameters.Observations.Count; t++)
                        {
                            // TODO : weights here
                            var weight          = GetWeightValue(t, parameters.ObservationWeights);
                            var gammaComponents = (parameters.Model.Normalized) ? LogExtention.eExp(parameters.GammaComponents[t][i, l]) : parameters.GammaComponents[t][i, l];

                            var x = parameters.Observations[t].Value;
                            var z = x.Substruct(parameters.Mu[i, l]);
                            var m = z.OuterProduct(z);

                            m            = m.Product(weight * gammaComponents);
                            denominator += weight * gammaComponents;
                            nominator    = nominator.Add(m);
                        }
                        _sigma[i, l] = nominator.Product(1 / denominator);
                        var matrix = new Matrix(_sigma[i, l]);
                        if (!matrix.PositiviDefinite)
                        {
                            _sigma[i, l] = matrix.ConvertToPositiveDefinite();
                            Debug.WriteLine("HMM State [{0},{1}] Sigma is not Positive Definite. Converting.", i, l);
                            Debug.WriteLine("{0}", matrix);
                        }
                    }
                }
            }
            catch (Exception)
            {
                for (var i = 0; i < parameters.Model.N; i++)
                {
                    for (var l = 0; l < parameters.L; l++)
                    {
                        Debug.WriteLine("Mixture Sigma [{0},{1}] : {2}", i, l, new Matrix(_sigma[i, l]));
                    }
                }
                throw;
            }

            return(_sigma);
        }
Exemplo n.º 8
0
        protected void EstimatePi(double[][] gamma)
        {
            var checksum = 0d;

            for (var i = 0; i < _model.N; i++)
            {
                _estimatedPi[i] = (_model.Normalized) ? LogExtention.eExp(gamma[0][i]) : gamma[0][i];
                checksum       += _estimatedPi[i];
            }
            CheckPi(checksum);
        }
 public void Denormalize()
 {
     if (!_denormalized)
     {
         for (var i = 0; i < _parameters.Model.N; i++)
         {
             for (var l = 0; l < _parameters.L; l++)
             {
                 _coefficients[i][l] = LogExtention.eExp(_coefficients[i][l]);
             }
         }
         _denormalized = true;
     }
 }
Exemplo n.º 10
0
        public double[] Estimate(PiParameters parameters)
        {
            if (_estimatedPi != null)
            {
                return(_estimatedPi);
            }
            _estimatedPi = new double[parameters.N];

            for (var i = 0; i < parameters.N; i++)
            {
                _estimatedPi[i] = (parameters.Normalized) ? LogExtention.eExp(parameters.Gamma[0][i]) : parameters.Gamma[0][i];
            }

            return(_estimatedPi);
        }
Exemplo n.º 11
0
        public IDistribution Evaluate(double[] observations, double[] symbols, double[] gamma, bool logNormalized)
        {
            var M             = symbols.Length;
            var T             = observations.Length;
            var probabilities = new double[M];

            for (var k = 0; k < M; k++)
            {
                double den = (logNormalized) ? double.NaN : 0, num = (logNormalized) ? double.NaN : 0;
                for (var t = 0; t < T; t++)
                {
                    if (observations[t] == symbols[k])
                    {
                        if (logNormalized)
                        {
                            num = LogExtention.eLnSum(num, gamma[t]);
                        }
                        else
                        {
                            num = num + gamma[t];
                        }
                    }
                    if (logNormalized)
                    {
                        den = LogExtention.eLnSum(den, gamma[t]);
                    }
                    else
                    {
                        den = den + gamma[t];
                    }
                }
                probabilities[k] = 1e-10;
                if (!num.EqualsToZero())
                {
                    if (logNormalized)
                    {
                        probabilities[k] = den.EqualsToZero() ? 0.0 : LogExtention.eExp(LogExtention.eLnProduct(num, -den));
                    }
                    else
                    {
                        probabilities[k] = den.EqualsToZero() ? 0.0 : num / den;
                    }
                }
            }
            return(new DiscreteDistribution(symbols, probabilities));
        }
Exemplo n.º 12
0
        public double[, ][] Estimate(MixtureCoefficientEstimationParameters <TDistribution> parameters)
        {
            if (_mu != null)
            {
                return(_mu);
            }

            try
            {
                _mu = new double[parameters.Model.N, parameters.L][];
                for (var i = 0; i < parameters.Model.N; i++)
                {
                    for (var l = 0; l < parameters.L; l++)
                    {
                        var denominator = 0.0d;
                        var nominator   = new double[parameters.Observations[0].Dimention];
                        for (var t = 0; t < parameters.Observations.Count; t++)
                        {
                            // TODO : weights here
                            var weight = GetWeightValue(t, parameters.ObservationWeights);
                            var x      = parameters.Observations[t].Value;
                            var gamma  = (parameters.Model.Normalized) ? LogExtention.eExp(parameters.GammaComponents[t][i, l])
                                                                          : parameters.GammaComponents[t][i, l];
                            denominator += weight * gamma;
                            x            = x.Product(gamma * weight);
                            nominator    = nominator.Add(x);
                        }
                        _mu[i, l] = nominator.Product(1 / denominator);
                    }
                }
            }
            catch (Exception)
            {
                for (var i = 0; i < parameters.Model.N; i++)
                {
                    for (var l = 0; l < parameters.L; l++)
                    {
                        Debug.WriteLine("Mixture Mu [{0},{1}] : {2}", i, l, new Vector(_mu[i, l]));
                    }
                }
                throw;
            }

            return(_mu);
        }
Exemplo n.º 13
0
        public double[][] Estimate(MuEstimationParameters <TDistribution> parameters)
        {
            if (_muMultivariate != null)
            {
                return(_muMultivariate);
            }
            try
            {
                _muMultivariate = new double[parameters.Model.N][];
                var K = parameters.Observations[0].Dimention; // Number of dimentions
                var T = parameters.Observations.Count;

                for (var n = 0; n < parameters.Model.N; n++)
                {
                    var mean = new double[K];
                    var nK   = 0d;
                    for (var t = 0; t < T; t++)
                    {
                        if (parameters.Model.Normalized)
                        {
                            nK  += LogExtention.eExp(parameters.Gamma[t][n]);
                            mean = mean.Add(parameters.Observations[t].Value.Product(LogExtention.eExp(parameters.Gamma[t][n])));
                        }
                        else
                        {
                            nK  += parameters.Gamma[t][n];
                            mean = mean.Add(parameters.Observations[t].Value.Product(parameters.Gamma[t][n]));
                        }
                    }

                    _muMultivariate[n] = mean.Product(1 / nK);
                    Debug.WriteLine(string.Format("HMM State {0} : Mu {1}", n, new Vector(_muMultivariate[n])));
                }
            }
            catch (Exception)
            {
                for (var n = 0; n < parameters.Model.N; n++)
                {
                    Debug.WriteLine(string.Format("HMM State {0} : Mu {1}", n, new Vector(_muMultivariate[n])));
                }
                throw;
            }
            return(_muMultivariate);
        }
Exemplo n.º 14
0
        protected void EstimateTransitionProbabilityMatrix(double[][] gamma, double[][,] ksi, decimal[] observationWeights, int sequenceLength)
        {
            var checksum = new double[_model.N];

            for (var i = 0; i < _model.N; i++)
            {
                _estimatedTransitionProbabilityMatrix[i] = new double[_model.N];
                for (var j = 0; j < _model.N; j++)
                {
                    double den = (_model.Normalized) ? double.NaN : 0, num = (_model.Normalized) ? double.NaN : 0;
                    for (var t = 0; t < sequenceLength - 1; t++)
                    {
                        var weight = GetWeightValue(t, observationWeights);
                        if (_model.Normalized)
                        {
                            num = LogExtention.eLnSum(num, LogExtention.eLnProduct(weight, ksi[t][i, j]));
                            den = LogExtention.eLnSum(den, LogExtention.eLnProduct(weight, gamma[t][i]));
                        }
                        else
                        {
                            num += weight * ksi[t][i, j];
                            den += weight * gamma[t][i];
                        }
                    }
                    if (_model.Normalized)
                    {
                        _estimatedTransitionProbabilityMatrix[i][j] = den.EqualsToZero() ? 0.0 : LogExtention.eExp(LogExtention.eLnProduct(num, -den));
                    }
                    else
                    {
                        _estimatedTransitionProbabilityMatrix[i][j] = den.EqualsToZero() ? 0.0 : num / den;
                    }
                    checksum[i] = checksum[i] + _estimatedTransitionProbabilityMatrix[i][j];
                }
            }

            CheckTransitionProbabilityMatrix(checksum);
        }