📄 form1.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 + -