FCM算法实现Python(简洁版)

FCM算法实现Python(简洁版)FCM 算法全名为 FuzzyC Means 是一种聚类算法 Fuzzyc means FCM isamethodofc Thismethod developedbyD

FCM算法

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

  • 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

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

J m = ∑ i = 1 N ∑ j = 1 C u i j m ∣ ∣ x i − c j ∣ ∣ 2 J_m = \sum^{N}_{i=1}{\sum^{C}_{j=1}{u_{ij}^m||x_i-c_j||^2}} Jm=i=1Nj=1Cuijm∣∣xicj2

  • m是任何大于1的实数
  • u i j u_{ij} uij x i x_i xi在类j上隶属度
  • 其中 x i x_i xi是第i个d维测量向量
  • c j c_j cj是一个d维的类中心

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

迭代终点一般选取两个:

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

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

算法流程

  1. 初始化矩阵U (描述每个点在不同的类中的概率)
  2. 通过U算类中心
    C j = ∑ i = 1 N u i j m ∗ x i ∑ i = 1 N u i j m C_j=\frac{\sum^{N}_{i=1}{u_{ij}^m * x_i}}{\sum^{N}_{i=1}{u_{ij}^m}} Cj=i=1Nuijmi=1Nuijmxi

  3. 更新U,通过之前算出来的类中心
    u i j = 1 ∑ k = 1 C ( ∣ ∣ x i − c j ∣ ∣ ∣ ∣ x i − c k ∣ ∣ ) 2 m − 1 u_{ij} = \frac{1}{\sum^{C}_{k=1}{(\frac{||x_i-c_j||}{||x_i-c_k||})^{\frac{2}{m-1}}}} uij=k=1C(∣∣xick∣∣∣∣xicj∣∣)m121

  4. 如果u变化的无穷范小于某个值的时候,就停下来,否者就转到第2步

Python 实现

import numpy as np def 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  m Centroids = 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: break membership_mat = new_membership_mat return np.argmax(new_membership_mat, axis=1) 
  • 终止条件那个可以再优化下,但基本框架就是这样。

使用:

  • 导入数据:
from sklearn import datasets iris = 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 += 1 elif y[i] == y[j] and t[i] != t[j]: b += 1 elif y[i] != y[j] and t[i] == t[j]: c += 1 elif y[i] != y[j] and t[i] != t[j]: d += 1 return a, b, c, d def external_index(a, b, c, d, m): JC = a / (a + b + c) FMI = np.sqrt(a2 / ((a + b) * (a + c))) RI = 2 * ( a + d ) / ( m * (m + 1) ) return JC, FMI, RI def 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.98429, 0.2245, 0.48345)

  • 画图
from sklearn.decomposition import PCA import numpy as np import matplotlib.pyplot as plt X_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更加稳定(很多,很多倍)。

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212522.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午7:52
下一篇 2026年3月18日 下午7:52


相关推荐

  • 查看linux服务器硬件信息,(Linux系统)查看服务器硬件信息命令

    查看linux服务器硬件信息,(Linux系统)查看服务器硬件信息命令前言有的时候我们会对服务器的一些硬件进行有指向性的查看 于是便总结了下方的一些 Linux 系统查看服务器各种硬件信息的命令 一 查看 CPU 1 查看 CPU 型号 cat proc cpuinfo grepname cut f2 d uniq c 注意 得到的第一个信息为 总逻辑 CPU 数总逻辑 CPU 数 物理 CPU 个数 X 每颗物理 CPU 的核数 X 超线程数 2 查看物理 CPU

    2026年3月26日
    1
  • redis从入门到高可用 Redis复制的原理与优化

    redis从入门到高可用 Redis复制的原理与优化

    2021年11月9日
    46
  • Linux高性能server规划——多进程编程

    Linux高性能server规划——多进程编程

    2022年1月15日
    40
  • windows 怎样关闭redis

    windows 怎样关闭redis

    2021年10月16日
    205
  • 十二平均律的数学描述

    十二平均律的数学描述十二平均律的数学描述 mywang 年 9 月 28 日 1 声音的物理特性声音的本质 是空气的震动 人听到外界的声音大致需要经历以下几个步骤 发声体 例如人的声带 各种乐器 发生特定的震动 也包括了发声体内部的空气的震动 这种震动有时会呈现出一定的规律性 例如形成乐音的震动一般具有固定的震动频率 震动的发声体带动了其表面的空气 使空气也产生了与发声体震动方式相似的震动 这种

    2026年3月19日
    1
  • biee java_BIEE入门篇之一 BIEE的安装

    biee java_BIEE入门篇之一 BIEE的安装最早拿到的安装文件的时候 其实是 Siebel7 8 安装界面如下 安装也比较麻烦 安装了 Siebel 之后 还需要安装 tomcat 当然没装 jdk 那还得首先装 jdk 才行 由于不是免费产品 所以在安装前需要获得一个授权文件 这个文件一般不掏钱是拿不到的 登录界面如下 当时觉得 Siebel 不愧是 CRM 领域的专家 其产品在可用性上做的还是不错 起码效果很足 可以在 Web 界面上随意的托拽 图形 曲线 图表

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号