K均值聚类算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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]);