예제 #1
0
        public double[] Estimate(SigmaEstimationParameters <TDistribution, double[]> parameters)
        {
            if (_sigmaUnivariate != null)
            {
                return(_sigmaUnivariate);
            }
            _sigmaUnivariate = new double[parameters.Model.N];
            for (var n = 0; n < parameters.Model.N; n++)
            {
                var T = parameters.Observations.Count;

                var variance = 0d;
                var nK       = 0d;
                for (var t = 0; t < T; t++)
                {
                    nK += parameters.Gamma[t][n];
                    var x = parameters.Observations[t].Value[0];
                    var z = x - parameters.Mean[n];
                    var m = z * z;
                    m        = m * parameters.Gamma[t][n];
                    variance = variance + m;
                }
                _sigmaUnivariate[n] = variance / nK;
            }

            return(_sigmaUnivariate);
        }
예제 #2
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);
        }