⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 K-Means C++实现 带演示程序 K-Means C++实现 带演示程序
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SimpleKMeans
{
    public partial class Form1 : Form
    {
        private DataTable dataSet = new DataTable();
        private double max_x = 0;
        private double min_x = 0;
        private double max_y = 0;
        private double min_y = 0;
        private bool isDraw = false;
        private bool isKMeans = false;
        private int K = 5;
        Color[] colors = new Color[] { Color.Red, Color.Green, Color.BlueViolet, Color.Goldenrod, Color.HotPink };
        int[] clusters;
        int[] sizes;
        int[] means;
        double[] finalMeans;

        public Form1()
        {
            InitializeComponent();
            this.dataSet = DataUtilities.GetDataTable();

            max_x = DataUtilities.FindMaxValue(this.dataSet, "store_cost");
            min_x = DataUtilities.FindMinValue(this.dataSet, "store_cost");

            max_y = DataUtilities.FindMaxValue(this.dataSet, "store_sales");
            min_y = DataUtilities.FindMinValue(this.dataSet, "store_sales");
        }
        
        private void pnlContainer_Paint(object sender, PaintEventArgs e)
        {
            DrawingUtilities.DrawRulers(this.pnlContainer);
            if (isKMeans)
            {
                DrawKMeansDots();
            }
            else if (isDraw)
            {
                DrawDots();
            }
        }        

        private void DrawKMeansDots()
        {
            int count = 0;
            for (int i = 0; i < K; i++)
            {
                for (int j = 0; j < sizes[i]; j++)
                {
                    DataRow row = this.dataSet.Rows[clusters[count++]];
                    double tmp_x = Convert.ToDouble(row["store_cost"]);
                    double tmp_y = Convert.ToDouble(row["store_sales"]);

                    DrawingUtilities.DrawDot(this.pnlContainer,
                        Convert.ToInt32(((tmp_x - min_x) / (max_x - min_x)) * (this.pnlContainer.Width - 10)),
                        //Convert.ToInt32((max_x - min_x) / (600 - 10) * tmp_x),
                        Convert.ToInt32(((tmp_y - min_y) / (max_y - min_y)) * (this.pnlContainer.Height - 23)),
                        //Convert.ToInt32((max_y - min_y) / (600 - 23) * tmp_y),
                        colors[i]);
                }
            }

            for (int i = 0; i < K; i++)
            {
                int tmp_x = Convert.ToInt32(finalMeans[i]);
                int tmp_y = Convert.ToInt32(finalMeans[i + K]);
                DrawingUtilities.DrawCross(this.pnlContainer,
                    Convert.ToInt32(((tmp_x - min_x) / (max_x - min_x)) * (this.pnlContainer.Width - 10)),
                    //Convert.ToInt32((max_x - min_x) / (600 - 10) * tmp_x),
                    Convert.ToInt32(((tmp_y - min_y) / (max_y - min_y)) * (this.pnlContainer.Height - 23)),
                    //Convert.ToInt32((max_y - min_y) / (600 - 23) * tmp_y),
                    colors[i]);
            }

            this.isKMeans = true;
        }

        private void DrawDots()
        {
            foreach (DataRow item in this.dataSet.Rows)
            {
                double tmp_x = Convert.ToDouble(item["store_cost"]);
                double tmp_y = Convert.ToDouble(item["store_sales"]);

                DrawingUtilities.DrawDot(this.pnlContainer,
                    Convert.ToInt32(((tmp_x - min_x) / (max_x - min_x)) * (this.pnlContainer.Width - 9)),
                    Convert.ToInt32(((tmp_y - min_y) / (max_y - min_y)) * (this.pnlContainer.Height - 9)),
                    Color.White);
            }

            this.isDraw = true;
        }

        private void miDrawRawDots_Click(object sender, EventArgs e)
        {
            DrawDots();
        }

        private void miSetting_Click(object sender, EventArgs e)
        {

        }

        private void miRun_Click(object sender, EventArgs e)
        {
            clusters = new int[this.dataSet.Rows.Count];
            sizes = new int[K];
            finalMeans = new double[2 * K];
            means = KMeansUtilities.GetRandomMeans(K, this.dataSet.Rows.Count);

            KMeansUtilities.DataMining_KMeans(
                KMeansUtilities.LoadData(this.dataSet, "store_cost", "store_sales"),
                this.dataSet.Rows.Count,
                K, means, 0.01, -1, 
                clusters, sizes,  finalMeans,
                this.dataSet.Rows.Count * 2,2*K);

            DrawKMeansDots();
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -