/// <summary> /// Gets specified centre. /// </summary> public List <IReadOnlyList <double> > GetCentre(ECentreMode mode, ECandidateMode iMode) { List <IReadOnlyList <double> > centre = new List <IReadOnlyList <double> >(); this.GetCentre(mode, iMode, centre); return(centre); }
/// <summary> /// Calculates cluster centre. /// </summary> private void GetCentre(ECentreMode mode, ECandidateMode iMode, List <IReadOnlyList <double> > centres) { centres.Clear(); IEnumerable <IReadOnlyList <double> > list; int listCount; switch (iMode) { case ECandidateMode.Exemplars: list = this.Exemplars; listCount = this.Exemplars.Count; break; case ECandidateMode.Assignments: list = this.Assignments.Vectors.Select(z => z.Values); listCount = this.Assignments.List.Count; break; default: throw new InvalidOperationException("Invalid switch. 9B5EF96B-53F3-4651-AF7D-60B27475C7B5"); } if (list.IsEmpty()) // check this function { return; } switch (mode) { case ECentreMode.All: ////////////////// // ALL EXEMPLARS { foreach (IReadOnlyList <double> e in list) { centres.Add(e); } } break; case ECentreMode.Average: //////////////////////////// // AVERGE OF ALL EXEMPLARS { int numPoints = list.First().Count; double[] centre = new double[numPoints]; for (int o = 0; o < numPoints; o++) { double total = 0; foreach (IReadOnlyList <double> v in list) { total += v[o]; } centre[o] = total / listCount; } centres.Add(centre); } break; } }
/// <summary> /// Calculates cluster centre. /// </summary> public void SetCentre(ECentreMode mode, ECandidateMode iMode) { this.GetCentre(mode, iMode, this.Centres); }