// construct clone dictionary by insert or remove single label public static void UpdateDicByAction(Dictionary <double, double>[] dicLabelAmount, double[] singleLabel, GiniHelper.ActionType action) { int labelDim = dicLabelAmount.Count(); for (int dim = 0; dim < labelDim; dim++) { var dimLabel = singleLabel[dim]; if (dicLabelAmount[dim].ContainsKey(dimLabel)) { switch (action) { case ActionType.Insert: dicLabelAmount[dim][dimLabel]++; break; case ActionType.Remove: dicLabelAmount[dim][dimLabel]--; break; } } else { switch (action) { case ActionType.Insert: dicLabelAmount[dim][dimLabel] = 1; break; case ActionType.Remove: // label not in a dic, do nothing break; } } //clean from dic labels with zero amount foreach (var item in dicLabelAmount[dim].Where(kvp => kvp.Value == 0).ToList()) { dicLabelAmount[dim].Remove(item.Key); } } }
public static double GetGiniByAction(Dictionary <double, double>[] dicLabelAmount, double[] singleLabel, GiniHelper.ActionType action, int numOfLabels) { var labelDim = singleLabel.Count(); UpdateDicByAction(dicLabelAmount, singleLabel, action); return(GetGiniValueByDictionary(dicLabelAmount, numOfLabels)); }