模糊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(P