K均值聚类算法

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

以下是程序源代码:

using System;

using System.Drawing;

using System.Collections;

using ponentModel;

using System.Windows.Forms;

using System.Data;

namespace KMean_win

{

///

/// Form1 的摘要说明。

///

public class Form1 : System.Windows.Forms.Form

{

///

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

///

private ponentModel.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]);

相关文档
最新文档