FCM算法

关于聚类的所有项目都放到了这个上面

  • https://github.com/Sean16SYSU/MachineLearningImplement/tree/master/Clustering

全名为Fuzzy C-Means,是一种聚类算法。

Fuzzy c-means (FCM) is a method of clustering which allows one piece of data to belong to two or more clusters. This method (developed by Dunn in 1973 and improved by Bezdek in 1981) is frequently used in pattern recognition. It is based on minimization of the following objective function:
FCM是一种聚类的方法,可以允许一个数据属于两个或以上的类。这种方法(由Dunn在1973年提出,由Bezdek在1981年改进。)被频繁地用于模式识别。

  • J. C. Dunn (1973): “A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters”, Journal of Cybernetics 3: 32-57
  • J. C. Bezdek (1981): “Pattern Recognition with Fuzzy Objective Function Algoritms”, Plenum Press, New York

基于最小化下面的目标函数:

Jm=∑i=1N∑j=1Cuijm∣∣xi−cj∣∣2J_m = \sum^{N}_{i=1}{\sum^{C}_{j=1}{u_{ij}^m||x_i-c_j||^2}}Jm​=i=1∑N​j=1∑C​uijm​∣∣xi​−cj​∣∣2

  • m是任何大于1的实数
  • uiju_{ij}uij​是xix_ixi​在类j上隶属度
  • 其中xix_ixi​是第i个d维测量向量
  • cjc_jcj​是一个d维的类中心

FCM主要通过迭代更新u和c来得到最终的解。

迭代终点一般选取两个:

  • 当u变化的无穷范数小于某个值时
  • 当迭代次数达到某个极限时候

这个过程可能会收敛到局部最小值或者是鞍点上

算法流程

  1. 初始化矩阵U (描述每个点在不同的类中的概率)
  2. 通过U算类中心
    Cj=∑i=1Nuijm∗xi∑i=1NuijmC_j=\frac{\sum^{N}_{i=1}{u_{ij}^m * x_i}}{\sum^{N}_{i=1}{u_{ij}^m}}Cj​=∑i=1N​uijm​∑i=1N​uijm​∗xi​​
  3. 更新U,通过之前算出来的类中心
    uij=1∑k=1C(∣∣xi−cj∣∣∣∣xi−ck∣∣)2m−1u_{ij} = \frac{1}{\sum^{C}_{k=1}{(\frac{||x_i-c_j||}{||x_i-c_k||})^{\frac{2}{m-1}}}}uij​=∑k=1C​(∣∣xi​−ck​∣∣∣∣xi​−cj​∣∣​)m−12​1​
  4. 如果u变化的无穷范小于某个值的时候,就停下来,否者就转到第2步

之前也写过这个算法,当时是用其他用途有点赶,就没有仔细研究。
现在自己仔细研究了一轮之后,实现了这个算法,大概只用20行左右就可以完成这个算法FCM,相比之前的在github上看到的100行左右的代码,这个简直可以说是改进大了很多。

Python 实现

import numpy as npdef FCM(X, c_clusters=3, m=2, eps=10):membership_mat = np.random.random((len(X), c_clusters))membership_mat = np.divide(membership_mat, np.sum(membership_mat, axis=1)[:, np.newaxis])while True:working_membership_mat = membership_mat ** mCentroids = np.divide(np.dot(working_membership_mat.T, X), np.sum(working_membership_mat.T, axis=1)[:, np.newaxis])n_c_distance_mat = np.zeros((len(X), c_clusters))for i, x in enumerate(X):for j, c in enumerate(Centroids):n_c_distance_mat[i][j] = np.linalg.norm(x-c, 2)new_membership_mat = np.zeros((len(X), c_clusters))for i, x in enumerate(X):for j, c in enumerate(Centroids):new_membership_mat[i][j] = 1. / np.sum((n_c_distance_mat[i][j] / n_c_distance_mat[i]) ** (2 / (m - 1)))if np.sum(abs(new_membership_mat - membership_mat)) < eps:breakmembership_mat =  new_membership_matreturn np.argmax(new_membership_mat, axis=1)
  • 终止条件那个可以再优化下,但基本框架就是这样。

使用:

  • 导入数据:
from sklearn import datasetsiris = datasets.load_iris()
  • 评估
def evaluate(y, t):a, b, c, d = [0 for i in range(4)]for i in range(len(y)):for j in range(i+1, len(y)):if y[i] == y[j] and t[i] == t[j]:a += 1elif y[i] == y[j] and t[i] != t[j]:b += 1elif y[i] != y[j] and t[i] == t[j]:c += 1elif y[i] != y[j] and t[i] != t[j]:d += 1return a, b, c, ddef external_index(a, b, c, d, m):JC = a / (a + b + c)FMI = np.sqrt(a**2 / ((a + b) * (a + c)))RI = 2 * ( a + d ) / ( m * (m + 1) )return JC, FMI, RIdef evaluate_it(y, t):a, b, c, d = evaluate(y, t)return external_index(a, b, c, d, len(y))
  • 测试
test_y = FCM(iris.data)
  • 得到评估
evaluate_it(iris.target, test_y)

对于这三个指数来说,效果高了很多。

(0.7487508922198429, 0.856326530612245, 0.8935099337748345)

  • 画图
from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as pltX_reduced = PCA(n_components=2).fit_transform(iris.data)
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=test_y, cmap=plt.cm.Set1)

  • 原图:
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=iris.target, cmap=plt.cm.Set1)

图片上也能看到效果比其他的都要好,而且,经过测试发现,FCM算法会比KMeans更加稳定(很多,很多倍)。

FCM算法实现Python(简洁版)相关推荐

  1. 美团、大众点评 token最新算法——宇宙第一简洁版

    人怂话不多,直接上代码 token有效时间只有几十秒,每次调用直接生成,原理网上一大堆,我这个为宇宙第一简洁版 import base64, zlib, time info = str({" ...

  2. 各省新高考等级赋分算法实现——python版

    各省新高考等级赋分算法实现--python版 一.前言 新高考从2014年启动,目前已经有14个地区(省.市)实行了新高考改革分别是:浙江.上海.北京.山东.天津.海南.湖南.广东.江苏.重庆.河北. ...

  3. python影视数据爬虫sqlite源码+论文(完整版和简洁版)

    python影视数据爬虫sqlite源码+论文(完整版和简洁版)-99源码网,程序代做,代写程序代码,代写编程,代写Java编程,代写php编程,计算机专业代做,计算机毕业设计,网站建设,网站开发,程 ...

  4. 聚类算法及python实现——模糊C均值(FCM)

    聚类算法及python实现--模糊C均值(FCM) 模糊C和K均值的区别 K均值:硬聚类,隶属度只有0和1,基于"类内误差平方和最小化"原则 模糊C:模糊聚类,隶属度取值为[0,1 ...

  5. GMM算法(python版)

    原 [machine learning]GMM算法(Python版) 一.GMM模型 事实上,GMM 和 k-means 很像,不过 GMM 是学习出一些概率密度函数来(所以 GMM 除了用在 clu ...

  6. 算法第一期:汉诺塔问题(python通俗易懂版)

    问题描述: 汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面 ...

  7. 你说的每一句我都记着,还带时间呢:简洁版纪念日

    胡言 上一篇博客弄的纪念日界面本来打算不弄后端的了,但是想了想这算是最后一个tkinter程序吧,以后将不再更新这专栏的内容,当然对这专栏有兴趣的同学可以翻翻以前的博客,我记得应该有好几个小项目了,练 ...

  8. 数据结构与算法(Python)【PKU MOOC】

    数据结构与算法(Python) 一. Python数据类型的性能 1.list 列表 列表list所包含的方法 #1 添加: list.append(a_new_element) #在列表末尾添加新的 ...

  9. 推荐:常见算法的python实现(github上25000多star)

    近日在github上发现一个25000多star的仓库,把各种常见算法用python实现了,而且还有动图演示,非常值得推荐. 仓库说明 这个仓库用python语言实现了绝大部分算法,主要是用于教学目的 ...

最新文章

  1. linux shell find命令 查找指定时间范围内的文件
  2. PyTorch随笔-3
  3. struct类型重定义 不同的基类型_汇总贴:STEP7的复杂数据类型有哪些?
  4. Win7 SP1 安装SQL Server 2012时提示“此计算机上的操作系统不符合 SQL Server 2012的最低要求”...
  5. VigiBase中搜索和眼病相关的统计数据
  6. oracle 删除重复记录
  7. 朱恒志20135314实验2 实验报告
  8. linux下C语言获取微秒级时间
  9. 浅谈csdn写博客几年来的感受———已结题
  10. windows cmd命令杀进程
  11. Unity lua行为树实现(可实现rpg挂机自动战斗)
  12. python -- 计算 平方、乘方、平方根_python如何求平方
  13. excel两列数据对比找不同_怎么在excel中对比两列数据并查找重复项?
  14. 原则与思维模型--《思维模型》2
  15. 实现网站的-浏览器的favicon.ico
  16. 关于在终端使用pip命令命令
  17. logo在线生成怎么操作?手机也能轻松生成
  18. 汉诺塔(河内塔)问题
  19. IE9,10收藏夹同步方法
  20. ant-vue实现上传excel文件并解析内容

热门文章

  1. android 填满手机磁盘空间方法
  2. 企业网站制作要以简约为主
  3. Spring MVC之异常处理
  4. AGG第三十五课 gsv_text 渲染ASCII字符
  5. SQL 基础之用户角色日常操作(十六)
  6. 用Python玩转词云
  7. 程序局部性原理的一些思考
  8. HashMap和Hashtable
  9. 完美的代价 c语言,蓝桥杯基础练习 完美的代价
  10. MapReduce基础开发之四参数传递