⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kclustering.cpp

📁 k-聚类算法
💻 CPP
字号:
#include <iostream.h>
#include <vector>
#include "KClustering.h"

#define NODENUM 150

using namespace std;

Node data[NODENUM];

vector<Node *> Cluster1;
vector<Node *> Cluster2;



Node center1;
Node center2;
Node oldcenter1(center1);
Node oldcenter2(center2);
FILE * result;


int sort(int startindex,int endindex){

	Cluster1.clear();
	Cluster2.clear();

	float dist1,dist2;
	Node * newnode;
	float a1,a2,a3,a4;
	a1=0.0;
	a2=0.0;
	a3=0.0;
	a4=0.0;

	for(int count=startindex;count<endindex;count++){
	
		dist1 = data[count].getDistanceEstimate(center1);	
		dist2 = data[count].getDistanceEstimate(center2);
		
		newnode=new Node(data[count]);
		if(dist1<dist2){			
			Cluster1.push_back(newnode);
		}
		else{
			Cluster2.push_back(newnode);
		}

	}
	for( vector< Node * >::iterator cluster1 = Cluster1.begin(); cluster1 != Cluster1.end(); cluster1 ++ ){

		a1+=(* cluster1)->a;
		a2+=(* cluster1)->b;
		a3+=(* cluster1)->c;
		a4+=(* cluster1)->d;		
	}
	center1.a=a1/Cluster1.size();
	center1.b=a2/Cluster1.size();
	center1.c=a3/Cluster1.size();
	center1.d=a4/Cluster1.size();

	a1=0.0;
	a2=0.0;
	a3=0.0;
	a4=0.0;
	for( vector< Node * >::iterator cluster2 = Cluster2.begin(); cluster2 != Cluster2.end(); cluster2 ++ ){
		
		a1+=(* cluster2)->a;
		a2+=(* cluster2)->b;
		a3+=(* cluster2)->c;
		a4+=(* cluster2)->d;		
	}
	center2.a=a1/Cluster2.size();
	center2.b=a2/Cluster2.size();
	center2.c=a3/Cluster2.size();
	center2.d=a4/Cluster2.size();
	
	if(center1.a==oldcenter1.a&&center1.b==oldcenter1.b&&center1.c==oldcenter1.c&&
		center1.d==oldcenter1.d&&center2.a==oldcenter2.a&&center2.b==oldcenter2.b&&
		center2.c==oldcenter2.c&&center2.d==oldcenter2.d){
		return 1;
		}
	else{
		oldcenter1=center1;
		oldcenter2=center2;
		return 0;
	}


}
void readdata(){
	int index;

	FILE * datafile;
	datafile=fopen("Iris Data.txt","r");
	
	for(index=0;index<NODENUM;index++){
		fscanf(datafile,"%f",&data[index].a);
		fscanf(datafile,"%f",&data[index].b);
		fscanf(datafile,"%f",&data[index].c);
		fscanf(datafile,"%f",&data[index].d);
		data[index].id=index;
	}

	fclose(datafile);
}
void print_out(){
	fprintf(result,"数据总数:%d\n",Cluster1.size()+Cluster2.size());
	fprintf(result,"聚类1:\n");
	fprintf(result,"大小:%d\n",Cluster1.size());
	fprintf(result,"聚类中心:%f\t%f\t%f\t%f\n",center1.a,center1.b,center1.c,center1.d);
	
	
	
	for( vector< Node * >::iterator cluster1 = Cluster1.begin(); cluster1 != Cluster1.end(); cluster1 ++ ){
		fflush(result);
//		fprintf(result,"%f\t%f\t%f\t%f\n",(*cluster1)->a,(*cluster1)->b,(*cluster1)->c,(*cluster1)->d);
		fprintf(result,"%d\t",(*cluster1)->id+1);
		
	}
	fprintf(result,"\n");
	
	fprintf(result,"聚类2:\n");
	fprintf(result,"大小:%d\n",Cluster2.size());
	fprintf(result,"聚类中心:%f\t%f\t%f\t%f\n",center2.a,center2.b,center2.c,center2.d);
	
	
	for( vector< Node * >::iterator cluster2 = Cluster2.begin(); cluster2 != Cluster2.end(); cluster2 ++ ){
		fflush(result);
//		fprintf(result,"%f\t%f\t%f\t%f\n",(*cluster2)->a,(*cluster2)->b,(*cluster2)->c,(*cluster2)->d);
		fprintf(result,"%d\t",(*cluster2)->id+1);		
	}	
	fprintf(result,"\n");

}

void main(){

	readdata();

	result=fopen("result.txt","w");

	center1=data[0];
	center2=data[1];
	while(sort(0,150)!=1){
	}
	fprintf(result,"第一组数据\n");
	print_out();

	center1=data[0];
	center2=data[1];
	while(sort(0,50)!=1){		
	}
	fprintf(result,"第二组数据\n");
	print_out();

	center1=data[50];
	center2=data[51];
	while(sort(50,100)!=1){
	}
	fprintf(result,"第三组数据\n");
	print_out();

	center1=data[100];
	center2=data[101];
	while(sort(100,150)!=1){
	}
	fprintf(result,"第四组数据\n");
	print_out();

	fclose(result);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -