private List<List<Double>> normalize(List<List<Double>> rds) {
int rawDataLength = rds[0].Count;
List<List<Double>> nds = new List<List<Double>>();
means = new List<Double>();
stdevs = new List<Double>();
List<List<Double>> normalizedColumns = new List<List<Double>>();
// clculate means for each coponent of example data
for (int i = 0; i < rawDataLength; i++) {
List<Double> columnValues = new List<Double>();
foreach (List<Double> rawDatum in rds) {
columnValues.Add(rawDatum[i]);
}
double mean = Util.calculateMean(columnValues);
means.Add(mean);
double stdev = Util.calculateStDev(columnValues, mean);
stdevs.Add(stdev);
normalizedColumns.Add(Util.normalizeFromMeanAndStdev(columnValues,
mean, stdev));
}
// re arrange data from columns
// TODO Assert normalized columns have same size etc
int columnLength = normalizedColumns[0].Count;
int numberOfColumns = normalizedColumns.Count;
for (int i = 0; i < columnLength; i++) {
List<Double> lst = new List<Double>();
for (int j = 0; j < numberOfColumns; j++) {
lst.Add(normalizedColumns[j][i]);
}
nds.Add(lst);
}
return nds;
}