public static ClusterObject Create(string rawData) { ClusterObject newClusterObject = new ClusterObject(); string[] coordList = rawData.Split(" ".ToCharArray()); foreach (string coord in coordList) { newClusterObject.Coordinates.Add(Double.Parse(coord)); } return newClusterObject; }
public override double CalculateDistance(ClusterObject obj1, ClusterObject obj2) { double dDistance = 0; double dTemp = 0; for (int i = 0; i < obj1.Coordinates.Count; i++) { dTemp += Math.Pow((obj2.Coordinates[i] - obj1.Coordinates[i]), 2); } dDistance = Math.Sqrt(dTemp); return dDistance; }
public void UpdateClusterMeans() { ClusterObject newCentroid = new ClusterObject(); double[] newCoordinates = new double[m_nDimensionCount]; foreach (KeyValuePair<int, ClusterObject> kvp in m_dictObjects) { for (int i = 0; i < m_nDimensionCount; i++) { newCoordinates[i] += kvp.Value.Coordinates[i]; } } for (int i = 0; i < m_nDimensionCount; i++) { newCoordinates[i] /= m_dictObjects.Count; } newCentroid.Coordinates = new List<double>(newCoordinates); if (m_OldClusterCentroid == null) { m_OldClusterCentroid = newCentroid; } else { m_OldClusterCentroid = m_ClusterCentroid; } m_ClusterCentroid = newCentroid; EuclidianDistanceStrategy e = new EuclidianDistanceStrategy(); double dDistance = e.CalculateDistance(m_OldClusterCentroid, m_ClusterCentroid); if (dDistance > 0) //TODO: Set an acceptable margin to determine if the // center moved or not. To aviod osciallation, small changes // may be neglected. { CenterMoved = true; } else { CenterMoved = false; } }
public void AddObject(int rowId, ClusterObject newObject) { m_dictObjects.Add(rowId, newObject); m_nDimensionCount = newObject.Coordinates.Count; }
public static double CalculateDistance(ClusterObject object1, ClusterObject object2) { EuclidianDistanceStrategy distance = new EuclidianDistanceStrategy(); return distance.CalculateDistance(object1, object2); }
abstract public double CalculateDistance(ClusterObject obj1, ClusterObject obj2);
private Cluster FindClosestCluster(ClusterObject clusterObject) { Trace.WriteLineIf(SystemDefinitions.ErrSev.TraceVerbose, HelperMethods.GenerateLogLine("Find closest cluster to object : " + clusterObject.ToString())); double[] distances = new double[K]; Cluster closestCluster = null; for (int i = 0; i < clusters.Length; i++) { distances[i] = ClusterObject.CalculateDistance(clusterObject, clusters[i].ClusterCentroid); Trace.WriteLineIf(SystemDefinitions.ErrSev.TraceVerbose, HelperMethods.GenerateLogLine(String.Format("Distance for cluster [{0}] = {1}", i, distances[i]))); } int nSmallestDistanceIndex = 0; double dSmallestDistance = Double.MaxValue; for (int i = 0; i < distances.Length; i++) { if (distances[i] < dSmallestDistance) { dSmallestDistance = distances[i]; nSmallestDistanceIndex = i; } } closestCluster = clusters[nSmallestDistanceIndex]; Trace.WriteLineIf(SystemDefinitions.ErrSev.TraceVerbose, HelperMethods.GenerateLogLine(String.Format("Closest cluster : [{0}] ", nSmallestDistanceIndex))); return closestCluster; }
public override double CalculateDistance(ClusterObject obj1, ClusterObject obj2) { throw new NotImplementedException(); }