模糊c均值聚类与k均值聚类区别
k均值聚类
k均值聚类的实现中,把每个样本划分到单一的类别中,亦即是每个样本只能属于一种类别,不能属于多种类别。这样的划分,称为硬划分。
模糊c均值均类
为了解决硬划分所带来的问题,因此有了称为软划分的聚类算法,这一类算法中,每个样本不再只能属于一种类别,而是对于每个样本,都有对应的隶属度数组,数组里的每一个元素代表该样本属于某种类别的程度。而该样本的隶属度数组中的总值等于1。
其目标方程以及优化的推导过程可以参照下述链接,个人认为推导过程十分详细。
模糊c均值聚类推导
实现步骤:
根据相关的推导结果,具体实现步骤如下:
- 初始化数据集
- 初始化隶属度数组
- 根据隶属度数组更新聚类中心
- 根据聚类中心更新隶属度数组
- 是否达到结束条件,没有达到则重复2-4步骤。
实现
各个相关函数都有注释。
- #include <time.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <math.h>
- typedef struct{
- double x;
- double y;
- } Position;
-
- //随机生成二维数据点
- //len:节点数量
- //range:节点x、y值的范围
- Position *randomPosition(int len, int range){
- srand((unsigned)time(NULL));
- Position *allPos = (Position *)malloc(len * sizeof(Position));
-
- short a = 1; //人为差异量
- for (int i = 0; i < len; ++i)
- {
- if (a)
- {
- allPos[i].x = (double)rand() / 2147483647 * range;
- allPos[i].y = (double)r