public Centroid[] Run(double[][] dataSet) { List <Centroid> centroidList = new List <Centroid>(); for (int i = 0; i < _k; i++) { Centroid centroid = new Centroid(dataSet, Misc.centroidColors[i]); centroidList.Add(centroid); } OnUpdateProgress(new KMeansEventArgs(centroidList, dataSet)); while (true) { foreach (Centroid centroid in centroidList) { centroid.Reset(); } for (int i = 0; i < dataSet.GetLength(0); i++) { double[] point = dataSet[i]; int closestIndex = -1; double minDistance = Double.MaxValue; for (int k = 0; k < centroidList.Count; k++) { double distance = _distance.Run(centroidList[k].Array, point); if (distance < minDistance) { closestIndex = k; minDistance = distance; } } centroidList[closestIndex].addPoint(point); } foreach (Centroid centroid in centroidList) { centroid.MoveCentroid(); } OnUpdateProgress(new KMeansEventArgs(centroidList, null)); bool hasChanged = false; foreach (Centroid centroid in centroidList) { if (centroid.HasChanged()) { hasChanged = true; break; } } if (!hasChanged) { break; } } return(centroidList.ToArray()); }
public Centroid[] Run(double[][] dataSet) /* Veriler en yakın sınıf merkezine atanır daha sonra merkezleri yeniden hesaplamır. * Son olarak veriler en yakın olduğu merkeze tekrar atanır. */ { List <Centroid> centroidList = new List <Centroid>(); for (int i = 0; i < _k; i++) { Centroid centroid = new Centroid(dataSet, Misc.centroidColors[i]); centroidList.Add(centroid); } OnUpdateProgress(new KMeansEventArgs(centroidList, dataSet)); while (true) /*Verilen datayı önceden tanımladığımız k gruba ayırmıştık. Sınıf merkezleri k değerlerini belirler. * Verileri en yakın sınıf merkezlerine atarız, Her bir sınıfa atanmış verilerin * ortalamasını hesaplayıp sınıf merkezlerini, k tane, hesaplanmış ortalama değerlerine iletiriz. */ { foreach (Centroid centroid in centroidList) { centroid.Reset(); } for (int i = 0; i < dataSet.GetLength(0); i++) { double[] point = dataSet[i]; int closestIndex = -1; double minDistance = Double.MaxValue; for (int k = 0; k < centroidList.Count; k++) { double distance = _distance.Run(centroidList[k].Array, point); if (distance < minDistance) { closestIndex = k; minDistance = distance; } } centroidList[closestIndex].addPoint(point); } foreach (Centroid centroid in centroidList) { centroid.MoveCentroid(); } OnUpdateProgress(new KMeansEventArgs(centroidList, null)); bool hasChanged = false; foreach (Centroid centroid in centroidList) { if (centroid.HasChanged()) { hasChanged = true; break; } } if (!hasChanged) { break; } } return(centroidList.ToArray()); }