コード例 #1
0
        private void btnProcessData_Click(object sender, EventArgs e)
        {
            IDistance eucledeanDistance = new EuclideanDistance();

            BackgroundWorker backgroundWorker = new BackgroundWorker();

            backgroundWorker.WorkerReportsProgress = true;
            backgroundWorker.DoWork += (o, eventArgs) =>
            {
                for (int k = (int)start.Value; k <= (int)end.Value; k++)
                {
                    List <double[]> distanceResult = new List <double[]>();

                    _kMeans = new KMeans(k, eucledeanDistance);
                    Centroid[] centroids = _kMeans.Run(_trainingSet.ToArray());

                    double result = 0;
                    foreach (double[] point in _trainingSet)
                    {
                        double minValue = Double.MaxValue;
                        foreach (Centroid centroid in centroids)
                        {
                            double distance = eucledeanDistance.Run(point, centroid.Array);
                            if (distance < minValue)
                            {
                                minValue = distance;
                            }
                        }
                        result += minValue;
                    }
                    result /= _trainingSet.Count;
                    _kmeansPointList.Add(new DPoint(k, result));

                    double progressPercent = (100 * k) / (int)end.Value;
                    ((BackgroundWorker)o).ReportProgress((int)progressPercent, new UserState {
                        Distortion = result, Index = k
                    });
                }
            };
            backgroundWorker.ProgressChanged += (o, eventArgsProgressChanged) =>
            {
                chart1.DataBind();
                progressBar1.Value = eventArgsProgressChanged.ProgressPercentage;
                UserState temp = eventArgsProgressChanged.UserState as UserState;
                listBox1.Items.Add(String.Format("K={0}, Dist: {1}", temp.Index, Math.Round(temp.Distortion, 2)));
            };
            backgroundWorker.RunWorkerAsync();
        }