/// <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; } }
//Вычисляет минимальную ошибку параметров 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); }
//Вычисляет суммарную ошибку параметров 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); }
//Записывает ошибку 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; } } }
//Вычисляет значение функции Пред 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); }
public ErrorCalc(string address, ErrorCalc parent) { Address = address; Parent = parent; }
//Вычисления значения скалярной функции, параметры: 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 }); }