说明:FCM python 简单实现

在我看来,真正厉害的不是如何实现,而是怎么对这个问题求解,即我们利用的更新参数的公式是怎么来的。具体就得看原论文[4]了。

代码

from __future__ import division, print_function
import numpy as np
import matplotlib.pyplot as pltclass Data(object):def __init__(self):passdef generate(self):self.colors = ['b', 'orange', 'g', 'r', 'c', 'm', 'y', 'k', 'Brown', 'ForestGreen']# Define three cluster centerscenters = [[4, 2],[1, 7],[5, 6]]# Define three cluster sigmas in x and y, respectivelysigmas = [[0.8, 0.3],[0.3, 0.5],[1.1, 0.7]]# Generate test datanp.random.seed(42)  # Set seed for reproducibilityself.xpts = np.zeros(1)self.ypts = np.zeros(1)self.labels = np.zeros(1)# 伪造3个高斯分布,以u和sigma作为特征分布for i, ((xmu, ymu), (xsigma, ysigma)) in enumerate(zip(centers, sigmas)):self.xpts = np.hstack((self.xpts, np.random.standard_normal(200) * xsigma + xmu))self.ypts = np.hstack((self.ypts, np.random.standard_normal(200) * ysigma + ymu))self.labels = np.hstack((self.labels, np.ones(200) * i))return self.xpts, self.ypts, self.labelsdef visualize(self):# Visualize the test datafig0, ax0 = plt.subplots()for label in range(3):ax0.plot(self.xpts[self.labels == label], self.ypts[self.labels == label], '.',color=self.colors[label])ax0.set_title('Test data: 200 points x3 clusters.')# plt.show()class Fuzzy(object):def __init__(self, xpts, ypts, labels):self.xpts = xptsself.ypts = yptsself.labels = labelsdef _norm1(self, array):array = np.abs(array)return np.sum(array)def _normalize_rows(self, rows):normalized_rows = rows / np.sum(rows, axis=1, keepdims=1)return normalized_rowsdef cluster(self, classes, m = 2, niter = 1000, error = 1e-5):# init u# u = np.ones([len(self.labels), classes], dtype=np.float32) / 3n_data = self.xpts.shape[0]u = np.random.rand(n_data, classes)u = self._normalize_rows(u)self.x = np.array(zip(self.xpts, self.ypts))len_j = u.shape[1]c = np.zeros([len_j, 2], dtype=np.float32)for n in xrange(niter):# calculate c_jfor j in xrange(len_j):u_j = u[:, j]u_jm = u_j ** mnumer = np.dot(u_jm, self.x)deno = np.sum(u_jm)c[j] = numer / deno# update u_ku_new = np.zeros_like(u)data_size = self.x.shape[0]class_size = c.shape[0]for i in xrange(data_size):for j in xrange(class_size):numer = 0for k in xrange(c.shape[0]):temp = self._norm1(self.x[i] - c[j]) / self._norm1(self.x[i] - c[k])temp = temp ** (2 / (m-1))numer += tempu_new[i, j] = 1 / numer# check convergenceprint('FCM steps:', n)if(self._norm1(u - u_new) < error):break# update uu = u_new# return value and center predict = np.argmax(u, axis=1)return c, predictif __name__ == '__main__':# generate data data = Data()xpts, ypts, labels = data.generate()data.visualize()# fuzzy c meansfuzzy = Fuzzy(xpts, ypts, labels)center, predict_labels = fuzzy.cluster(classes=3, m=2, niter = 1000)# visualizecolors = ['b', 'orange', 'g', 'r', 'c', 'm', 'y', 'k', 'Brown', 'ForestGreen']fig, ax = plt.subplots()for i in xrange(3):ax.plot(xpts[predict_labels == i],ypts[predict_labels == i], '.',color=colors[i])for pt in center:ax.plot(pt[0], pt[1], 'rs')ax.set_title('clustering results')plt.show()

结果:

说明

主要实现一下fuzzy c means,理解其实现过程。
注意,fcm实现过程中degree of memerbership 矩阵UUU初始化需要满足三个条件[1].我在第一次初始化时直接给每个点属于每个类隶属度都设为相同的值,结果得到错误的结果。

后来参考了skfuzzy的初始化方式,即随机初始化,得到正确的结果。详情直接看源码。

参考

  1. A Tutorial on Clustering Algorithms
  2. skfuzzy demo
  3. skfuzzy
  4. 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

机器学习基础:模糊C均值聚类(Machine Learning Fundamentals: Fuzzy C-Means )Python实现相关推荐

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

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

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

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

  3. 模糊C均值聚类(FCM)算法介绍及其Python实现

    这篇文章是楼主老早之前做课后作业写的,如果有问题的话建议米娜桑自行解决哦~ 目录 一.理论介绍 二.算法实现思路 三.FCM算法核心代码的python实现 四.使用示例 1.对数据进行聚类 2.图片分 ...

  4. 基于模糊C均值聚类(FCM)的图像分割原理+python代码详解

    一.模糊 "模糊":一个元素可以不同程度的属于某几个子集,也就是说元素对于集合的隶属度可以在[0,1]上取连续值. 二.步骤 2.1步骤 翻译一下: S1:初始化参数:加权指数m, ...

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

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

  6. 【机器学习|数学基础】Mathematics for Machine Learning系列之图论(8):割边、割集、割点

    文章目录 前言 系列文章 3.2 割边.割集.割点 3.2.1 割边与割集 定理3.4 推论3.4 定理3.5 补充知识 定义3.3:割集 定义3.4 定理3.6 生成树与割集的对比 3.2.2 割点 ...

  7. 【机器学习|数学基础】Mathematics for Machine Learning系列之矩阵理论(14):向量范数及其性质

    目录 前言 往期文章 4.1 向量范数及其性质 4.1.1 向量范数的概念及P-范数 定义4.1 例1 向量的几种范数 4.1.2 n n n维线性空间 V V V上的向量范数等价性 定理4.1.1 ...

  8. 【机器学习|数学基础】Mathematics for Machine Learning系列之线性代数(20):用配方法化二次型为标准形

    目录 前言 往期文章 5.6 用配方法化二次型为标准形 题目一 题目二 结语 前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ଘ(੭ˊᵕˋ)੭ ...

  9. 【机器学习|数学基础】Mathematics for Machine Learning系列之线性代数(10):向量组及其线性组合

    文章目录 前言 往期文章 4.1 向量组及其线性组合 定义1 定义2 定理1 定义3 定理2 推论 举例 例 1 例2 定理3 小结 结语 前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文 ...

  10. 【机器学习|数学基础】Mathematics for Machine Learning系列之线性代数(21):正定二次型

    目录 前言 往期文章 5.7 正定二次型 定理9:惯性定理 定义10 定理10 推论 定理11:赫尔维茨定理 举例 例17 结语 前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的 ...

最新文章

  1. PHP5中的stdClass
  2. 利用反射,泛型,静态方法快速获取表单值到Model。
  3. [Jsp] JSP和Servlet页面间的参数的传递和接收
  4. 数据结构 - 树形选择排序 (tree selection sort) 具体解释 及 代码(C++)
  5. cesium添加填充_Cesium中级教程1 - 空间数据可视化(一)
  6. mfc点击按钮让对话框关闭_WinXP系统开始菜单中关机按钮消失的恢复教程
  7. telnet后为啥打开的时防火墙_飞机起降时为啥要打开遮光板?机餐为啥总觉得不好吃?答案看这里...
  8. TurboMail邮件服务器帮你应付电子邮件归档危机
  9. c语言枪图形,6个变态的C语言Hello World程序[转载]
  10. win11如何下载游戏版 Windows11下载游戏版的步骤方法
  11. dda c语言计算机图形学,计算机图形学 DDA算法中点画线算法Bresen
  12. Cisco Packet Tracer交换机划分VLAN
  13. 【STM32H7的DSP教程】第5章 Matlab简易使用之常用编程语句
  14. 计网-基于Cisco模拟器
  15. 思科交换机配置【串口初始配置】
  16. android qq语音按钮,qq语音设置怎么操作?手机qq语音设置在哪里
  17. EI CCIE企业基础架构技术 什么是DNAC ?-IELAB
  18. C语言里栈和堆的区别整理
  19. HTTP 404 错误 的具体意思
  20. HTML基础(五)——a标签

热门文章

  1. 解决eclipse/myeclipse导入项目时出现红色叹号的方法
  2. [转]一个程序员的奋斗历程
  3. 【leetcode_easy】538. Convert BST to Greater Tree
  4. c# winform 全角自动转化半角问题(C#中ImeMode的值):转载
  5. 操作cookies值
  6. 2013-07-23 IT 要闻速记快想
  7. PL/SQL Developer使用笔记
  8. Codeforces 700 C. Break Up(Tarjan求桥)
  9. bzoj3551 [ONTAK2010]Peaks加强版(Kruskal重构树+主席树)
  10. ES6--async函数