博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
K-means算法
阅读量:5302 次
发布时间:2019-06-14

本文共 2466 字,大约阅读时间需要 8 分钟。

K-means算法

#include
#include
#include
#include
using namespace std;#define K 4 /*数据维度*/#define C 8 /*聚类数*/#define N 150 /*样本数*/#define IterMax 5/*最大迭代数*/#define IterTherhold 0.0000001 /*结束条件*//*样本数据*/typedef struct{ double p[K]; int Lable; double dis[K];}Data;Data dat[N];double cluster[C][K] = {0.0};double oldfitness = 0.0;double fitness = 0.0;bool is_equal(int rand_num[], int n, int index) { for(int i = 0; i < n; i++) { if(rand_num[i] == index) { return true; } } return false;}void input_data(){ ifstream in("test.data", ios::in); int i = 0; while(i < N) { for(int k = 0; k < K; k++){ in >> dat[i].p[k]; } i++; }}//初始化质心void Init_center(){ int rand_num[C] ={0} ; int i = 0; while(i < C) { int index = rand()%N; if(!is_equal(rand_num, i, index)) { rand_num[i++] = index; } } for(int i = 0; i < K ; i++) { for(int j = 0; j < C; j++) { cluster[j][i] = dat[rand_num[j]].p[i]; } }}double Eulid_dis(int x, int y) { double distance = 0.0; for(int i = 0 ; i < K ; i++) { distance += pow(dat[x].p[i] - cluster[y][i], 2); } distance = sqrt(distance); return distance;}void Make_new_cluster(){ double bias = 0.0; for(int i = 0; i < N; i++) { double mindis = dat[i].dis[0]; dat[i].Lable = 0; for(int j = 1; j < C; j++) { if(mindis > dat[i].dis[j]) { mindis = dat[i].dis[j]; dat[i].Lable = j; } } } for(int i = 0; i < N; i++) { bias += dat[i].dis[dat[i].Lable]; } oldfitness = fitness; fitness = bias;}void calculate_distance() { for(int i = 0; i < N; i++) { for(int j = 0; j < C; j++) { dat[i].dis[j] = Eulid_dis(i, j); } }}void Make_new_center(){ for(int i = 0; i < C; i++) { for(int k = 0; k < K; k++) { double tmp = 0.0; int total = 0; for(int j = 0; j < N; j++) { if(dat[j].Lable == i) { tmp += dat[j].p[k]; total++; } } if(total > 0) { cluster[i][k] = tmp/total; } } }}/************************************* 主函数 *************************************/int main(){ input_data(); Init_center(); int i = 0; double differ = 1.0; while(i < IterMax && differ > IterTherhold) { calculate_distance(); Make_new_cluster(); Make_new_center(); differ = abs(oldfitness - fitness); cout << fitness << endl; i++; } for (int i = 0; i < C; ++i) { for(int j = 0; j < K ; j++) { cout << cluster[i][j] << "\t"; } cout << endl; } return 0;}

  

转载于:https://www.cnblogs.com/LyningCoder/p/4301087.html

你可能感兴趣的文章
物联网入门:[一] 协议分析
查看>>
Bootstrap-排版
查看>>
触发器
查看>>
POJ 2888 Magic Bracelet [Polya 矩阵乘法]
查看>>
BZOJ 1982: [Spoj 2021]Moving Pebbles [博弈论 对称]
查看>>
BZOJ 3994: [SDOI2015]约数个数和 [莫比乌斯反演 转化]
查看>>
【转】Asp.net程序中用NPOI生成标准Excel报表,导入导出一应俱全
查看>>
VUE基本指令(v-model,v-html,v-text,v-bind,v-if,v-show,v-for,v-on:click,组件,过滤器)
查看>>
sturts2-lesson2 自定义类型转换器
查看>>
下载了一个S3 关于使用笔记
查看>>
简介 jCanvas:当 jQuery遇上HTML5 Canvas
查看>>
Java实现链栈
查看>>
[bzoj3208]花神的秒题计划I
查看>>
(转)NS2无线网络遗失模型
查看>>
实现并发join的方法
查看>>
ubuntu 设置管理 集锦
查看>>
Monkey Android app稳定性测试工具之Monkey使用教程
查看>>
枚举类使用
查看>>
T4模板技术相关 from artech
查看>>
jqGrid学习笔记
查看>>