private double calDistance(DataKMean data1, DataKMean data2) { double diffY = data1.V2 - data2.V2; double diffX = data1.V1 - data2.V1; double distance = (Math.Sqrt((diffX * diffX) + (diffY * diffY))); return(distance); }
private void readCsv() { using (TextReader reader = File.OpenText(@"D:\LearningC#\page\LiveChart\test\test\Data\data.csv")) { CsvReader csv = new CsvReader(reader); csv.Configuration.Delimiter = ","; csv.Configuration.MissingFieldFound = null; while (csv.Read()) { DataKMean Record = csv.GetRecord <DataKMean>(); listData.Add(Record); } } }
private void button1_Click_1(object sender, EventArgs e) { #region initital if (seriesCollection != null && seriesCollection.Chart != null) { seriesCollection.Clear(); } listOrigin.Clear(); listOldOrigin.Clear(); listGroup.Clear(); listData.Clear(); readCsv(); for (int indexData = 0; indexData < listData.Count; indexData++) { listGroup.Add(0); } for (int i = 0; i < K; i++) { int randIndex = randomValue(listData.Count); DataKMean origin = new DataKMean(listData[randIndex].V1, listData[randIndex].V2); listOrigin.Add(origin); listOldOrigin.Add(origin); } //initialGraph(listData,listOrigin); #endregion do { for (int indexData = 0; indexData < listData.Count; indexData++) { double minDistance = -1; for (int indexOrigin = 0; indexOrigin < listOrigin.Count; indexOrigin++) { double distance = calDistance(listData[indexData], listOrigin[indexOrigin]); if (indexOrigin == 0) { minDistance = distance; listGroup[indexData] = (indexOrigin + 1); } else if (distance < minDistance) { minDistance = distance; listGroup[indexData] = (indexOrigin + 1); } } } for (int indexOrigin = 0; indexOrigin < listOrigin.Count; indexOrigin++) { listOldOrigin[indexOrigin] = new DataKMean(listOrigin[indexOrigin].V1, listOrigin[indexOrigin].V2); } for (int indexOrigin = 0; indexOrigin < listOrigin.Count; indexOrigin++) { double sumV1 = 0, sumV2 = 0; double count = 0; for (int indexData = 0; indexData < listData.Count; indexData++) { if (listGroup[indexData] == (indexOrigin + 1)) { count++; sumV1 += listData[indexData].V1; sumV2 += listData[indexData].V2; } } double avgV1 = sumV1 / count; double avgV2 = sumV2 / count; if (count != 0) { listOrigin[indexOrigin] = new DataKMean(avgV1, avgV2); } else { listOrigin[indexOrigin] = new DataKMean(listData[indexOrigin].V1, listOrigin[indexOrigin].V2); } } double maxError = 0; for (int indexOrigin = 0; indexOrigin < listOrigin.Count; indexOrigin++) { distanceError = calDistance(listOldOrigin[indexOrigin], listOrigin[indexOrigin]); if (maxError < distanceError) { maxError = distanceError; } } distanceError = maxError; } while (distanceError > errorAccept); //var r = new Random(); //foreach (var values in SeriesCollection.Select(x => x.Values)) //{ // for (var i = 0; i < 20; i++) // { // ((ObservablePoint)values[i]).X = r.NextDouble() * 10; // ((ObservablePoint)values[i]).Y = r.NextDouble() * 10; // } //} //moveGraphOriginal(listOrigin); initialGraph(listData, listOrigin); }