数据挖掘 实验五、k-均值聚类算法
一、 实验目的:
(1) 熟悉 VC++编程工具和 k-均值聚类算法。
(2) 在训练样本集上用 VC++编程工具编写用于 k-均值聚类的程序,对任务 相关数据运行 k-均值聚类算法,调试实验。
(3) 掌握距离计算方法和聚类的评价准则。
(4) 写出实验报告。
二、 实验原理:
1、k-均值聚类
k-均值聚类是一种基于形心的划分技术,具体迭代的计算步骤如下:
- 在属性向量空间随机产生 k 个形心坐标。
- 分别计算数据集 D 中的每个数据对象 Ti (1≤i≤n)到所有 k 个形心的距离度量 Dist(i,j) (1≤i≤n, 1≤j≤k),并将数据对象 Ti 聚到最小距离度量的那一簇中。即 Ti∈CJ,表示数据对象 Ti 被聚到第 J 簇中。其中 J=argmin(Dist(i,j)),表示 J 为可使得 Dist(i,j)取最小值的那个 j。
- 按照形心的定义计算每一簇的形心坐标,形成下一代的 k 个形心坐标。
- 如果不满足终结条件,转到 2)继续迭代;否则结束。
其中,簇的形心可以有不同的的定义,例如可以是簇内数据对象属性向量的均值(也就是重心),也可以是中心点等;距离度量也可以有不同的定义,常用的有欧氏距离、曼哈顿(或城市块、街区)距离、闵可夫斯基距离等;终结条件可采用当对象的重新分配不再发生时,程序迭代结束。
2、终止条件
终止条件可以是以下任何一个:
1)没有(或最小数目)对象被重新分配给不同的聚类。
2)没有(或最小数目)聚类中心再发生变化。
3)误差平方和局部最小。
三、 实验内容:
- 实验内容
- 根据 k-均值聚类算法的计算步骤,画出 k=3 时的程序流程图;
- 由 k-均值程序流程图编程实现 k-均值聚类算法;
- 在实验报告中显示 k-均值聚类过程的一系列截图,指明各个簇的逐渐演化过程;
- 在报告中指出实验代码中的初始质心的选择,终止条件的选择,以及距离度量的选择并予以说明。
- 实验步骤
编程实现如下功能:
- 首先将数据集 D={D1,D2,D3}中的属性向量作为实验数据输入;
- 由 k-均值程序流程图编程实现 k-均值聚类算法,并用实验数据运行;
- 运行过程中在适当的迭代代数暂停并显示实时迭代的结果,如簇心的位置、按距离最近邻聚类的结果等;
- 程序框图
- 关键代码
#include<iostream>
#include<string>
#include<fstream>
#include<algorithm>
#include <math.h>
using namespace std;
#define k 3 //聚类数
#define n 2 //数据维数
#define size 30 //数据大小
typedef struct {
//定义存储结构
double d[n];
double distance[k];
}Data;
typedef struct {
Data center[k]; // 即簇类中心
int cluster[k][size]; //簇数组
int cluster_num[k];// 簇类中一组数据的编号
Data old_center[k];
int isend[k][n]; //各簇类中心是否相等标示值
int is;
}Tdata;
Data data[size];
Tdata td;
void Init() //创建与读取数据
{
char name1[50]="data.txt";
ifstream infile;
cout<<"要打开的文件为:data.txt"<<endl;
infile.open(name1,ios::in);
if(infile.fail())
{
cout << "error open!" << endl;
exit(1)