private IEnumerable<Tuple<List<double>, int>> GetTrainingData(SENSOR machine, int start, int trainingEnd) { //Split into training & prediction set List<List<double>> featureVectors = new List<List<double>>(); List<int> timeStamps = new List<int>(); if (machine == SENSOR.GSR) { int stepSize = 100; for (int i = 0; i < _fdAnomaly.gsrData.Last().timestamp - _fdAnomaly.gsrData.First().timestamp - GSR_DURATION + GSR_DELAY; i += stepSize) { List<double> featureVector = new List<double>(); List<double> data = _fdAnomaly.gsrData.SkipWhile(x => (x.timestamp - _fdAnomaly.gsrData.First().timestamp) < i + GSR_DELAY).TakeWhile(x => i + GSR_DURATION > (x.timestamp - _fdAnomaly.gsrData.First().timestamp)).Select(x => (double)x.resistance).ToList(); if (data.Count == 0) continue; featureVector.Add(data.Average()); featureVector.Add(data.Max()); featureVector.Add(data.Min()); double avg = data.Average(); double sd = Math.Sqrt(data.Average(x => Math.Pow(x - avg, 2))); featureVector.Add(sd); featureVectors.Add(featureVector); timeStamps.Add(i); } } featureVectors = featureVectors.NormalizeFeatureList<double>(Normalize.OneMinusOne).ToList(); var dataSet = featureVectors.Zip(timeStamps, (first, second) => { return Tuple.Create(first, second); }); var trainingSet = dataSet.SkipWhile(x => x.Item2 < start).TakeWhile(x => x.Item2 < trainingEnd); return trainingSet; }