📄 kclustering.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&¢er1.b==oldcenter1.b&¢er1.c==oldcenter1.c&&
center1.d==oldcenter1.d&¢er2.a==oldcenter2.a&¢er2.b==oldcenter2.b&&
center2.c==oldcenter2.c&¢er2.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 + -