public static double Calculate(LinkageFunctionTypes linkageFunction, DistanceMeasurementTypes distanceMeasurement, List <double[]> firstClusterDatapoints, List <double[]> secondClusterDatapoints) { switch (linkageFunction) { case LinkageFunctionTypes.Single: return(CalculateSingle(distanceMeasurement, firstClusterDatapoints, secondClusterDatapoints)); case LinkageFunctionTypes.Complete: return(CalculateComplete(distanceMeasurement, firstClusterDatapoints, secondClusterDatapoints)); } return(default(double)); }
public void ComputeDistance(LinkageFunctionTypes linkageFunction, DistanceMeasurementTypes distanceMeasurement) { if (Child == null) { Distance = LinkageFunctionHelper.Calculate(linkageFunction, distanceMeasurement, new List <double[]> { FirstDatapoint }, new List <double[]> { SecondDatapoint });; return; } Distance = LinkageFunctionHelper.Calculate(linkageFunction, distanceMeasurement, new List <double[]> { FirstDatapoint }, Child.GetAllDatapoints()); Child.ComputeDistance(linkageFunction, distanceMeasurement); }
public static double Calculate(DistanceMeasurementTypes distanceMeasurementType, double[] vector1, double[] vector2) { switch (distanceMeasurementType) { case DistanceMeasurementTypes.Canberra: return(CalculateCanberraDistance(vector1, vector2)); case DistanceMeasurementTypes.Euclidian: return(CalculateEucledianDistance(vector1, vector2)); case DistanceMeasurementTypes.Manhattan: return(CalculateManhattanDistance(vector1, vector2)); case DistanceMeasurementTypes.Maximum: return(CalculateMaxDistance(vector1, vector2)); } return(default(double)); }
public static double CalculateComplete(DistanceMeasurementTypes distanceMeasurement, List <double[]> firstClusterDatapoints, List <double[]> secondClusterDatapoints) { double max = 0; for (int i = 0; i < firstClusterDatapoints.Count(); i++) { for (int j = 0; j < secondClusterDatapoints.Count(); j++) { var firstDatapoint = firstClusterDatapoints[i]; var secondDatapoint = secondClusterDatapoints[j]; var distance = DistanceCalculationHelper.Calculate(distanceMeasurement, firstDatapoint, secondDatapoint); if (distance > max) { max = distance; } } } return(max); }
public static double CalculateSingle(DistanceMeasurementTypes distanceMeasurement, List <double[]> firstClusterDatapoints, List <double[]> secondClusterDatapoints) { double min = double.MaxValue; for (int i = 0; i < firstClusterDatapoints.Count(); i++) { for (int j = 0; j < secondClusterDatapoints.Count(); j++) { var firstDatapoint = firstClusterDatapoints[i]; var secondDatapoint = secondClusterDatapoints[j]; var distance = DistanceCalculationHelper.Calculate(distanceMeasurement, firstDatapoint, secondDatapoint); if (distance < min) { min = distance; } } } return(min); }
public static double Calculate(LinkageFunctionTypes linkageFunction, DistanceMeasurementTypes distanceMeasurement, Cluster firstCluster, Cluster secondCluster) { return(Calculate(linkageFunction, distanceMeasurement, firstCluster.GetAllDatapoints(), secondCluster.GetAllDatapoints())); }
public RootCluster(Cluster firstCluster, Cluster secondCluster, LinkageFunctionTypes linkageFunction, DistanceMeasurementTypes distanceMeasurement) { FirstCluster = firstCluster; SecondCluster = secondCluster; Distance = LinkageFunctionHelper.Calculate(linkageFunction, distanceMeasurement, FirstCluster, SecondCluster); FirstCluster.ComputeDistance(linkageFunction, distanceMeasurement); SecondCluster.ComputeDistance(linkageFunction, distanceMeasurement); }