/// <summary>
        ///     Train the logistic layer, the output layer.
        /// </summary>
        /// <param name="input">The input (x).</param>
        /// <param name="ideal">The expected output (y, or labels).</param>
        private void TrainLogisticLayer(double[] input, double[] ideal)
        {
            var pYgivenX = new double[_network.LogLayer.OutputCount];
            var dy       = new double[_network.LogLayer.OutputCount];

            for (var i = 0; i < _network.LogLayer.OutputCount; i++)
            {
                pYgivenX[i] = 0;
                for (var j = 0; j < _network.LogLayer.InputCount; j++)
                {
                    pYgivenX[i] += _network.LogLayer.Weights[i][j] * input[j];
                }
                pYgivenX[i] += _network.LogLayer.Bias[i];
            }
            _network.LogLayer.Softmax(pYgivenX);


            for (var i = 0; i < _network.LogLayer.OutputCount; i++)
            {
                dy[i] = ideal[i] - pYgivenX[i];
                ErrorCalc.UpdateError(ideal[i], pYgivenX[i]);

                for (var j = 0; j < _network.LogLayer.InputCount; j++)
                {
                    _network.LogLayer.Weights[i][j] += _learningRate * dy[i] * input[j] / _trainingInput.Length;
                }

                _network.LogLayer.Bias[i] += _learningRate * dy[i] / _trainingInput.Length;
            }
        }
Exemple #2
0
        //Вычисляет минимальную ошибку параметров
        private ErrorCalc MinErr(Moment[] par)
        {
            ErrorCalc err = par[0].Error;

            foreach (var m in par)
            {
                if (err != null && m != null && m.Error == null)
                {
                    err = null;
                }
            }
            return(err);
        }
Exemple #3
0
        //Вычисляет суммарную ошибку параметров
        private ErrorCalc MaxErr(IEnumerable <Moment> par)
        {
            ErrorCalc err = null;

            foreach (var m in par)
            {
                if (err == null && m != null && m.Error != null)
                {
                    err = m.Error;
                }
            }
            return(err);
        }
Exemple #4
0
 //Записывает ошибку text в res, если она не совпадает с предыдущей
 public void PutErr(string text, Moment res)
 {
     if (res.Error != null)
     {
         _errorScalar = res.Error;
     }
     else
     {
         if (_errorScalar != null && _errorScalar.Parent == null && text == _errorScalar.Text)
         {
             res.Error = _errorScalar;
         }
         else
         {
             res.Error    = new ErrorCalc(text, _calc.FullCode);
             _errorScalar = res.Error;
         }
     }
 }
Exemple #5
0
        //Вычисляет значение функции Пред f от параметров par
        private SingleValue CalcPrev(string f, CalcValue[] par)
        {
            string acode = par[0].SingleValue.LastMoment.String;
            string scode = acode.Split('.')[0];
            var    pr    = CalcParam.Project;
            var    cpr   = CalcRun;

            while (cpr != pr.RootParam && !cpr.CalcParam.Methods.ContainsKey(scode))
            {
                cpr = cpr.Owner;
            }
            while (cpr != pr.RootParam)
            {
                while (cpr.Inputs.Count != 0)
                {
                    cpr = cpr.Caller;
                }
                acode = cpr.CalcParam.Code + "." + acode;
                cpr   = cpr.Owner;
            }
            if (!pr.ArchiveParams.ContainsKey(acode))
            {
                var err = new ErrorCalc("Не найден архивный параметр " + acode, CalcParam.FullCode);
                return(new SingleValue(new Moment(par[1].SingleValue.DataType, err)));
            }
            var beg = pr.ThreadCalc.PeriodBegin;
            var p1  = par[1].SingleValue.LastMoment.Clone(beg);

            if (f == "prevabs")
            {
                var ap = pr.ArchiveParams[acode];
                var m  = ((ap.AbsoluteEnd == beg && ap.AbsoluteValue != null) ? ap.AbsoluteValue : p1).Clone();
                if (par.Length == 2 || !par[2].SingleValue.LastMoment.Boolean)
                {
                    m.Time = beg;
                }
                return(new SingleValue(m));
            }
            var    pp  = pr.PrevParams[acode];
            Moment mom = null;

            if (f == "prev")
            {
                mom = (pp.LastBase == null || pp.LastBase.DataType == DataType.Value) ? p1 : pp.LastBase;
            }
            if (f == "prevhour")
            {
                mom = (pp.LastHour == null || pp.LastHour.DataType == DataType.Value) ? p1 : pp.LastHour;
            }
            if (f == "prevday")
            {
                mom = (pp.LastDay == null || pp.LastDay.DataType == DataType.Value) ? p1 : pp.LastDay;
            }
            if (mom != null)
            {
                return(new SingleValue(mom.Clone(beg)));
            }
            if (f == "prevmom")
            {
                return(new SingleValue(pp.ManyMoments.Where(m => beg.Subtract(m.Time).TotalMinutes <= p1.Real).ToList()));
            }
            if (f == "prevperiod")
            {
                return(new SingleValue(pp.ManyBase.Where(m => beg.Subtract(m.Time).TotalMinutes <= p1.Real).ToList()));
            }
            if (f == "prevhourperiod")
            {
                return(new SingleValue(pp.ManyHour.Where(m => beg.Subtract(m.Time).TotalHours <= p1.Real).ToList()));
            }
            if (f == "prevdayperiod")
            {
                return(new SingleValue(pp.ManyDay.Where(m => beg.Subtract(m.Time).TotalDays <= p1.Real).ToList()));
            }
            return(null);
        }
Exemple #6
0
 public ErrorCalc(string address, ErrorCalc parent)
 {
     Address = address;
     Parent  = parent;
 }
Exemple #7
0
        //Вычисления значения скалярной функции, параметры: par - списки Moment, dt - тип данных результата,
        public SingleValue ScalarFunction(SingleValue[] par, DataType dt, ScalarDelegate scalar, ComplicateDelegate comp = null)
        {
            ErrorCalc error = null;

            _errorScalar = null;
            int  n       = par.Length;
            var  pos     = new int[n];            //Текущий обрабатываемый индекс для каждого списка
            var  islist  = new bool[n];           //Значение является списком
            var  spar    = new Moment[n];         //Параметры для вызова скалярного делегата
            var  list    = new List <Moment> [n]; //Параметры, обрабатываемые как списки (а не как константы)
            bool hasList = false;                 //Среди параметров есть хоть один список

            for (int i = 0; i < n; ++i)
            {
                pos[i] = -1;
                if ((par[i].Moments == null || par[i].Moments.Count == 0) && par[i].Moment == null && !(comp != null && (comp.Method.Name == "Compunion" || comp.Method.Name == "Compendifp"))) //Пустой список
                {
                    return(new SingleValue(new List <Moment>()));
                }
                if (comp == null)
                {
                    hasList |= islist[i] = (par[i].Type == SingleType.List);
                    if (!islist[i])
                    {
                        spar[i] = par[i].Moment;
                    }
                    else
                    {
                        list[i] = par[i].Moments;
                    }
                }
                else
                {
                    hasList = islist[i] = true;
                    if (par[i].Moments != null)
                    {
                        list[i] = par[i].Moments;
                    }
                    else
                    {
                        list[i] = new List <Moment>();
                        if (par[i].Moment != null)
                        {
                            list[i].Add(par[i].Moment);
                        }
                    }
                }
                //hasList |= par[i].Type == SingleType.List;
                //if (comp != null && par[i].Moment != null)
                //    list[i] = new List<Moment> {par[i].Moment};
                //else list[i] = par[i].Moments;
                //pos[i] = -1;
                //if (par[i].Type == SingleType.Moment && comp == null)
                //    spar[i] = par[i].Moment;
            }
            if (!hasList) //Одно значение
            {
                DateTime t = Different.MaxDate;
                foreach (var p in par)
                {
                    if (p.Moment.Time != Different.MinDate && p.Moment.Time < t)
                    {
                        t = p.Moment.Time;
                    }
                }
                if (t == Different.MaxDate)
                {
                    t = Begin;
                }
                var mv = new Moment(dt, t, MaxErr(spar), MaxNd(spar));
                scalar(spar, mv);
                return(new SingleValue(mv)
                {
                    Error = mv.Error
                });
            }

            //Список значений
            var  rlist  = new List <Moment>();//Результаты
            var  d      = Different.MaxDate;
            bool e      = true;
            var  parnum = new HashSet <int>(); //Номера параметров с точками в рассматриваемое время

            while (e)
            {
                e = false;
                DateTime ctime = d;
                for (int i = 0; i < n; ++i)
                {
                    if (islist[i] && pos[i] + 1 < list[i].Count)
                    {
                        e = true;
                        if (ctime > list[i][pos[i] + 1].Time)
                        {
                            ctime = list[i][pos[i] + 1].Time;
                        }
                    }
                }
                if (e)
                {
                    parnum.Clear();
                    for (int i = n - 1; i >= 0; --i)
                    {
                        if (islist[i])
                        {
                            if (pos[i] + 1 < list[i].Count && ctime == list[i][pos[i] + 1].Time)
                            {
                                pos[i]++;
                                parnum.Add(i);
                            }
                            spar[i] = Interpolation(_interpol, list[i], pos[i], ctime);
                        }
                    }
                    var m = new Moment(dt, ctime, MaxErr(spar), MaxNd(spar));
                    if (comp == null)
                    {
                        scalar(spar, m);
                        if (scalar.Method.Name != "endif")
                        {
                            error |= MaxErr(spar);
                        }
                        error |= _errorScalar;
                        rlist.Add(m);
                    }
                    else if (comp(spar, m, parnum))
                    {
                        rlist.Add(m);
                    }
                }
            }
            return(new SingleValue(rlist)
            {
                Error = error
            });
        }