private void voBtnKMeanPPV_Click(object sender, EventArgs e) { int kiNumClusters; List <ClusterCenterPoint> koCList = null; try { if (this.voPList.Count == 0) { throw new Exception("No points data exists.."); } kiNumClusters = int.Parse(this.voTbCount.Text); KMeans.MDoKMeansWithMinVariance(kiNumClusters, ref this.voPList, ref koCList, 0.1, 1000, true); MyImageProc.MDrawClusters(this.voPB, this.voPList, 1.0, kiNumClusters); this.voTbResult.Text = mComputeAndShowVarianceResults(kiNumClusters); } catch (Exception koEx) { MessageBox.Show(koEx.Message); } }
private void voBtnLoad_Click(object sender, EventArgs e) { string koDataFileName; string koLine; string[] koParts; char[] kcDelim = { ',', ' ' }; try { OpenFileDialog koDlg = new OpenFileDialog( ); if (koDlg.ShowDialog( ) == DialogResult.OK) { this.voPList.Clear( ); koDataFileName = koDlg.FileName; using (StreamReader koReader = new StreamReader(koDataFileName)) { while ((koLine = koReader.ReadLine( )) != null) { koParts = koLine.Split(kcDelim); if (koParts.Length >= 3) { this.voPList.Add(new MyPoint( ) { VdX = double.Parse(koParts[1]), VdY = double.Parse(koParts[2]) }); } } MyImageProc.MDrawClusters(this.voPB, this.voPList, 1.0, 1); } } } catch (Exception koEx) { MessageBox.Show(koEx.Message); } }
private void voBtnInit_Click(object sender, EventArgs e) { MyPoint koPt; Random koRand = new Random( ); int kiDataLength = 5000; // number of data points double kdRNum; this.voPList.Clear( ); // create 4 distributions with different means and std devs double kdMeanX0 = 150, kdMeanX1 = 250, kdMeanX2 = 375, kdMeanX3 = 475; double kdMeanY0 = 175, kdMeanY1 = 250, kdMeanY2 = 350, kdMeanY3 = 450; double kdStdDevX0 = 240, kdStdDevX1 = 270, kdStdDevX2 = 220, kdStdDevX3 = 260; double kdStdDevY0 = 250, kdStdDevY1 = 240, kdStdDevY2 = 280, kdStdDevY3 = 245; int kiIndex = 0; for (int i = 0; i < (kiDataLength / 4); i++) { koPt = new MyPoint( ); kdRNum = koRand.NextDouble( ); if (kdRNum < 0.5) { koPt.VdX = koRand.NextDouble( ) * kdStdDevX0 / 2 + kdMeanX0; } else { koPt.VdX = -1 * koRand.NextDouble( ) * kdStdDevX0 / 2 + kdMeanX0; } if (kdRNum < 0.5) { koPt.VdY = koRand.NextDouble( ) * kdStdDevY0 / 2 + kdMeanY0; } else { koPt.VdY = -1 * koRand.NextDouble( ) * kdStdDevY0 / 2 + kdMeanY0; } kiIndex++; this.voPList.Add(koPt); } for (int i = 0; i < (kiDataLength / 4); i++) { koPt = new MyPoint( ); kdRNum = koRand.NextDouble( ); if (kdRNum < 0.5) { koPt.VdX = koRand.NextDouble( ) * kdStdDevX1 / 2 + kdMeanX1; } else { koPt.VdX = -1 * koRand.NextDouble( ) * kdStdDevX1 / 2 + kdMeanX1; } if (kdRNum < 0.5) { koPt.VdY = koRand.NextDouble( ) * kdStdDevY1 / 2 + kdMeanY1; } else { koPt.VdY = -1 * koRand.NextDouble( ) * kdStdDevY1 / 2 + kdMeanY1; } kiIndex++; this.voPList.Add(koPt); } for (int i = 0; i < (kiDataLength / 4); i++) { koPt = new MyPoint( ); kdRNum = koRand.NextDouble( ); if (kdRNum < 0.5) { koPt.VdX = koRand.NextDouble( ) * kdStdDevX2 / 2 + kdMeanX2; } else { koPt.VdX = -1 * koRand.NextDouble( ) * kdStdDevX2 / 2 + kdMeanX2; } if (kdRNum < 0.5) { koPt.VdY = koRand.NextDouble( ) * kdStdDevY2 / 2 + kdMeanY2; } else { koPt.VdY = -1 * koRand.NextDouble( ) * kdStdDevY2 / 2 + kdMeanY2; } kiIndex++; this.voPList.Add(koPt); } for (int i = 0; i < (kiDataLength / 4); i++) { koPt = new MyPoint( ); kdRNum = koRand.NextDouble( ); if (kdRNum < 0.5) { koPt.VdX = koRand.NextDouble( ) * kdStdDevX3 / 2 + kdMeanX3; } else { koPt.VdX = -1 * koRand.NextDouble( ) * kdStdDevX3 / 2 + kdMeanX3; } if (kdRNum < 0.5) { koPt.VdY = koRand.NextDouble( ) * kdStdDevY3 / 2 + kdMeanY3; } else { koPt.VdY = -1 * koRand.NextDouble( ) * kdStdDevY3 / 2 + kdMeanY3; } kiIndex++; this.voPList.Add(koPt); } MyImageProc.MDrawClusters(this.voPB, this.voPList, 1.0, 1); }