K-Means聚类算法的实现(C语言)
最近做了聚类实验,就写了下K-Means算法,C语言实现.
实验给出的数据集比较小,总共有11个:(2, 10), (2, 5), (8, 4), (5, 8), (7, 5), (6, 4), (1, 2), (4, 9), (7, 3), (1, 3), (3, 9)
代码运行的聚类结果:
Cluster-1: (2, 10), (5, 8), (4, 9), (3, 9)
Cluster-2: (8, 4), (7, 5), (6, 4), (7, 3)
Cluster-3: (2, 5), (1, 2), (1, 3)
Clementine软件运行结果:
可以看出与软件运行结果相比代码是正确的.
Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>#define N 11
#define K 3typedef struct
{float x;float y;
}Point;int center[N]; /// 判断每个点属于哪个簇Point point[N] = {{2.0, 10.0},{2.0, 5.0},{8.0, 4.0},{5.0, 8.0},{7.0, 5.0},{6.0, 4.0},{1.0, 2.0},{4.0, 9.0},{7.0, 3.0},{1.0, 3.0},{3.0, 9.0}
};Point mean[K]; /// 保存每个簇的中心点float getDistance(Point point1, Point point2)
{float d;d = sqrt((point1.x - point2.x) * (point1.x - point2.x) + (point1.y - point2.y) * (point1.y - point2.y));return d;
}/// 计算每个簇的中心点
void getMean(int center[N])
{Point tep;int i, j, count = 0;for(i = 0; i < K; ++i){count = 0;tep.x = 0.0; /// 每算出一个簇的中心点值后清0tep.y = 0.0;for(j = 0; j < N; ++j){if(i == center[j]){count++;tep.x += point[j].x;tep.y += point[j].y;}}tep.x /= count;tep.y /= count;mean[i] = tep;}for(i = 0; i < K; ++i){printf("The new center point of %d is : \t( %f, %f )\n", i+1, mean[i].x, mean[i].y);}
}/// 计算平方误差函数
float getE()
{int i, j;float cnt = 0.0, sum = 0.0;for(i = 0; i < K; ++i){for(j = 0; j < N; ++j){if(i == center[j]){cnt = (point[j].x - mean[i].x) * (point[j].x - mean[i].x) + (point[j].y - mean[i].y) * (point[j].y - mean[i].y);sum += cnt;}}}return sum;
}/// 把N个点聚类
void cluster()
{int i, j, q;float min;float distance[N][K];for(i = 0; i < N; ++i){min = 999999.0;for(j = 0; j < K; ++j){distance[i][j] = getDistance(point[i], mean[j]);/// printf("%f\n", distance[i][j]); /// 可以用来测试对于每个点与3个中心点之间的距离}for(q = 0; q < K; ++q){if(distance[i][q] < min){min = distance[i][q];center[i] = q;}}printf("( %.0f, %.0f )\t in cluster-%d\n", point[i].x, point[i].y, center[i] + 1);}printf("-----------------------------\n");
}int main()
{int i, j, n = 0;float temp1;float temp2, t;printf("----------Data sets----------\n");for(i = 0; i < N; ++i){printf("\t( %.0f, %.0f )\n", point[i].x, point[i].y);}printf("-----------------------------\n");/*可以选择当前时间为随机数srand((unsigned int)time(NULL));for(i = 0; i < K; ++i){j = rand() % K;mean[i].x = point[j].x;mean[i].y = point[j].y;}
*/mean[0].x = point[0].x; /// 初始化k个中心点mean[0].y = point[0].y;mean[1].x = point[3].x;mean[1].y = point[3].y;mean[2].x = point[6].x;mean[2].y = point[6].y;cluster(); /// 第一次根据预设的k个点进行聚类temp1 = getE(); /// 第一次平方误差n++; /// n计算形成最终的簇用了多少次printf("The E1 is: %f\n\n", temp1);getMean(center);cluster();temp2 = getE(); /// 根据簇形成新的中心点,并计算出平方误差n++;printf("The E2 is: %f\n\n", temp2);while(fabs(temp2 - temp1) != 0) /// 比较两次平方误差 判断是否相等,不相等继续迭代{temp1 = temp2;getMean(center);cluster();temp2 = getE();n++;printf("The E%d is: %f\n", n, temp2);}printf("The total number of cluster is: %d\n\n", n); /// 统计出迭代次数system("pause");return 0;
}
K-Means聚类算法的实现(C语言)相关推荐
- 模糊C均值聚类算法的实现
模糊C均值聚类算法的实现 研究背景 聚类分析是多元统计分析的一种,也是无监督模式识别的一个重要分支,在模式分类 图像处理和模糊规则处理等众多领域中获得最广泛的应用.它把一个没有类别标记的样本按照 ...
- 查找算法的实现c语言,查找算法的实现(C语言版)
<查找算法的实现(C语言版)>由会员分享,可在线阅读,更多相关<查找算法的实现(C语言版)(6页珍藏版)>请在人人文库网上搜索. 1.芬梨受交峙东喊济雏狈违晕裂赵檀芬逛温乌摄阿 ...
- OpenCV的k - means聚类 -对图片进行颜色量化
OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...
- OpenCV官方文档 理解k - means聚类
理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...
- k means聚类算法_K-Means 聚类算法 20210108
说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...
- k均值聚类算法案例 r语言iris_K-means算法原理
聚类的基本思想 俗话说"物以类聚,人以群分" 聚类(Clustering)是一种无监督学习(unsupervised learning),简单地说就是把相似的对象归到同一簇中.簇内 ...
- k means聚类算法_一文读懂K-means聚类算法
1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...
- k均值聚类算法案例 r语言iris_聚类分析—系统聚类
聚类就是按照某个特定标准把一个数据集分割成不同的类或簇,最后的结果是希望同类之间的差异性尽可能小,不同类之间的差异性尽可能大.不同的类具有能够表达异于其他类的指标,这样针对不同的类,后续就能采取不一样 ...
- k近邻算法_机器学习之K近邻分类算法的实现
K近邻算法(k-nearest neighbors, KNN)是最基本的机器学习算法之一.所谓的K,就是距离最近的K个邻居的意思.其实,KNN在我们平常的生活中也会不自主的应用,比如,俗语说的&quo ...
最新文章
- JavaScript四(DOM编程)
- 如何用Vue实现简易的富文本编辑器,并支持Markdown语法
- Spring Bean初始化的几种常规方式
- Tensorflow——placeholder(矩阵运算小实例)
- 阿里P8架构师:淘宝技术架构从1.0到4.0的架构变迁!12页PPT详解
- 小米手环6NFc支持Android,小米手环6普通版和NFC版有什么区别-哪个好-哪款更值得入手...
- java udp多线程服务器_UDP服务端多线程-----
- 计算机上已安装某个第三方应用程序,防止电脑第三方软件“被”安装 3招彻底屏蔽不明软件...
- 【Codecs系列】颜色空间转换CSConvert:YUV422P转YUV422SP(NV16)
- 百度地图获取行政区划边界
- MOEA/D原理及pyton实现
- 软件测试度量的关键指标,软件测试度量指标简介
- 关于信号强度单位db和dBm
- ipynb文件转py文件
- iPython清屏命令
- 读书感想20221218
- 嵌入式系统概论-6-软件与内核
- 柴达木盆地第四大气区探实 尖北产量超亿方
- 用友系统服务器如何安装,用友数据库服务器安装步骤
- 用于《机械设计课程设计》中的减速箱设计的Python计算程序