using System.Collections.Generic; using System.Linq; using HeuristicLab.Common; namespace WalkExporter { public class InstancesStandardizer { private IDictionary normalization; public IEnumerable GetMeans() { return normalization.Select(x => x.Value.Item1); } public IEnumerable GetStdevs() { return normalization.Select(x => x.Value.Item2); } private InstancesStandardizer(IList instances, IEnumerable features) { normalization = instances .SelectMany(x => x.Features) .GroupBy(x => x.Key) .ToDictionary(x => x.Key, x => { var values = x.Select(y => y.GetNumericValue()); return (Avg: values.Average(), Stdev: values.StandardDeviation()); }); } public static InstancesStandardizer Create(IList instances, IEnumerable features) { return new InstancesStandardizer(instances, features); } public static InstancesStandardizer CreateAndApply(IList instances, IEnumerable features) { var standardizer = Create(instances, features); standardizer.Apply(instances); return standardizer; } public void Apply(IList instances) { for (var i = 0; i < instances.Count; i++) { var inst = instances[i]; for (var x = 0; x < inst.Features.Count; x++) { var feat = inst.Features[x]; feat.SetNumericValue((inst.Features[x].GetNumericValue() - normalization[feat.Key].Avg) / normalization[feat.Key].Stdev); } } } } }