-
2020-11-25 15:55:48
/** C均值聚类算法的C语言实现 Author:AnranWu Date:2020/11/25 */ #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; typedef long long ll; const ll maxn=1e6+50; const double eps=1e-2; struct node{ double x=0,y=0; }a[maxn],b[maxn],sum[maxn]; int belong[maxn],cnt[maxn]; double dis(node a,node b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main(){ int c,n; printf("请输入需要将模式分为的类别数 c :"); scanf("%d",&c); printf("请输入模式总数 n :"); scanf("%d",&n);//输入需要聚类的模式数 printf("请输入各模式的两个特征点 :\n"); for(int i=1;i<=n;i++)scanf("%lf%lf",&a[i].x,&a[i].y);//输入每个模式的两个特征 for(int i=1;i<=c;i++)b[i]=a[i];//选定初始的c个聚类中心 int ans=0;//ans表示与上次聚类中心一致的聚类中心点数量,当所有聚类中心均不发生改变时循环结束 while(ans<c){ memset(cnt,0,sizeof(cnt));//cnt记录每一个类别有多少个模式属于该类 for(int i=1;i<=n;i++){ double minn=4e18;//计算该模式到每一个聚类中心的距离 int mini=0; for(int j=1;j<=c;j++){ double dis_to_center=dis(a[i],b[j]); if(dis(a[i],b[j])<minn){ minn=dis_to_center; mini=j; } } belong[i]=mini;//选择距离最小的一个类加入该类 cnt[mini]++;//更新该类中模式的数量 } for(int i=1;i<=c;i++)sum[i].x=0,sum[i].y=0; for(int i=1;i<=n;i++){ sum[belong[i]].x+=a[i].x; sum[belong[i]].y+=a[i].y;//计算新的聚类中心 } ans=0; for(int i=1;i<=c;i++){ sum[i].x/=cnt[i]; sum[i].y/=cnt[i]; //判断该聚类中心是否发生变化,eps控制容差值 if((fabs(sum[i].x-b[i].x)<eps)&&(fabs(sum[i].y-b[i].y)<eps))ans++; b[i].x=sum[i].x; b[i].y=sum[i].y;//更新聚类中心 } } printf("C均值聚类算法已经完成!\nc个类中心分别为\n"); for(int i=1;i<=c;i++){ printf("第%d类的聚类中心的两个特征值分别为 %.2lf %.2lf\n",b[i].x,b[i].y); } for(int i=1;i<=c;i++){ printf("属于第%d类的点有:\n"); for(int j=1;j<=n;j++){ if(belong[j]==i)printf("%d号点 %.2lf %.2lf\n",j,a[j].x,a[j].y); } putchar(10); } } /* 测试数据 #1 2 20 0 0 1 0 0 1 1 1 2 1 1 2 2 2 3 2 6 6 7 6 8 6 6 7 7 7 8 7 9 7 7 8 8 8 9 8 8 9 9 9 */
更多相关内容 -
模糊C均值聚类(FCM),模糊c均值聚类算法的优缺点,matlab
2021-09-10 21:08:23模糊均值聚类算法。 -
c均值聚类算法matlab代码-isosplit5:ISO-SPLIT集群(独立版)
2021-05-23 14:52:28c均值聚类算法matlab代码ISO标准 ISO-SPLIT是一种有效的聚类算法,可以处理中低维度的未知数量的单峰聚类,而无需任何用户可调整的参数。 它基于对单峰性的重复测试-使用等渗回归和改进的Hartigan dip测试-应用于... -
c均值聚类算法matlab代码-fcm_m:这是Matlab代码中FCM聚类方法的一些变体
2021-05-23 14:52:20c均值聚类算法matlab代码fcm_m 这是matlab代码中FCM聚类方法的一些变体。 您可以参考以下文章以进一步了解:“一种鲁棒的模糊局部信息C均值聚类算法” -
一种改进的模糊C-均值聚类算法 (2012年)
2021-05-18 05:30:07由于现有模糊C均值聚类算法固有的局限性,本文提出了一种改进的模糊C均值聚类算法。首先用概率密度函数来确定初始聚类中心点和聚类数,其次用竞争学习思想提出使对手增加抑制因子来修改隶属度得到加快收敛速度的效果... -
基于粒子群优化的模糊C均值聚类算法*
2020-10-16 00:00:42针对模糊C均值聚类算法(FCM)存在对初始聚类中心敏感,易陷入局部最优解的不足,将改进的粒子群聚类算法与FCM算法相结合,提出了一种基于粒子群优化的模糊C均值聚类算法。该算法对粒子群初始化空间及粒子移动最大速度... -
K-MEANS(K均值聚类算法,C均值算法)
2018-01-15 13:33:22K-MEANS(K均值聚类算法,C均值算法) K-MEANS(K均值聚类算法,C均值算法) K-MEANS(K均值聚类算法,C均值算法) -
模糊C均值聚类算法实现数据挖掘的matlab源代码
2018-01-04 19:52:53模糊C均值聚类算法实现数据挖掘的matlab源代码 -
模糊C均值聚类算法的改进研究 (2011年)
2021-06-13 11:49:51模糊C均值聚类算法(FCM)是一种比较有代表性的模糊聚类算法,主要是通过迭代更新聚类中心和隶属度矩阵,使目标函数值达到最小.FCM算法还有很多缺陷和不足,其中最主要的就是选取不同的初始中心,会得到不同的聚类结果,... -
直觉模糊C-均值聚类算法研究
2021-01-14 20:02:31c- 均值聚类推广为直觉模 糊??c- 均值聚类(IFCM) 的途径和方法, 分析了现有的几种IFCM 算法, 并提出了一种基于直觉模糊集的模糊??c- 均值 聚类算法. 该算法首先定义了直觉模糊集之间的距离; 然后构造了... -
模糊C均值聚类算法
2015-01-19 10:09:11自己写的模糊C均值聚类算法,也就是FCM,用matlab写的,希望能帮助大家学习 -
论文研究-广义均衡模糊C均值聚类算法.pdf
2019-09-20 17:26:22论文研究-广义均衡模糊C均值聚类算法.pdf, 模糊C均值聚类(FCM)算法是一种快速有效的聚类算法,但它没有考虑各类样本容量的差异, 其最小化代价函数会导致聚类判决有利于少... -
簇间可分的鲁棒模糊C均值聚类算法.pdf
2021-08-19 11:48:20簇间可分的鲁棒模糊C均值聚类算法.pdf -
基于模糊C均值聚类算法的脑部CT图像分割.pdf
2021-08-19 00:02:58基于模糊C均值聚类算法的脑部CT图像分割.pdf -
基于遗传模拟退火算法的模糊C均值聚类算法(MATLAB自带的遗传算法工具箱)
2019-03-12 15:26:18基于遗传模拟退火算法的模糊C均值聚类算法(MATLAB自带的遗传算法工具箱),注释清楚,可直接更改使用,代码在MATLAB2016里运行通过! -
新的鲁棒模糊C-均值聚类分割算法及其应用 (2016年)
2021-05-18 14:59:41针对Krinidis等人提出的模糊局部C-均值聚类系列算法缺乏合理性的不足,提出一种新的鲁棒模糊局部C-均值聚类分割算法。对鲁棒模糊局部C-均值聚类的目标函数重新分析并建立正确的聚类目标函数,对新的聚类目标函数及其... -
改进型模糊C均值聚类算法的电力负荷特性分类技术研究.pdf
2021-08-20 00:01:25改进型模糊C均值聚类算法的电力负荷特性分类技术研究.pdf -
论文研究-基于密度峰值优化的模糊C均值聚类算法.pdf
2019-09-11 11:09:55针对传统模糊C均值聚类算法和基于K-means 优化聚类中心的模糊C均值算法存在初始聚类中心敏感、聚类速度收敛慢、聚类算法需要人为给定聚类数目等缺陷,受密度峰值聚类算法(Clustering by Fast Search and Find of ... -
K-MEANS(K均值聚类算法-C均值算法).ppt
2019-12-11 22:46:57为中心向量c1, c2, , ck初始化k个种子 分组: 将样本分配给距离其最近的中心向量 由这些样本构造不相交 non-overlapping 的聚类 确定中心: 用各个聚类的中心向量作为新的中心 重复分组和确定中心的步骤直至算法收敛;... -
基于Relieft特征加权的C均值聚类算法的研究和改进.pdf
2021-08-19 23:57:20基于Relieft特征加权的C均值聚类算法的研究和改进.pdf -
基于超像素的快速模糊c均值聚类算法在彩色图像分割中的应用
2021-03-12 12:11:25基于超像素的快速模糊c均值聚类算法在彩色图像分割中的应用 -
模糊C均值聚类算法MATLAB实现
2012-10-16 22:23:19自己写的模糊C均值聚类算法MATLAB实现 -
论文研究-基于粒子群的模糊C均值聚类算法不同模式的比较 .pdf
2019-08-15 11:54:55基于粒子群的模糊C均值聚类算法不同模式的比较,黄新建,,本文把标准粒子群优化算法应用于模糊C均值聚类算法中,详尽地比较了异步模式和同步模式聚类效果。首先介绍了相关算法和粒子群算�� -
图像处理中的模糊C均值聚类matlab算法及源代码
2020-09-24 16:01:11聚类分割算法是图像处理中的基本操作,文件中包含了使用模糊C-均值实现聚类分割的算法原理以及MAtlab源程序 聚类分割算法是图像处理中的基本操作,文件中包含了使用模糊C-均值实现聚类分割的算法原理以及MAtlab源... -
模糊c-均值聚类算法-matlab实现
2014-10-22 15:50:43模糊c-均值(FCM)聚类算法在matlab中实现,已测试通过 -
基于降维模糊C 均值聚类算法的采动场地稳定性评价-论文
2021-07-07 18:43:57模糊聚类分析是无监督机器学习的主要技术之一,可用于进行数据分析和建模,模糊C均值聚类算法(Fuzzy C-Means,FCM)通过优化目标函数得到所有类中心样本点的隶属度以实现样本数据的自动聚类目的,但面对煤矿采空区... -
一种模糊C均值聚类算法及实现.pdf
2021-08-19 00:00:41一种模糊C均值聚类算法及实现.pdf -
模糊c均值聚类算法原理详细讲解
2020-11-29 15:27:53模糊c均值聚类算法详细讲解python(一)聚类和模糊简述(二)模糊c均值聚类原理(1)目标函数(三)模糊c均值聚类算法步骤 (一)聚类和模糊简述 聚类分析是多元统计分析的一种,也是无监督模式识别的一个重要分支,...
本文是在另一篇博客的基础上加上了自己的理解: 另一篇博客.(一)聚类和模糊简述
聚类分析是多元统计分析的一种,也是无监督模式识别的一个重要分支,在模式分类、图像处理和模糊规则处理等众多领域中获得最广泛的应用。它把没有类别标记的样本按照某种准则划分为若干子集,使相似的样本尽可能归于一类,而把不相似的样本划分到不同的类中。硬聚类把每个待识别的对象严格的划分某类中,具有非此即彼的性质(非0即1),而模糊聚类建立了样本对类别的不确定描述,更能客观的反应客观世界,从而成为聚类分析的主流。
在很多问题中,结果只有两种可能,即取0或者1,比如一个学生不是男生就是女生。但是这样不能描述很多事物的属性,比如天气冷热程度,没有一个明确的定义来规定什么温度是热什么是冷。原因在于在很多情况下多个类别之间的界限并不是绝对的明确。
需要用模糊性词语来判断,模糊数学和模糊逻辑把只取1或0二值(属于/不属于)的普通集合概念推广[0,1]之间的实数,即隶属度。用“隶属度”来描述元素和集合之间的关系,通过隶属度来表示样本属于某一类的概率。(二)模糊c均值聚类原理
模糊c-均值聚类算法 fuzzy c-means algorithm ( FCM)。在众多模糊聚类算法中,模糊C-均值( FCM) 算法应用最广泛且较成功,它通过优化目标函数得到每个样本点对所有类中心的隶属度,从而决定样本点的类属以达到自动对样本数据进行分类的目的。给每个样本赋予属于每个簇的隶属度函数,通过隶属度值大小来将样本归类。
模糊c均值聚类主要有三个关键参数,固定数量的集群、每个群集一个质心、每个数据点属于最接近质心对应的簇。(1)目标函数
模糊c均值聚类通过最小化目标函数来得到聚类中心。目标函数本质上是各个点到各个类的欧式距离的和(误差的平方和)。聚类的过程就是最小化目标函数的过程,通过反复的迭代运算,逐步降低目标函数的误差值,当目标函数收敛时,可得到最终的聚类结果。
下面是目标函数:其中,m为聚类的簇数(类数),N 为样本数,C 为聚类中心数。cj 表示第 j 个聚类中心,和样本特征维数相同,xi 表示第 i 个样本,uij 表示样本 xi 对聚类中心 cj 的隶属度(即 xi 属于 cj 的概率)。||∗|| 可以是任意表示数据相似性(距离)的度量,最常见的就是欧几里得范数(又称欧氏范数,L2范数,欧氏距离):
(2)隶属度矩阵Uij和簇中心Cij
隶属度矩阵应当是 N∗C 的矩阵,隶属度矩阵表示的是每个样本点属于每个类的程度。对于单个样本xi,它对于每个簇的隶属度之和为1。对于每个样本点在哪个类的隶属度最大归为哪个类。越接近于1表示隶属度越高,反之越低。
求每组的聚类中心ci,使得目标函数最小(因为目标函数与欧几里德距离有关,目标函数达到最小时,欧式距离最短,相似度最高),这保证了组内相似度最高,组间相似度最低的聚类原则。
我们发现uij与ci是相互关联的,彼此包含对方,有一个问题就是在fcm算法开始的时候既没有uij也没有ci,那要怎么求解呢?很简单,程序开始的时候我们随便赋值给uij或者ci其中的一个,只要数值满足条件即可。然后就开始迭代,比如一般的都赋值给uij,那么有了uij就可以计算ci,然后有了ci又可以计算uij,反反复复,在这个过程中还有一个目标函数J一直在变化,逐渐趋向稳定值。那么当J不在变化的时候就认为算法收敛到一个比较好的解了。可以看到uij和ci在目标函数J下似乎构成了一个正反馈一样,所有我们可以不用求目标函数,不断迭代计算隶属度uij和簇中心cj达到我们的要求即可。(3)终止条件
上图为终止条件,其中 t 是迭代步数,ε 是一个很小的常数表示误差阈值。也就是说迭代地更新 uij 和 cj 直到前后两次隶属度最大变化值不超过误差阈值。即继续迭代下去,隶属程度也不会发生较大的变化,认为隶属度不变了,已经达到比较优(局部最优或全局最优)状态了。这个过程最终收敛于 Jm 的局部极小值点或鞍点。
(三)模糊c均值聚类算法步骤
FCM算法步骤:
(1)选择类别的数目C,选择合适的m,初始化由隶属度函数确定的矩阵U0(随机值[0,1]之间初始化);
(2)计算聚类的中心值Cj;
(3)计算新的隶属度矩阵Uj
(4)比较Uj和U(j+1),如果两者的变化小于某个阈值,则停止算法,否则转向(2)。