예제 #1
0
        public override Parameters[][] FromSample(ClassifiedSample <double[]> sample)
        {
            var dim     = sample.GetDimension();
            var classes = sample.CachedClasses;
            var ts      = new double[classes.Count];
            var result  = new Parameters[classes.Count][];
            var temp    = new double[classes.Count][];

            foreach (var cls in classes)
            {
                result[cls.Value] = new Parameters[dim];
                temp[cls.Value]   = new double[dim];
            }

            for (int i = 0; i < dim; i++)
            {
                foreach (var pData in sample)
                {
                    var data = pData.Key;
                    var cls  = pData.Value;

                    var p = data[i];
                    temp[cls.Value][i] += p;

                    ts[cls.Value] += p;
                }
            }

            foreach (var cls in classes)
            {
                var tmps = temp[cls.Value];
                var rs   = result[cls.Value];
                var bs   = ts[cls.Value];
                if (UseSmoothing)
                {
                    bs += m_Alpha * m_N;
                }

                for (int i = 0; i < dim; i++)
                {
                    var p = tmps[i];
                    if (UseSmoothing)
                    {
                        p += m_Alpha;
                    }

                    rs[i] = new Parameters(p / bs);
                }
            }

            return(result);
        }
예제 #2
0
        public override Parameters[][] FromSample(ClassifiedSample <double[]> sample)
        {
            var dim     = sample.GetDimension();
            var classes = sample.CachedClasses;
            var mus     = new double[classes.Count];
            var mys     = new double[classes.Count];
            var result  = new Parameters[classes.Count][];

            foreach (var cls in classes)
            {
                result[cls.Value] = new Parameters[dim];
            }

            foreach (var cls in classes)
            {
                mus[cls.Value] = 0.0D;
                mys[cls.Value] = 0;
            }

            for (int i = 0; i < dim; i++)
            {
                foreach (var pData in sample)
                {
                    var data = pData.Key;
                    var cls  = pData.Value;
                    mus[cls.Value] += data[i];

                    if (i == 0)
                    {
                        mys[cls.Value]++;
                    }
                }

                foreach (var cls in classes)
                {
                    var mu = mus[cls.Value] / mys[cls.Value];
                    result[cls.Value][i] = new Parameters(mu);
                    mus[cls.Value]       = 0.0D;
                }
            }

            return(result);
        }
예제 #3
0
        public override Parameters[][] FromSample(ClassifiedSample <double[]> sample)
        {
            var dim     = sample.GetDimension();
            var classes = sample.CachedClasses;
            var mus     = new double[classes.Count];
            var sigmas  = new double[classes.Count];
            var mys     = new double[classes.Count];
            var result  = new Parameters[classes.Count][];

            foreach (var cls in classes)
            {
                result[cls.Value] = new Parameters[dim];
            }

            foreach (var cls in classes)
            {
                mus[cls.Value]    = 0.0D;
                sigmas[cls.Value] = 0.0D;
                mys[cls.Value]    = 0;
            }

            for (int i = 0; i < dim; i++)
            {
                foreach (var pData in sample)
                {
                    var data = pData.Key;
                    var cls  = pData.Value;
                    mus[cls.Value] += data[i];

                    if (i == 0)
                    {
                        mys[cls.Value]++;
                    }
                }
                foreach (var cls in classes)
                {
                    mus[cls.Value] /= mys[cls.Value];
                }

                foreach (var pData in sample)
                {
                    var data = pData.Key;
                    var cls  = pData.Value;
                    var t    = data[i] - mus[cls.Value];
                    sigmas[cls.Value] += t * t;
                }

                foreach (var cls in classes)
                {
                    var sigma = Math.Sqrt(sigmas[cls.Value] / mys[cls.Value]);
                    if (UseSigmaMinThreshold && sigma < SigmaMinThreshold)
                    {
                        sigma = SigmaMinThreshold;
                    }
                    result[cls.Value][i] = new Parameters(mus[cls.Value], sigma);
                    mus[cls.Value]       = 0.0D;
                    sigmas[cls.Value]    = 0.0D;
                }
            }

            return(result);
        }