www.pudn.com > Jx_KClustering.rar > KCluster.cpp


#include "StdAfx.h" 
#include "KCluster.h" 
 
// 构造器 
KCluster::KCluster(int dataNum, int dimension, int clusterNum, double *DataSet)	: 
	OldCluster(NULL) 
{ 
	int i; 
 
	DataNum = dataNum; 
	Dimension = dimension; 
	ClusterNum = clusterNum; 
 
	DataMember = new DataType[DataNum]; 
	ClusterMember = new ClusterType[ClusterNum]; 
 
	for(i=0; i=ClusterNum) 
		{ 
			ClusterMember[ClusterIdxA].Sonnum += 1; 
			NewCenterPlus(ClusterMember, ClusterIdxA, DataMember[i].Data, Dimension); 
			GetValue(OldCluster[ClusterIdxA].Center, ClusterMember[ClusterIdxA].Center, Dimension); 
		} 
		 
	} 
 
	ClusteringCompleted = false; 
} 
 
// 一个聚类步 
bool KCluster::SetupClustering() 
{ 
	int i, j, Ret = 0; 
	int Father; 
 
	if (ClusteringCompleted) return true; 
 
	//一次聚类循环:1.重新归类;2.修改类中心 
	for(i=0; i1) 
		{ 
			ClusterIdxA = DataMember[i].Father; 
			ClusterMember[ClusterIdxA].Sonnum -= 1; 
 
			ClusterIdxB = DataMember[i].Father = FindFather(DataMember[i].Uncle, ClusterNum); 
			ClusterMember[ClusterIdxB].Sonnum += 1; 
 
			NewCenterReduce(ClusterMember, ClusterIdxA, DataMember[i].Data, Dimension); 
			NewCenterPlus(ClusterMember, ClusterIdxB, DataMember[i].Data, Dimension); 
				 
		}					 
 
	}  
 
	//判断聚类是否完成,ClusteringCompleted=true,聚类停止 
	for(j=0; jClusterNum) return -1; 
 
	for(i=0; i