//写个简单的先练习一下,测试通过
//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实现相关推荐

  1. Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法

    聚类的分割 1.K-均值聚类 (1)K-均值聚类介绍 k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心 ...

  2. 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 ...

  3. EM算法应用:k均值聚类(k-means)和高斯混合模型(GMM)

    文章目录 k-means聚类 EM角度的理解 算法流程 特点 k值选择 局限性 高斯混合模型 GMM的问题描述 1,明确隐变量 2.EM算法的E步:确定Q函数 3. EM算法的E步 4. 停止条件 上 ...

  4. k均值聚类算法考试例题_k means聚类算法实例

    所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高.其中每个子集叫做一个簇. ...

  5. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  6. 两种聚类方法——K均值聚类(K-means)算法和模糊C均值聚类(FCM)算法的简述与在MATLAB中的实现

    目录 1.K-means算法 1.1算法流程 1.2程序实现 1.3实验结果 原始数据集 聚类结果 2.FCM算法 2.1算法流程 2.2程序设计 FCM子函数 主函数 2.3实验结果 原始数据集 聚 ...

  7. 讨论k值以及初始聚类中心对聚类结果的影响_K均值聚类需要标准化数据吗

    摘要:进入二十一世纪以来,科学技术的不断发展,使得数据挖掘技术得到了学者越来越多的关注.数据挖掘是指从数据库中发现隐含在大量数据中的新颖的.潜在的有用信息和规则的过程,是一种处理数据库数据的知识发现. ...

  8. k均值算法 二分k均值算法_使用K均值对加勒比珊瑚礁进行分类

    k均值算法 二分k均值算法 Have you ever seen a Caribbean reef? Well if you haven't, prepare yourself. 您见过加勒比礁吗? ...

  9. K均值与DBSCAN聚类效果

    K均值与DBSCAN聚类效果 K均值的发展状况 K-means算法(Lloyod,1982)是简单而又有效的统计聚类算法,使机器能够将具有相同属性的样本归置到一块儿.K-均值算法的理论研究主要包括三块 ...

  10. 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 ...

最新文章

  1. oc75--不可变字典NSDictionary
  2. C# DirectX编程对基本三角形应用平移变换矩阵
  3. Python爬虫必备技能,Xpath提取数据规格详解
  4. PyChram使用技巧
  5. scala函数式编程
  6. windows 下 TensorFlow(GPU 版)的安装
  7. 深入理解viewport及相关属性的关系
  8. 日语整理之 自五 他五
  9. 英语口语软件测试满分多少分,小学生英语口语测试评分标准
  10. matlab模拟嫦娥奔月,2017年6月英语六级翻译模拟练习题:嫦娥奔月
  11. 雷军语录:感谢“批评”让小米理性成长
  12. 通过mtd读写flash_NOR Flash读写原理及驱动
  13. 基金什么时候买入好?
  14. AndroidStudio创建项目(Could not find any version)
  15. static inline声明
  16. 信息化管理技术-制造执行系统(MES) – MES项目的规划和应用
  17. mysql语句统计总数_一条sql语句实现统计查询_MySQL
  18. 以社交活动的方式做计划-乐高公司的大规模敏捷
  19. Linux上的中文输入法安装(Ubuntu + Kali五笔拼音)
  20. 发了两个月传单,转行做了程序员

热门文章

  1. _LINUX下的软件包管理 - zjlk
  2. linux apache中文名称图片,linux下解决apache不支持中文名的方法详解!
  3. java 类编译_Java类编译、加载、和执行机制
  4. JS 日期转化及日期比较
  5. jQuery学习笔记02:核心部分
  6. Java实训项目:GUI学生信息管理系统(2017)
  7. dubbo原理_dubbo的底层原理
  8. 【Level 08】U06 Good Feeling L2 Blow the competition away
  9. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(4) - 比较指令
  10. core微型计算机,UPC-CHT01 | 专业创客微型计算机板_UP Core - AAEON