Changeset 12590 for branches/GBTtrunkintegration/HeuristicLab.Algorithms.DataAnalysis/3.4/GradientBoostedTrees/LossFunctions/AbsoluteErrorLoss.cs
 Timestamp:
 07/04/15 16:03:36 (9 years ago)
 File:

 1 edited
Legend:
 Unmodified
 Added
 Removed

branches/GBTtrunkintegration/HeuristicLab.Algorithms.DataAnalysis/3.4/GradientBoostedTrees/LossFunctions/AbsoluteErrorLoss.cs
r12374 r12590 1 using System; 1 #region License Information 2 /* HeuristicLab 3 * Copyright (C) 20022015 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 23 using System; 2 24 using System.Collections.Generic; 3 25 using System.Diagnostics; 4 26 using System.Linq; 5 using System.Text;6 using System.Threading.Tasks;7 27 using HeuristicLab.Common; 8 using HeuristicLab.Core;9 28 10 namespace GradientBoostedTrees { 29 namespace HeuristicLab.Algorithms.DataAnalysis { 30 // loss function for the weighted absolute error 11 31 public class AbsoluteErrorLoss : ILossFunction { 12 32 public double GetLoss(IEnumerable<double> target, IEnumerable<double> pred, IEnumerable<double> weight) { … … 54 74 // line search for abs error 55 75 LineSearchFunc lineSearch = (idx, startIdx, endIdx) => { 76 // Median() is allocating an array anyway 77 // It would be possible to preallocated an array for the residuals if Median() would allow specification of a subrange 56 78 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 } 61 85 return res.Median(); 62 63 // old code for weighted median calculation64 // int nRows = endIdx  startIdx + 1; // startIdx and endIdx are inclusive65 // 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 weight73 // 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 + offset79 // 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 first86 //87 // while (aggWeight < totalWeight / 2) {88 // tsEnumerator.MoveNext();89 // aggWeight += tsEnumerator.Current.weight;90 // }91 // return tsEnumerator.Current.res;92 // }93 86 }; 94 87 return lineSearch;
Note: See TracChangeset
for help on using the changeset viewer.