摘要
k均值算法是聚类方法中常用方法,有很多优点,但也存在不足之处,
它对球状、凸形分布的数据具有很好的聚类效果,但对样本的输入顺
序敏感,可能产生局部最优解,而且受孤立点影响比较大。本文针对
这些不足之处,主要从数据预处理。初始聚类中心的选择和迭代过程
聚类种子计算三方面进行改进,并做了改进前后算法的对比实验。结
果表明,改进后的算法比原k均值算法具有更高的准确性,受孤立点
的影响也大大降低。
(一)课题名称:K-均值聚类(K-means clustering)
(二)课题分析:
K-均值聚类(K-means clustering)是 Mac Queen 提出的一种非监
督实时聚类算法,在最小化误差函数的基础上将数据划分为预定的类
数 K。该算法原理简单并便于处理大量数据,在基因表达数据分析中
得到广泛应用,如 Tavazoie 等应用 K-means 聚类酵母细胞周期表达
数据。在 K-means 算法运行前必须先指定聚类数目 K 和迭代次数或收
敛条 件,并指定 K 个初始聚类中心,根据一定的相似性度量准则,
将每一条基因分配到最近或“相似”的聚类中心,形成类,然后以每
一类的平均矢量作为这一类的聚类 中心,重新分配,反复迭代直到
类收敛或达到最大的迭代次数。
K-means 聚类算法对初始聚类中心依赖性比较大,随机选取初始
聚类中心的缺点是如果使得初始聚类中心得到的分类严重偏离全局
最优分类,这样算法可能会 陷入局部最优值。而且当聚类数比较大
的时候,这种缺点更为明显,往往要经过多次聚类才有可能达到较满
意的结果。Yeung 等提出了采用均连接层次聚类结果 初始化 K-means
聚类中心。此方法有效地排除了随机初始化过程中引入的随机性因
素,使得算法成为确定性的,可以得到稳定的聚类结果;而且,这种
初始化 方式也能够利用数据中的类结构信息,使得聚类质量相对于
随机初始化时的平均质量有显著的提高。
(三)总体检索思路:
利用 goole,baidu 等搜索引擎及校内的一些数据库进行相关内容的
检索。主要检索内容为 K-均值聚类算法的步骤,应用,前景,代码。
(四)检索过程记录:
关键词:K-均值聚类算法
搜索引擎:百度
检索内容:①K-均值聚类算法原理
②K-均值聚类算法的应用
③K-均值聚类算法的前景
中文数据库检索:中国知网(http://www.cnki.net/),维普期刊网。
检索年限:2010-2011 年
学科范围:信息技术
检索词:K-均值聚类算法
检出文献总数:40
(五)检索结果分析:
1. K-均值聚类算法的应用:
K-均值聚类算法的应用十分广泛,遍布各个领域,其中一些应用如,
基因优化,彩色图像有意义区域的提取,多种群协同进化等。
2.K-means 聚类算法的一般步骤:
原k均值算法伪代码如下:
输入:聚类个数k,以及包含n个数据对象的数据样本集;
随机选取k个对象,初始化k个聚类中心;
设置迭代计数器t=O;
while(r≠o1
把样本点分到距离最近的聚类中心所代表的簇内;
计算聚类目标函数J(11;
r=J(t)-J(t-1);
重新计算各个聚类中心;
t=t+l
输出聚类中心。
3.K-均值聚类算法代码:
//***********引入库函数
#include "iostream.h"
#include "math.h"
#include "stdlib.h"
#include "iomanip.h"
#include "time.h"
#include "fstream.h"
//*************定义常量
const int TRUE=1;
const int FALSE=0;
const int MarkovLengh=10000;
const int MaxInnerLoop=10000;
const int MaxOuterLoop=60;
const double CO=0.1;
const double DeclineRate=0.95;
const long MAX=100000;
const int AcceptRate=1;
const double ForceDecline=0.9;
//************定义全局变量
int DataNum;
int Dimension;
int K;
double *DataSet;
int HALT=0;
int Row=3;
//***************************************************************
***
// 类 GETDATA: 设定全局变量,维数,样本数,和类别数等
//
***
//***************************************************************
class GETDATA{
public:
//聚类样本数目
//样本维数
//分类数
//指向浮点型的指针
随机生成样本或手工输入样本的类
GETDATA();
void Display();
void Initial();
void Input();
double FRand(double,double);
double rand1,rand2;
//随机数的高低值
};
GETDATA::GETDATA()
{
int i,j;
Dimension=2;
DataNum=50;
K=4;
DataSet=new double[Dimension*DataNum];
for(i=0;i
>Dimension;
cout<>DataNum;
cout<>K;
cout<>flag;
if(flag=='R'||flag=='r')
{
cout<<" 输入随机数生成范围(最小值和最大值):"
"<>DataSet[i*Dimension+j];
}
}
else
cout<>rand1;
cout<>rand2;
for(i=0;i{
}
char ch;
GETDATA::Display();
cout<>ch;
while(!(ch=='A'||ch=='a')&&!(ch=='B'||ch=='b'))
{
cout<>ch;
}
if(ch=='A'||ch=='a')
GETDATA::Input();
rand1+(double)(((double)rand()/(double)RAND_MAX)*(rand2-rand1));
K-均值算法的实现
功能:根据设定的 K,DataNum,Dimension 等聚类
}
//***********************************************************
// 类 SSA:
***
//
***
//***********************************************************
class SAA
{
public:
double GETDATA::FRand(double rand1,double rand2)
{
return
struct DataType
{
double *data;
int father;
double *uncle;
};
struct ClusterType
{
double *center;
int sonnum;
};
SAA();
void Initialize();
void KMeans();
void SA( );
void DisPlay();
void GetDataset(DataType *p1,double *p2,int datanum,int dim);
void GetValue(double *str1,double *str2,int dim);
int FindFather(double *p,int k);
double SquareDistance(double *str1,double *str2,int dim);
int Compare(double *p1,double *p2,int dim);
void NewCenterPlus(ClusterType *p1,int t,double *p2,int dim);
void NewCenterReduce(ClusterType *p1,int t,double *p2,int dim);
double MaxFunc();
void Generate(DataType *p1,ClusterType *c1);
double Compare(DataType *p1,ClusterType *c1,DataType *p2,ClusterType
void CopyStatus(DataType *p1,ClusterType *c1,DataType *p2,ClusterType
*c2);
*c2);
int SecondFather(DataType *p,int t,int k);
double AimFunction(DataType *q,ClusterType *c);
double FRand(double ,double);
void KMeans1();
protected:
double Temp;
//double CO;
//double DeclineRate;
//int MarkovLengh;
//int MaxInnerLoop;
//int MaxOuterLoop;
double AimFunc;
DataType *DataMember, *KResult,*CurrentStatus,*NewStatus;
ClusterType * ClusterMember,*NewCluster,*CurrentCluster;
}; //end of class SAA
//************建立构造函数,初始化保护成员
SAA::SAA()
{
int i;
// DeclineRate=(double)0.9;
// MarkovLengh=1000;
// MaxInnerLoop=200;
// MaxOuterLoop=10;
// CO=1;
DataMember=new DataType[DataNum];
ClusterMember=new ClusterType[K];
for(i=0;i