Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/04/15 16:03:36 (9 years ago)
Author:
gkronber
Message:

#2261: preparations for trunk integration (adapt to current trunk version, add license headers, add comments, improve code quality)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GBT-trunkintegration/HeuristicLab.Algorithms.DataAnalysis/3.4/GradientBoostedTrees/LossFunctions/AbsoluteErrorLoss.cs

    r12374 r12590  
    1 using System;
     1#region License Information
     2/* HeuristicLab
     3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     4 * and the BEACON Center for the Study of Evolution in Action.
     5 *
     6 * This file is part of HeuristicLab.
     7 *
     8 * HeuristicLab is free software: you can redistribute it and/or modify
     9 * it under the terms of the GNU General Public License as published by
     10 * the Free Software Foundation, either version 3 of the License, or
     11 * (at your option) any later version.
     12 *
     13 * HeuristicLab is distributed in the hope that it will be useful,
     14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 * GNU General Public License for more details.
     17 *
     18 * You should have received a copy of the GNU General Public License
     19 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
     20 */
     21#endregion
     22
     23using System;
    224using System.Collections.Generic;
    325using System.Diagnostics;
    426using System.Linq;
    5 using System.Text;
    6 using System.Threading.Tasks;
    727using HeuristicLab.Common;
    8 using HeuristicLab.Core;
    928
    10 namespace GradientBoostedTrees {
     29namespace HeuristicLab.Algorithms.DataAnalysis {
     30  // loss function for the weighted absolute error
    1131  public class AbsoluteErrorLoss : ILossFunction {
    1232    public double GetLoss(IEnumerable<double> target, IEnumerable<double> pred, IEnumerable<double> weight) {
     
    5474      // line search for abs error
    5575      LineSearchFunc lineSearch = (idx, startIdx, endIdx) => {
     76        // Median() is allocating an array anyway
     77        // It would be possible to pre-allocated an array for the residuals if Median() would allow specification of a sub-range
    5678        int nRows = endIdx - startIdx + 1;
    57         var res = from offset in Enumerable.Range(0, nRows)
    58                   let i = startIdx + offset
    59                   let row = idx[i]
    60                   select (targetArr[row] - predArr[row]);
     79        var res = new double[nRows];
     80        for (int offset = 0; offset < nRows; offset++) {
     81          var i = startIdx + offset;
     82          var row = idx[i];
     83          res[offset] = targetArr[row] - predArr[row];
     84        }
    6185        return res.Median();
    62 
    63         // old code for weighted median calculation
    64         // int nRows = endIdx - startIdx + 1; // startIdx and endIdx are inclusive
    65         // if (nRows == 1) return targetArr[idx[startIdx]] - predArr[idx[startIdx]];
    66         // else if (nRows == 2) {
    67         //   if (weightArr[idx[startIdx]] > weightArr[idx[endIdx]]) {
    68         //     return targetArr[idx[startIdx]] - predArr[idx[startIdx]];
    69         //   } else if (weightArr[idx[startIdx]] < weightArr[idx[endIdx]]) {
    70         //     return targetArr[idx[endIdx]] - predArr[idx[endIdx]];
    71         //   } else {
    72         //     // same weight
    73         //     return ((targetArr[idx[startIdx]] - predArr[idx[startIdx]]) +
    74         //        (targetArr[idx[endIdx]] - predArr[idx[endIdx]])) / 2;
    75         //   }
    76         // } else {
    77         //   var ts = from offset in Enumerable.Range(0, nRows)
    78         //            let i = startIdx + offset
    79         //            select new { res = targetArr[idx[i]] - predArr[idx[i]], weight = weightArr[idx[i]] };
    80         //   ts = ts.OrderBy(t => t.res);
    81         //   var totalWeight = ts.Sum(t => t.weight);
    82         //   var tsEnumerator = ts.GetEnumerator();
    83         //   tsEnumerator.MoveNext();
    84         //
    85         //   double aggWeight = tsEnumerator.Current.weight; // weight of first
    86         //
    87         //   while (aggWeight < totalWeight / 2) {
    88         //     tsEnumerator.MoveNext();
    89         //     aggWeight += tsEnumerator.Current.weight;
    90         //   }
    91         //   return tsEnumerator.Current.res;
    92         // }
    9386      };
    9487      return lineSearch;
Note: See TracChangeset for help on using the changeset viewer.