原理简介

  模糊c均值聚类(Fuzzy C-Means)是引入了模糊理论的一种聚类算法,通过隶属度来表示样本属于某一类的概率,原因在于在很多情况下多个类别之间的界限并不是绝对的明确。显然,相比于k-means的硬聚类,模糊c均值聚类得到的聚类结果更灵活。

  模糊c均值聚类通过最小化一下目标函数来得到聚类中心:

Jm=∑i=1N∑j=1Cuijm∥xi−cj∥2,1≤m<∞(1)J_{m}=\sum_{i=1}^{N} \sum_{j=1}^{C} u_{i j}^{m}\left\|x_{i}-c_{j}\right\|^{2} \quad, \quad 1 \leq m<\infty \tag{1}Jm​=i=1∑N​j=1∑C​uijm​∥xi​−cj​∥2,1≤m<∞(1)

其中,m>1m>1m>1 为模糊系数(fuzzy coefficient),NNN 为样本数,CCC 为聚类中心数,cjc_jcj​ 表示第 jjj 个聚类中心,和样本特征维数相同,xix_ixi​ 表示第 iii 个样本,uiju_{ij}uij​ 表示样本 xix_ixi​ 对聚类中心 cjc_jcj​ 的隶属度(通俗的说就是 xix_ixi​ 属于 cjc_jcj​ 的概率),显然满足

∑j=1Cuij=1(2)\sum_{j=1}^{C} u_{i j}=1 \tag{2}j=1∑C​uij​=1(2)

∣∣∗∣∣||*||∣∣∗∣∣ 可以是任意度量数据相似性(距离)的范数,最常见的就是欧几里得范数(又称欧氏范数,L2范数,欧氏距离):

d=∥x∥2=∑ixi2(3)d=\|x\|_2=\sqrt{\sum_i {x_i^2}} \tag{3}d=∥x∥2​=i∑​xi2​​(3)

  模糊c均值聚类通过更新 uiju_{ij}uij​ 和 cjc_jcj​ 来迭代地优化目标函数Eq. (1):

uij=1∑k=1C(∥xi−cj∥∥xi−ck∥)2m−1(4)u_{i j}=\frac{1}{\sum_{k=1}^{C}\left(\frac{\left\|x_{i}-c_{j}\right\|}{\left\|x_{i}-c_{k}\right\|}\right)^{\frac{2}{m-1}}} \tag{4}uij​=∑k=1C​(∥xi​−ck​∥∥xi​−cj​∥​)m−12​1​(4)

cj=∑i=1Nuijm⋅xi∑i=1Nuijm(5)c_{j}=\frac{\sum_{i=1}^{N} u_{i j}^{m} \cdot x_{i}}{\sum_{i=1}^{N} u_{i j}^{m}} \tag{5}cj​=∑i=1N​uijm​∑i=1N​uijm​⋅xi​​(5)

迭代的终止条件为 max⁡ij{∣uij(t+1)−uij(t)∣}<ε\max _{ij}\left\{\left|u_{ij}^{(t+1)}-u_{ij}^{(t)}\right|\right\}<\varepsilonmaxij​{∣∣∣​uij(t+1)​−uij(t)​∣∣∣​}<ε ,其中 ttt 是迭代步数,ε\varepsilonε 是一个很小的常数表示误差阈值。也就是说迭代地更新 uiju_{ij}uij​ 和 cjc_jcj​ 直到前后两次隶属度最大变化值不超过误差阈值。这个过程最终收敛于 JmJ_mJm​ 的局部极小值点或鞍点

算法步骤

可以将模糊c均值聚类的过程归纳为以下几步:

  1. 初始化隶属度矩阵 U(0)U^{(0)}U(0),若有 NNN个样本,指定类别数为 CCC,则隶属度矩阵应当是 N∗CN*CN∗C 的矩阵;
  2. 根据式(5)更新聚类中心 cj,j=1,...,Cc_j, j=1,...,Ccj​,j=1,...,C;
  3. 根据式(4)更新 U(t),U(t+1)U^{(t)}, U^{(t+1)}U(t),U(t+1);
  4. 若满足终止条件 max⁡ij{∣uij(t+1)−uij(t)∣}<ε\max _{ij}\left\{\left|u_{ij}^{(t+1)}-u_{ij}^{(t)}\right|\right\}<\varepsilonmaxij​{∣∣∣​uij(t+1)​−uij(t)​∣∣∣​}<ε 则停止迭代,否则返回步骤2。

程序实现

下面代码以Iris数据集聚类为例实现了fuzzy c-means。

#!/usr/bin/python3
# -*- coding: utf-8 -*-'''
@Date    : 2019/9/11
@Author  : Rezero
'''import numpy as np
import pandas as pddef loadData(datapath):data = pd.read_csv(datapath, sep=',', header=None)data = data.sample(frac=1.0)   # 打乱数据顺序dataX = data.iloc[:, :-1].values # 特征labels = data.iloc[:, -1].values # 标签# 将标签类别用 0, 1, 2表示labels[np.where(labels == "Iris-setosa")] = 0labels[np.where(labels == "Iris-versicolor")] = 1labels[np.where(labels == "Iris-virginica")] = 2return dataX, labelsdef initialize_U(samples, classes):U = np.random.rand(samples, classes)  # 先生成随机矩阵sumU = 1 / np.sum(U, axis=1)   # 求每行的和U = np.multiply(U.T, sumU)   # 使隶属度矩阵每一行和为1return U.T# 计算样本和簇中心的距离,这里使用欧氏距离
def distance(X, centroid):return np.sqrt(np.sum((X-centroid)**2, axis=1))def computeU(X, centroids, m=2):sampleNumber = X.shape[0]  # 样本数classes = len(centroids)U = np.zeros((sampleNumber, classes))# 更新隶属度矩阵for i in range(classes):for k in range(classes):U[:, i] += (distance(X, centroids[i]) / distance(X, centroids[k])) ** (2 / (m - 1))U = 1 / Ureturn Udef ajustCentroid(centroids, U, labels):newCentroids = [[], [], []]curr = np.argmax(U, axis=1)  # 当前中心顺序得到的标签for i in range(len(centroids)):index = np.where(curr == i)   # 建立中心和类别的映射trueLabel = list(labels[index])  # 获取labels[index]出现次数最多的元素,就是真实类别trueLabel = max(set(trueLabel), key=trueLabel.count)newCentroids[trueLabel] = centroids[i]return newCentroidsdef cluster(data, labels, m, classes, EPS):""":param data: 数据集:param m: 模糊系数(fuzziness coefficient):param classes: 类别数:return: 聚类中心"""sampleNumber = data.shape[0]  # 样本数cNumber = data.shape[1]       # 特征数U = initialize_U(sampleNumber, classes)   # 初始化隶属度矩阵U_old = np.zeros((sampleNumber, classes))while True:centroids = []# 更新簇中心for i in range(classes):centroid = np.dot(U[:, i]**m, data) / (np.sum(U[:, i]**m))centroids.append(centroid)U_old = U.copy()U = computeU(data, centroids, m)  # 计算新的隶属度矩阵if np.max(np.abs(U - U_old)) < EPS:# 这里的类别和数据标签并不是一一对应的, 调整使得第i个中心表示第i类centroids = ajustCentroid(centroids, U, labels)return centroids, U# 预测所属的类别
def predict(X, centroids):labels = np.zeros(X.shape[0])U = computeU(X, centroids)  # 计算隶属度矩阵labels = np.argmax(U, axis=1)  # 找到隶属度矩阵中每行的最大值,即该样本最大可能所属类别return labelsdef main():datapath = "iris.data"dataX, labels = loadData(datapath)  # 读取数据# 划分训练集和测试集ratio = 0.6  # 训练集的比例trainLength = int(dataX.shape[0] * ratio)  # 训练集长度trainX = dataX[:trainLength, :]trainLabels = labels[:trainLength]testX = dataX[trainLength:, :]testLabels = labels[trainLength:]EPS = 1e-6   # 停止误差条件m = 2        # 模糊因子classes = 3  # 类别数# 得到各类别的中心centroids, U = cluster(trainX, trainLabels, m, classes, EPS)trainLabels_prediction = predict(trainX, centroids)testLabels_prediction = predict(testX, centroids)train_error = 1 - np.sum(np.abs(trainLabels_prediction - trainLabels)) / trainLengthtest_error = 1 - np.sum(np.abs(testLabels_prediction - testLabels)) / (dataX.shape[0] - trainLength)print("Clustering on traintset is %.2f%%" % (train_error*100))print("Clustering on testset is %.2f%%" % (test_error*100))if __name__ == "__main__":main()

参考资料

A Tutorial on Clustering Algorithms——Fuzzy C-Means Clustering
Fuzzy C-Means(模糊C均值聚类)算法原理详解与python实现

模糊c均值聚类及python实现相关推荐

  1. 模糊C均值聚类 python实现

    模糊C均值聚类的python实现 存在的问题: 用来判断终止条件的变量dist,是前后两次隶属度矩阵的对应元素做差,取绝对值,再取最大值.用鸢尾花数据集的话,dist的值最低只能到小数点后两位,但是网 ...

  2. 【论文必用】模糊C均值聚类的简单介绍、复现及Python代码详解、聚类可视化图的绘制过程详解!

    详解模糊C均值聚类 一.聚类 二.模糊C均值聚类 三.模糊C均值聚类的Python实现 四.参考链接 一.聚类 聚类的定义: 将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类 ...

  3. python计算iris数据集的均值_模糊C均值聚类算法及python实现

    目录 本文采用数据集为iris,将iris.txt放在程序的同一文件夹下.请先自行下载好. 模糊理论 模糊控制是自动化控制领域的一项经典方法.其原理则是模糊数学.模糊逻辑.1965,L. A. Zad ...

  4. 模糊聚类的代码实现python_Fuzzy C-Means(模糊C均值聚类)算法原理详解与python实现...

    目录 模糊理论 Fuzzy C-Means算法原理 算法步骤 python实现 参考资料 本文采用数据集为iris,将iris.txt放在程序的同一文件夹下.请先自行下载好. 模糊理论 模糊控制是自动 ...

  5. 模糊C均值聚类(Fuzzy C-means)算法(FCM)

    一.FCM算法简介 1.模糊集理论 L.A.Zadeh在1965年最早提出模糊集理论,在该理论中,针对传统的硬聚类算法其隶属度值非0即1的严格隶属关系,使用模糊集合理论,将原隶属度扩展为 0 到 1 ...

  6. php fuzzy,模糊C均值聚类算法(Fuzzy C-means)

    模糊c均值聚类与k均值聚类区别 k均值聚类 k均值聚类的实现中,把每个样本划分到单一的类别中,亦即是每个样本只能属于一种类别,不能属于多种类别.这样的划分,称为硬划分. 模糊c均值均类 为了解决硬划分 ...

  7. 具有自适应空间强度约束和隶属度链接的鲁棒模糊c均值聚类算法

    a b s t r a c t 实践证明,模糊C均值聚类方法是一种有效的图像分割方法.然而,对于噪声图像,FCM方法并不稳健且不太精确.提出了一种改进的FCM方法--FCM _ SICM法,用于噪声图 ...

  8. 模糊C均值聚类算法的实现

     模糊C均值聚类算法的实现 研究背景 聚类分析是多元统计分析的一种,也是无监督模式识别的一个重要分支,在模式分类 图像处理和模糊规则处理等众多领域中获得最广泛的应用.它把一个没有类别标记的样本按照 ...

  9. 【图像分割】直觉模糊C均值聚类的图像分割IFCM

    .模糊理论的介绍 在日常生活中,有许多事物或多或少都具有模糊性,模糊虽难以捉摸,但却非常重要.模糊理论强调以模糊逻辑来描述现实生活中的事物,以弥补二值逻辑无法对不明确定义边界事物描述的缺点.人类的自然 ...

  10. 灰狼算法 c语言 代码,基于灰狼优化的模糊C—均值聚类算法

    谢亮亮+刘建生+朱凡 摘要:针对模糊C-均值聚类算法(FCM)存在易受初始聚类中心影响和容易陷入局部最优的问题,提出了一种将灰狼优化算法(GWO)和模糊C-均值相结合的新聚类算法(GWO-FCM).该 ...

最新文章

  1. 黄聪:VS2010开发T4模版引擎之基础入门
  2. 搜狗浏览器收藏夹在哪_是时候换个快速安全的浏览器了,这一次它一定不负众望...
  3. 付费用户减少一成,阅文集团还能否为自己“造血”?
  4. spring aop JointPoint类
  5. centos 新装mysql 进入,centos5安装 mysql 提示需要用户及密码进入?Duplicate entry 'localhost-' for key 1...
  6. 英特尔多核联合实验室授牌仪式
  7. dephi(pascal)中修改Label字体的样式(加粗,斜体,下划线)
  8. ArcEngine二次开发API之Bug集(一 )
  9. 树莓派命令行连接蓝牙音箱及不出声问题
  10. Linux C基础笔记(2)
  11. POJ-3621 Sightseeing Cows 01分数(参数搜索)规划问题-最优比率环
  12. 基于PostgreSQL+Geoserver+OpenLayers的Webgis台风路径地图服务发布
  13. mac自带邮箱添加邮箱_如何在Mac上的Mail中创建或删除邮箱
  14. 大聊Python----Select解析
  15. jaffe 数据库百度网盘下载
  16. C语言每日一练——第159天:佩奇存钱方案
  17. [NAS] Synology (群晖) DSM 7.X 挂载NTFS硬盘
  18. Windows Server 2016 文件共享
  19. 深圳地区近期面试100多道题汇总(含超详细答案)
  20. vue的增删改查(elementUI)

热门文章

  1. Spotfire简介
  2. 浏览器HTML5 视频播放
  3. 【Axure原型分享】自动编号的中继器表格
  4. 计算机ppt实训报告总结,计算机实训总结模板
  5. html5 css3 JavaScript响应式中文静态网页模板js源代码
  6. 苹果画画软件_数位板可以连手机画画?有哪些好用的绘画APP?
  7. 基于C#和三菱PLC通过MX Component进行通信的具体方法
  8. JUnit 5预期异常
  9. gmp新附录 计算机系统,GMP新附录:计算机系统.doc
  10. 编译器设计(二)——上下文无关文法及推导