程序非常简单,作为当初我的第一个MFC程序,有纪念意义。程序最终界面:
一、问题:在MFC对话框界面输入任意类别和任意数目的样本进行C分类,并进行显示。
二、c均值聚类算法
1、c—平均算法
对一批没有标明类别及类数的模式样本集,根据模式间的相似程度,按照物以类聚、人以群分的思想,将相似的模式分为一类,不相似的分为另一类。c均值聚类算法根据欧式距离把最短距离的样本分为1类。
动态聚类框图
① 先选定某种距离作为样本间的相似性的度量;
② 确定评价聚类结果的准则函数;
③ 给出某种初始分类,用迭代法找出使准则函数取极值的最好的聚类结果。
2、算法步骤
① 根据输入的分类数和样本总数,生成坐标范围内的随机数
② 初始聚类中心
③ 根据欧式距离进行一次分类
④ 根据新分成的两建立新的聚类中心
⑤ 新旧聚类中心不等则转回③,相等结束计算
⑥ 绘图显示结果
三、动态存储点坐标的数据结构
由于要求输入任意类别和任意数目样本,所以存放数据不能放在一般的数组(因为必须进行初始化,不然编译不过)。而每个样本数据有几个特征,所以它实际是一个第一维未知、第二维已知(如这里的x,y坐标)的动态数组。有几种方法:
① 用new[]定义一个一维动态数组指针(结构体对象指针),在程序运行时按界面输入样本多少分配内存。第二维的样本特征可以用个结构体,如:
struct mypoint
{
int x;
int y;
int myclass;//类别
};
mypoint* ptr=new mypoint[num];
②用自带的cpoint类自己定义一个坐标对象,用new[]定义一个相应对象的一维数组指针
③容器。我另一个程序的一部分