最近做了聚类实验,就写了下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语言)相关推荐

  1. 模糊C均值聚类算法的实现

     模糊C均值聚类算法的实现 研究背景 聚类分析是多元统计分析的一种,也是无监督模式识别的一个重要分支,在模式分类 图像处理和模糊规则处理等众多领域中获得最广泛的应用.它把一个没有类别标记的样本按照 ...

  2. 查找算法的实现c语言,查找算法的实现(C语言版)

    <查找算法的实现(C语言版)>由会员分享,可在线阅读,更多相关<查找算法的实现(C语言版)(6页珍藏版)>请在人人文库网上搜索. 1.芬梨受交峙东喊济雏狈违晕裂赵檀芬逛温乌摄阿 ...

  3. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  4. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  5. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  6. k均值聚类算法案例 r语言iris_K-means算法原理

    聚类的基本思想 俗话说"物以类聚,人以群分" 聚类(Clustering)是一种无监督学习(unsupervised learning),简单地说就是把相似的对象归到同一簇中.簇内 ...

  7. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  8. k均值聚类算法案例 r语言iris_聚类分析—系统聚类

    聚类就是按照某个特定标准把一个数据集分割成不同的类或簇,最后的结果是希望同类之间的差异性尽可能小,不同类之间的差异性尽可能大.不同的类具有能够表达异于其他类的指标,这样针对不同的类,后续就能采取不一样 ...

  9. k近邻算法_机器学习之K近邻分类算法的实现

    K近邻算法(k-nearest neighbors, KNN)是最基本的机器学习算法之一.所谓的K,就是距离最近的K个邻居的意思.其实,KNN在我们平常的生活中也会不自主的应用,比如,俗语说的&quo ...

最新文章

  1. JavaScript四(DOM编程)
  2. 如何用Vue实现简易的富文本编辑器,并支持Markdown语法
  3. Spring Bean初始化的几种常规方式
  4. Tensorflow——placeholder(矩阵运算小实例)
  5. 阿里P8架构师:淘宝技术架构从1.0到4.0的架构变迁!12页PPT详解
  6. 小米手环6NFc支持Android,小米手环6普通版和NFC版有什么区别-哪个好-哪款更值得入手...
  7. java udp多线程服务器_UDP服务端多线程-----
  8. 计算机上已安装某个第三方应用程序,防止电脑第三方软件“被”安装 3招彻底屏蔽不明软件...
  9. 【Codecs系列】颜色空间转换CSConvert:YUV422P转YUV422SP(NV16)
  10. 百度地图获取行政区划边界
  11. MOEA/D原理及pyton实现
  12. 软件测试度量的关键指标,软件测试度量指标简介
  13. 关于信号强度单位db和dBm
  14. ipynb文件转py文件
  15. iPython清屏命令
  16. 读书感想20221218
  17. 嵌入式系统概论-6-软件与内核
  18. 柴达木盆地第四大气区探实 尖北产量超亿方
  19. 用友系统服务器如何安装,用友数据库服务器安装步骤
  20. 用于《机械设计课程设计》中的减速箱设计的Python计算程序

热门文章

  1. protect 继承_public、protect、private继承方式 C++
  2. 【视频理解】论文串讲
  3. Windows下用ndk编译ffmpeg
  4. B-010 详细解析电源滤波电容的选取与计算
  5. 【逻辑漏洞】业务中常见的漏洞
  6. Chapter 3: Strings、Vectors And Arrays
  7. 日常上网必备趣味,实用的100个网站
  8. 破解Linux系统中root密码
  9. ROS2机器人笔记20-12-04
  10. 怎样关联多个 Excel 档工作表(Sheet)中的数据