K-Means的简单模拟

#include<iostream>
using namespace std;
#define N 1000
int flag[N];
double data[N];
double center[N];
double center_temp[N];
bool result = false;
int n;
double dis(int x,int y)
{
	return (x-y)*(x-y);
}
void print_info()
{
	printf("DATA\n");
	for(int i=0;i<n;i++){
		printf("%.0lf\t ",data[i]);
	}
	printf("\n");
	printf("FLAG\n");
	for(int i=0;i<n;i++){
		printf("%d\t ",flag[i]);
	}
	printf("\n");
	
}
void print_result(int k)
{
	for(int i=0;i<k;i++){
		printf("第%d类成员:",i);
		for(int j=0;j<n;j++){
			if(i == flag[j]){
				printf("\t%.0lf",data[j]);
			}
		}
		printf("\n");
	}
}
int k_avg(int k)
{
	for(int i=0;i<k;i++){
		flag[i] = i;
		center[i] = data[i];
	}
	do{
		for(int i=0;i<n;i++){
			double min = 99999;
			int temp;
			for(int j=0;j<k;j++){
				double distance = dis(data[i],center[j]);
				if(distance < min){
					min = distance;
					temp = j;
				}	
			}
			flag[i] = temp;
		}
		for(int i=0;i<k;i++){
			double sum = 0;
			int count = 0;
			for(int j=0;j<n;j++){
				if(flag[j] == i){
					sum += data[j];
					count++;
				}
			}
			center_temp[i] = sum/count;
		}
		
		result = false;
		for(int i=0;i<k;i++){
			if(center_temp[i] - center[i] > 0.001){
				result = true;
				center[i] = center_temp[i];
			}
		}
		print_info();
	}while(result);
}
int main()
{

	cin>>n;
	for(int i=0;i<n;i++){
		cin>>data[i];
	}
	int k;
	cin>>k;
	k_avg(k);
	print_result(k);
	return 0;
}
/*
10
15 2 3 4 8 79 10 40 5 20
4

10 
0 1 2 3 4 5 6 7 8 9
4

5
40 24 60 80 79
3

5
40 24 20 10 79
3

*/

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读