用C#实现k均值聚类算法

k均值算法是模式识别的聚分类问题,这是用C#实现其算法

以下是程序源代码:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

namespace KMean_win

{

///

/// Form1 的摘要说明。

///

public class Form1 : System.Windows.Forms.Form

{

///

/// 必需的设计器变量。

///

private System.ComponentModel.Container components = null;

private static int k = 2;                          //类数,此例题为2类

private static int total = 20;                      //点个数

private int test = 0;

private PointF[] unknown = new PointF[total];  //点数组

private int[] type = new int[total];           //每个点暂时的类

public PointF[] z = new PointF[k];                 //保存新的聚类中心

public PointF[] z0 = new PointF[k];                //保存上一次的聚类中心

private PointF sum;

private int temp = 0;

private System.Windows.Forms.TextBox textBox1;

private int l = 0;          //迭代次数

//构造函数,初始化

public Form1()

{

unknown[0]=new Point(0,0);

unknown[1]=new Point(1,0);

unknown[2]=new Point(0,1);

unknown[3]=new Point(1,1);

unknown[4]=new Point(2,1);

unknown[5]=new Point(1,2);

unknown[6]=new Point(2,2);

unknown[7]=new Point(3,2);

unknown[8]=new Point(6,6);

unknown[9]=new Point(7,6);

unknown[10]=new Point(8,6);

unknown[11]=new Point(6,7);

unknown[12]=new Point(7,7);

unknown[13]=new Point(8,7);

unknown[14]=new Point(9,7);

unknown[15]=new Point(7,8);

unknown[16]=new Point(8,8);

unknown[17]=new Point(9,8);

unknown[18]=new Point(8,9);

unknown[19]=new Point(9,9);

InitializeComponent();

test = 0;

//选k个初始聚类中心    z[i]

for(int i=0;i

z[i] = unknown[i];

for(int i=0;i

type[i] = 0;

}

//计算新的聚类中心

public PointF newCenter(int m)

{

int N = 0;

for(int i=0;i

{

if(type[i] == m)

{

sum.X = unknown[i].X+sum.X;

sum.Y = unknown[i].Y+sum.Y;

N += 1;

}

}

sum.X=sum.X/N;

sum.Y=sum.Y/N;

return sum;

}

//比较两个聚类中心的是否相等

private bool compare(PointF a,PointF b)

{

if(((int)(a.X*10) == (int)(b.X*10)) && ((int)(a.X*10) == (int)(b.X*10)))

return true;

else

return false;

}

//进行迭代,对total个样本根据聚类中心进行分类

private void order()

{

int temp = 0;//记录unknown[i]暂时在哪个类中

for(int i=0;i

{

for(int j=0;j

{

if(distance(unknown[i],z[temp]) > distance(unknown[i],z[j]))

temp = j;

}

type[i] = temp;

Console.WriteLine("经比较后,{0}归为{1}类",unknown[i],temp);

}

}

//计算两个点的欧式距离

private float distance(PointF p1,PointF p2)

{

return((p1.X-p2.X)*(p1.X-p2.X)+ (p1.Y-p2.Y)*(p1.Y-p2.Y));

}

///

/// 清理所有正在使用的资源。

///

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

//程序结构

public void main()

{

Console.WriteLine("共有如下个未知样本:");

for(int i=0;i

{

Console.WriteLine(unknown[i]);

}

/*            for(int i=0;i

Console.WriteLine("初始时,第{0}类中心{1}",i,z[i]);

order();

for(int i=0;i

{

z[i] = newCenter(i);

Console.WriteLine("第{0}类新中心{1}",i,z[i]);

if(z[i].Equals(z0[i]) )

test = test+1;

else

z0[i] = z[i];

}

*/            for(int i=0;i

Console.WriteLine("初始时,第{0}类中心{1}",i,z[i]);

while( test!=k )

{

order();

for(int i=0;i

{

z[i] = newCenter(i);

Console.WriteLine("第{0}类新中心{1}",i,z[i]);

if(compare(z[i],z0[i]))

test = test+1;

else

z0[i] = z[i];

}

l = l+1;

Console.WriteLine("******已完成第{0}次迭代*******",l);

Console.Write("{0}","分类后:");

for(int j=0;j

{

Console.Write("第{0}类有:",j);

for(int i=0;i

{

if(type[i] == j)

Console.WriteLine("{0},{1}",unknown[i].X,unknown[i].Y);

}

}

}

}

#region Windows 窗体设计器生成的代码

///

/// 设计器支持所需的方法 - 不要使用代码编辑器修改

/// 此方法的内容。

///

private void InitializeComponent()

{

this.textBox1 = new System.Windows.Forms.TextBox();

this.SuspendLayout();

//

// textBox1

//

this.textBox1.Location = new System.Drawing.Point(0, 0);

this.textBox1.Multiline = true;

this.textBox1.Name = "textBox1";

this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;

this.textBox1.Size = new System.Drawing.Size(296, 272);

this.textBox1.TabIndex = 0;

this.textBox1.Text = "";

//

// Form1

//

this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

this.ClientSize = new System.Drawing.Size(292, 271);

this.Controls.Add(this.textBox1);

this.Name = "Form1";

this.Text = "Form1";

this.ResumeLayout(false);

}

#endregion

}

class entrance

{        ///

/// 应用程序的主入口点。

///

[STAThread]

static void Main()

{

Form1 my = new Form1();

my.main();

Application.Run(new Form1());

}

}

}

k均值算法是模式识别的聚分类问题,这是用C#实现其算法

以下是程序源代码:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

namespace KMean_win

{

///

/// Form1 的摘要说明。

///

public class Form1 : System.Windows.Forms.Form

{

///

/// 必需的设计器变量。

///

private System.ComponentModel.Container components = null;

private static int k = 2;                          //类数,此例题为2类

private static int total = 20;                      //点个数

private int test = 0;

private PointF[] unknown = new PointF[total];  //点数组

private int[] type = new int[total];           //每个点暂时的类

public PointF[] z = new PointF[k];                 //保存新的聚类中心

public PointF[] z0 = new PointF[k];                //保存上一次的聚类中心

private PointF sum;

private int temp = 0;

private System.Windows.Forms.TextBox textBox1;

private int l = 0;          //迭代次数

//构造函数,初始化

public Form1()

{

unknown[0]=new Point(0,0);

unknown[1]=new Point(1,0);

unknown[2]=new Point(0,1);

unknown[3]=new Point(1,1);

unknown[4]=new Point(2,1);

unknown[5]=new Point(1,2);

unknown[6]=new Point(2,2);

unknown[7]=new Point(3,2);

unknown[8]=new Point(6,6);

unknown[9]=new Point(7,6);

unknown[10]=new Point(8,6);

unknown[11]=new Point(6,7);

unknown[12]=new Point(7,7);

unknown[13]=new Point(8,7);

unknown[14]=new Point(9,7);

unknown[15]=new Point(7,8);

unknown[16]=new Point(8,8);

unknown[17]=new Point(9,8);

unknown[18]=new Point(8,9);

unknown[19]=new Point(9,9);

InitializeComponent();

test = 0;

//选k个初始聚类中心    z[i]

for(int i=0;i

z[i] = unknown[i];

for(int i=0;i

type[i] = 0;

}

//计算新的聚类中心

public PointF newCenter(int m)

{

int N = 0;

for(int i=0;i

{

if(type[i] == m)

{

sum.X = unknown[i].X+sum.X;

sum.Y = unknown[i].Y+sum.Y;

N += 1;

}

}

sum.X=sum.X/N;

sum.Y=sum.Y/N;

return sum;

}

//比较两个聚类中心的是否相等

private bool compare(PointF a,PointF b)

{

if(((int)(a.X*10) == (int)(b.X*10)) && ((int)(a.X*10) == (int)(b.X*10)))

return true;

else

return false;

}

//进行迭代,对total个样本根据聚类中心进行分类

private void order()

{

int temp = 0;//记录unknown[i]暂时在哪个类中

for(int i=0;i

{

for(int j=0;j

{

if(distance(unknown[i],z[temp]) > distance(unknown[i],z[j]))

temp = j;

}

type[i] = temp;

Console.WriteLine("经比较后,{0}归为{1}类",unknown[i],temp);

}

}

//计算两个点的欧式距离

private float distance(PointF p1,PointF p2)

{

return((p1.X-p2.X)*(p1.X-p2.X)+ (p1.Y-p2.Y)*(p1.Y-p2.Y));

}

///

/// 清理所有正在使用的资源。

///

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

//程序结构

public void main()

{

Console.WriteLine("共有如下个未知样本:");

for(int i=0;i

{

Console.WriteLine(unknown[i]);

}

/*            for(int i=0;i

Console.WriteLine("初始时,第{0}类中心{1}",i,z[i]);

order();

for(int i=0;i

{

z[i] = newCenter(i);

Console.WriteLine("第{0}类新中心{1}",i,z[i]);

if(z[i].Equals(z0[i]) )

test = test+1;

else

z0[i] = z[i];

}

*/            for(int i=0;i

Console.WriteLine("初始时,第{0}类中心{1}",i,z[i]);

while( test!=k )

{

order();

for(int i=0;i

{

z[i] = newCenter(i);

Console.WriteLine("第{0}类新中心{1}",i,z[i]);

if(compare(z[i],z0[i]))

test = test+1;

else

z0[i] = z[i];

}

l = l+1;

Console.WriteLine("******已完成第{0}次迭代*******",l);

Console.Write("{0}","分类后:");

for(int j=0;j

{

Console.Write("第{0}类有:",j);

for(int i=0;i

{

if(type[i] == j)

Console.WriteLine("{0},{1}",unknown[i].X,unknown[i].Y);

}

}

}

}

#region Windows 窗体设计器生成的代码

///

/// 设计器支持所需的方法 - 不要使用代码编辑器修改

/// 此方法的内容。

///

private void InitializeComponent()

{

this.textBox1 = new System.Windows.Forms.TextBox();

this.SuspendLayout();

//

// textBox1

//

this.textBox1.Location = new System.Drawing.Point(0, 0);

this.textBox1.Multiline = true;

this.textBox1.Name = "textBox1";

this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;

this.textBox1.Size = new System.Drawing.Size(296, 272);

this.textBox1.TabIndex = 0;

this.textBox1.Text = "";

//

// Form1

//

this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

this.ClientSize = new System.Drawing.Size(292, 271);

this.Controls.Add(this.textBox1);

this.Name = "Form1";

this.Text = "Form1";

this.ResumeLayout(false);

}

#endregion

}

class entrance

{        ///

/// 应用程序的主入口点。

///

[STAThread]

static void Main()

{

Form1 my = new Form1();

my.main();

Application.Run(new Form1());

}

}

}


相关内容

  • 处理机调度算法(C#实现)
  • using System; using System.Collections.Generic; using System.Text; namespace OS_1 { class PCB { public PCB() //构造函数,初始化为0 { time = 0; priority = 0; } ...

  • 各种编程语言的特点
  • 各种编程语言的特点.txt Pascal语言: Pascal是一种计算机通用的高级程序设计语言,由瑞士Niklaus Wirth教授六十年代末设计并创立的. Pascal的主要特点有:严格的结构化形式.丰富完备的数据类型.运行效率高.查错能力强等特点. 由于上述特点,Pascal可以方便用于描述各种 ...

  • 7程序和算法简介
  • 1.程序和程序设计语言(概念.结构) 现预期目的而进行操作的一系列语句和指令. 程序一个程序应该包括以下两方面的内容. 1 2实际上,一个程序除了以上两个主要的要素外,还应当采用程序设计方法进行设计,并 是一个程序员所应具备的知识.程序的结构有以下三种: 语句和B 语句是依次执行的,只有在执行完 A ...

  • 四舍五入C#算法
  • /// /// 实现数据的四舍五入法 /// /// 要进行处理的数据 /// 保留的小数位数 /// 四舍五入后的结果 private double Round(double v, int x) { bool isNegative = false; //如果是负数 if (v { isNegati ...

  • C#核心知识
  • C# 的总复习 前言: 编程语言的进化 1.计算机语言: 用的是指令直接来对电脑进行操作,速度最快,不过只是识别10100的语言,不容易被大多数人掌握. 2.汇编语言: 用汇编语言可以更简单地编写计算机语言.主要是借助一些 易于记住的命令编写的.简洁,但是不容易学,运行时间短.一般大多数厉害的 黑客 ...

  • (C#算法实现+源代码)美国大选很多情况会出现269比269
  • [**************] 唐 果 计算机软件与理论 美国大选50州1区(共51个)两派选票数可打平 ---------269:269 会有很多种可能 各州的选票分布(总共538票): (4) ---->缅因州 (7) ---->俄勒冈州 (10) ---->马里兰州 (21 ...

  • 降雨量预测模型研究与应用
  • 本科毕业论文(设计) 题目: 降雨量预测模型的应用与研究 姓 名: 学号: 院(系): 专业: 地理信息系统 指导教师: 职称: 教授 评 阅 人: 职称: 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果.除了文中特别加以标注引用的内容外,本论文不包含 ...

  • 最大熵-3
  • 第24卷第5期2010年10月 江苏科技大学学报(自然科学版) Vol.24No.5基于信息熵的图像阈值选取算法 葛启承,林锦国,肖 迪 (南京工业大学自动化与电气工程学院,江苏南京211816) 摘 要:阈值法是图像分割的一种重要方法,在图像处理与目标识别中广为应用.信息熵可以表征图像的灰度信息, ...

  • 测量程序设计实习报告
  • 测量程序设计实习报告 姓名: 班级: 学号: 教师评语: 日期:二零一四年十二月 实验名称:使用C#开发环境建立测量程序框架 一.实验的目的与任务: (1) 学会用C#窗体程序开发环境建立应用程序框架方法 (2) 学会使用常见的Windows 控件 (3) 根据自身需要设计一个测量程序界面 二.实验 ...