模式识别之聚类算法k-均值---k-均值聚类算法c实现
//写个简单的先练习一下,测试通过 //k-均值聚类算法C语言版#include <stdlib.h>#include <stdio.h>#include <time.h>#include <math.h>
#define TRUE 1#define FALSE 0 int N;//数据个数int K;//集合个数int * CenterIndex;//初始化质心数组的索引double * Center;//质心集合double * CenterCopy;//质心集合副本double * AllData;//数据集合double ** Cluster;//簇的集合int * Top;//集合中元素的个数,也会用作栈处理//随机生成k个数x(0<=x<=n-1)作为起始的质心集合 void CreateRandomArray(int n, int k,int * center) {int i=0;int j=0; srand( (unsigned)time( NULL ) );for( i=0;i<k;++i)//随机生成k个数{int a=rand()%n;//判重for(j=0;j<i;j++){if(center[j]==a)//重复{break;}}if(j>=i)//如果不重复,加入{center[i]=a;}else{i--;//如果重复,本次重新随机生成}} }//返回距离最小的质心的序号 int GetIndex(double value,double * center) {int i=0;int index=i;//最小的质心序号double min=fabs(value-center[i]);//距质心最小距离for(i=0;i<K;i++){if(fabs(value-center[i])<min)//如果比当前距离还小,更新最小的质心序号和距离值{index=i;min=fabs(value-center[i]);}}return index; }//拷贝质心数组到副本 void CopyCenter() {int i=0;for(i=0;i<K;i++){CenterCopy[i]=Center[i];} } //初始化质心,随机生成法 void InitCenter() {int i=0;CreateRandomArray(N,K,CenterIndex);//产生随机的K个<N的不同的序列for(i=0;i<K;i++){Center[i]=AllData[CenterIndex[i]];//将对应数据赋值给质心数组}CopyCenter();//拷贝到质心副本 } //加入一个数据到一个Cluster[index]集合 void AddToCluster(int index,double value) {Cluster[index][Top[index]++]=value;//这里同进栈操作 }//重新计算簇集合 void UpdateCluster() { int i=0;int tindex;//将所有的集合清空,即将TOP置0for(i=0;i<K;i++){Top[i]=0;}for(i=0;i<N;i++){tindex=GetIndex(AllData[i],Center);//得到与当前数据最小的质心索引AddToCluster(tindex,AllData[i]); //加入到相应的集合中 } } //重新计算质心集合,对每一簇集合中的元素加总求平均即可 void UpdateCenter() {int i=0;int j=0;double sum=0;for(i=0;i<K;i++){sum=0; //计算簇i的元素和for(j=0;j<Top[i];j++){sum+=Cluster[i][j];}if(Top[i]>0)//如果该簇元素不为空{Center[i]=sum/Top[i];//求其平均值}} } //判断2数组元素是否相等 int IsEqual(double * center1 ,double * center2) {int i;for(i=0;i<K;i++){if(fabs(center1[i]!=center2[i])){return FALSE;}}return TRUE; } //打印聚合结果 void Print() {int i,j;printf("-------------------------------------- ");for(i=0;i<K;i++){printf("第%d组: 质心(%f) ",i,Center[i]);for(j=0;j<Top[i];j++){printf("%f ",Cluster[i][j]);} } } //初始化聚类的各种数据 void InitData() {int i=0;int a;printf("输入数据个数: "); scanf("%d",&N);printf("输入簇个数: "); scanf("%d",&K); if(K>N){exit(0);}Center=(double *)malloc(sizeof(double)*K);//为质心集合申请空间CenterIndex=(int *)malloc(sizeof(int)*K);//为质心集合索引申请空间CenterCopy=(double *)malloc(sizeof(double)*K);//为质心集合副本申请空间Top=(int *)malloc(sizeof(int)*K);AllData=(double *)malloc(sizeof(double)*N);//为数据集合申请空间Cluster=(double **)malloc(sizeof(double *)*K);//为簇集合申请空间//初始化K个簇集合for(i=0;i<K;i++){Cluster[i]=(double *)malloc(sizeof(double)*N);Top[i]=0;}printf("输入%d数据:",N);for(i=0;i<N;i++){scanf("%d",&(a));AllData[i]=a;}InitCenter();//初始化质心集合 UpdateCluster();//初始化K个簇集合} /* 算法描述: K均值算法:给定类的个数K,将N个对象分到K个类中去,使得类内对象之间的相似性最大,而类之间的相似性最小。 */ main() {int Flag=1;//迭代标志,若为false,则迭代结束int i=0;InitData();//初始化数据 while(Flag)//开始迭代{UpdateCluster();//更新各个聚类UpdateCenter(); //更新质心数组if(IsEqual(Center,CenterCopy))//如果本次迭代与前次的质心聚合相等,即已收敛,结束退出{Flag=0;}else//否则将质心副本置为本次迭代得到的的质心集合{CopyCenter();//将质心副本置为本次迭代得到的的质心集合}}Print();//输出结果getchar();getchar();}
模式识别之聚类算法k-均值---k-均值聚类算法c实现相关推荐
- Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法
聚类的分割 1.K-均值聚类 (1)K-均值聚类介绍 k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心 ...
- Kmeans++、Mini-Batch Kmeans、Bisecting Kmeans、K中心点(K-Medoids)算法、K众数聚类、核K均值聚类
Kmeans++.Mini-Batch Kmeans.Bisecting Kmeans.K中心点(K-Medoids)算法.K众数聚类.核K均值聚类 目录 Kmeans++.Mini-Batch Km ...
- EM算法应用:k均值聚类(k-means)和高斯混合模型(GMM)
文章目录 k-means聚类 EM角度的理解 算法流程 特点 k值选择 局限性 高斯混合模型 GMM的问题描述 1,明确隐变量 2.EM算法的E步:确定Q函数 3. EM算法的E步 4. 停止条件 上 ...
- k均值聚类算法考试例题_k means聚类算法实例
所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高.其中每个子集叫做一个簇. ...
- k均值聚类算法python_K均值和其他聚类算法:Python快速入门
k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...
- 两种聚类方法——K均值聚类(K-means)算法和模糊C均值聚类(FCM)算法的简述与在MATLAB中的实现
目录 1.K-means算法 1.1算法流程 1.2程序实现 1.3实验结果 原始数据集 聚类结果 2.FCM算法 2.1算法流程 2.2程序设计 FCM子函数 主函数 2.3实验结果 原始数据集 聚 ...
- 讨论k值以及初始聚类中心对聚类结果的影响_K均值聚类需要标准化数据吗
摘要:进入二十一世纪以来,科学技术的不断发展,使得数据挖掘技术得到了学者越来越多的关注.数据挖掘是指从数据库中发现隐含在大量数据中的新颖的.潜在的有用信息和规则的过程,是一种处理数据库数据的知识发现. ...
- k均值算法 二分k均值算法_使用K均值对加勒比珊瑚礁进行分类
k均值算法 二分k均值算法 Have you ever seen a Caribbean reef? Well if you haven't, prepare yourself. 您见过加勒比礁吗? ...
- K均值与DBSCAN聚类效果
K均值与DBSCAN聚类效果 K均值的发展状况 K-means算法(Lloyod,1982)是简单而又有效的统计聚类算法,使机器能够将具有相同属性的样本归置到一块儿.K-均值算法的理论研究主要包括三块 ...
- PRML第九章读书笔记——Mixture Models and EM K均值/K中心点、高斯混合奇异性、EM观点下的高斯混合/K-means/混合伯努利分布/贝叶斯线性回归、推广EM算法
目录 9.1 K-means Clustering P429 K中心点算法K-medoids 9.2 Mixtures of Gaussians P433 高斯混合的奇异性 9.3 An Altern ...
最新文章
- oc75--不可变字典NSDictionary
- C# DirectX编程对基本三角形应用平移变换矩阵
- Python爬虫必备技能,Xpath提取数据规格详解
- PyChram使用技巧
- scala函数式编程
- windows 下 TensorFlow(GPU 版)的安装
- 深入理解viewport及相关属性的关系
- 日语整理之 自五 他五
- 英语口语软件测试满分多少分,小学生英语口语测试评分标准
- matlab模拟嫦娥奔月,2017年6月英语六级翻译模拟练习题:嫦娥奔月
- 雷军语录:感谢“批评”让小米理性成长
- 通过mtd读写flash_NOR Flash读写原理及驱动
- 基金什么时候买入好?
- AndroidStudio创建项目(Could not find any version)
- static inline声明
- 信息化管理技术-制造执行系统(MES) – MES项目的规划和应用
- mysql语句统计总数_一条sql语句实现统计查询_MySQL
- 以社交活动的方式做计划-乐高公司的大规模敏捷
- Linux上的中文输入法安装(Ubuntu + Kali五笔拼音)
- 发了两个月传单,转行做了程序员
热门文章
- _LINUX下的软件包管理 - zjlk
- linux apache中文名称图片,linux下解决apache不支持中文名的方法详解!
- java 类编译_Java类编译、加载、和执行机制
- JS 日期转化及日期比较
- jQuery学习笔记02:核心部分
- Java实训项目:GUI学生信息管理系统(2017)
- dubbo原理_dubbo的底层原理
- 【Level 08】U06 Good Feeling L2 Blow the competition away
- Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(4) - 比较指令
- core微型计算机,UPC-CHT01 | 专业创客微型计算机板_UP Core - AAEON