/// <summary>
        /// Deviations squared sum. Сумма ошибок отклонений аппроксимирующей функции от известных значений
        /// </summary>
        /// <param name="dvDataValues">The data values. Значения аппроксимируемой функции</param>
        /// <param name="dvSpace">The space. Значения независимой переменной</param>
        /// <param name="approxFunc">The approximation function. Аппроксимирующая функция с фиксированными параметрами, заданными вектором параметров.
        /// Значения вычисляются над пространством независимой переменной</param>
        /// <param name="currentParametersSpacePoint">The current parameters space point.
        /// Тот самый фиксированный вектор параметров, используемый для вычисления значений аппроксимирующей функции над пространсовм независимой переменной</param>
        /// <returns>System.Double. Значение абсолютного </returns>
        private static double DeviationsSquaredSumRelative(
            DenseVector dvDataValues,
            DenseVector dvSpace,
            Func <DenseVector, double, double> approxFunc,
            DenseVector currentParametersSpacePoint,
            DenseVector dvWeights)
        {
            double distanceRelative = 0.0d;

            if (dvWeights == null)
            {
                DenseVector dvApproxFuncValues = DenseVector.Create(dvSpace.Count, ix =>
                {
                    return(approxFunc(currentParametersSpacePoint, dvSpace[ix]));
                });
                DenseVector dvDistanceAbs = dvApproxFuncValues - dvDataValues;
                distanceRelative = dvDistanceAbs.Abs() / dvDataValues.Abs();
            }
            else
            {
                DenseVector dvApproxFuncValues = DenseVector.Create(dvSpace.Count, ix =>
                {
                    return(approxFunc(currentParametersSpacePoint, dvSpace[ix]));
                });
                DenseVector dvDistanceAbs = dvApproxFuncValues - dvDataValues;
                dvDistanceAbs.MapInplace(d => Math.Abs(d));
                DenseVector dvDistanceRelative = (DenseVector)(dvDistanceAbs / dvDataValues.Map(Math.Abs));
                dvDistanceRelative = (DenseVector)dvDistanceRelative.PointwiseMultiply(dvWeights);
                distanceRelative   = dvDistanceRelative.Abs();
            }
            return(distanceRelative);
        }
예제 #2
0
 public static DenseVector sigmoid(DenseVector x)
 {
     return((DenseVector)x.Map(sigmoid));
 }