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

一、聚类

        聚类的定义: 将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其它簇中的对象相异。聚类分析起源于分类学,但是聚类不等于分类。聚类与分类的不同在于,聚类所要求划分的类是未知的。

        聚类可以是硬聚类,也可以是软聚类。 在硬聚类中,每个对象被确定地归入一个簇;在软聚类中,每个对象与每个簇都存在一定的从属程度(隶属度),只不过该程度有大有小。

        本博客主要为大家讲解软聚类中的模糊C均值聚类(Fuzzy C-means Clustering, FCM)。

二、模糊C均值聚类

        模糊C均值聚类(Fuzzy C-means Clustering, FCM),是一种引入模糊理论的聚类算法。在该算法中,用隶属度来表示一个样本属于某一类的概率,因为在许多情况下,多个类别的界限并不绝对。相比于如K-means的硬聚类,FCM得到的聚类结果更加灵活。

        FCM通过最小化如下目标函数来实现聚类。
        在这里插入图片描述
        在这里插入图片描述

        其中,N表示样本个数,C表示聚类中心个数,m是一个隶属度因子,可以取2,3等的值,表示样本属不属于某类的重要程度,uij表示样本i对于类j的隶属度。
        由第一个公式可知,目标函数由相应样本的隶属度与该样本到各个类中心的距离相乘组成。第二个公式主要在说,样本对各个类的隶属度之和要为1。
       具体地,目标函数的优化过程可点这里查看。不过,如果你的目的是“会用就行”,那么也可以不看这个优化推导过程,直接看本博客第三部分吧。

三、模糊C均值聚类的Python实现

1.首先安装【scikit-fuzzy】包,具体命令如下:(注,笔者先进入自己的虚拟环境,然后安装的该包。)

在这里插入图片描述

2.调用模糊C均值函数cmeans对100个样本点进行模糊聚类,代码如下:

import numpy as np
import matplotlib; matplotlib.use('TkAgg')
from skfuzzy.cluster import cmeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt



color = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] # 为7个类别设置了7种颜色
x = 10 * np.random.rand(100, 2) # (100, 2) 100个二维坐标 即100个样本点


# 调用模糊C均值聚类函数cmeans
center, u, u0, d, jm, p, fpc = cmeans(x.T, m=2, c=7, error=0.5, maxiter=10000)
"""
输入信息:
x.T为待聚类样本。这里需要注意格式,其形状是类似于(特征数目,样本个数),与很多训练样本数据的形状正好是相反的。
m为隶属度指数,是一个加权指数。
c为待指定的聚类个数。
error指当隶属度的变化小于此时提前迭代结束。
maxiter表示最大迭代次数
"""

"""
输出信息:
center为聚类的中心 7*2
u为隶属度矩阵 7*100
u0为初始化的隶属度矩阵 7*100
d为每个数据点到各个中心的欧氏距离矩阵 7*100
jm是目标函数的优化历史
p是迭代的次数
fpc全称是fuzzy partition coefficient,是一个评价分类好坏的指标。它的范围是0到1,1是效果最好,后面可以通过它来选择聚类的个数。
"""
label = np.argmax(u,axis=0) # 根据最大隶属度来确定所属类别

plt.rcParams['font.sans-serif']=['SimHei'] # 使得plt可以显示中文
ex = ['第一类','第二类','第三类','第四类','第五类','第六类','第七类']
for i,col in enumerate(list('bgrcmyk')):
    plt.scatter([],[],c=col,label=ex[i]) # 绘制散点
plt.legend(loc='upper right') # 在右上角创建图例


for i in range(100): # 100为样本数
    plt.plot(x[i, 0], x[i, -1], color[label[i]] + 'o')

# 关于plt.xticks和plt.yticks的用法可参考
# https://blog.csdn.net/weixin_50345615/article/details/126193271
# 总之,plt绘制图像默认坐标轴仅显示偶数刻度及其对应的文本标签
# plt.xticks(range(-20,20,1)) # 修改横坐标刻度
# plt.yticks(range(-20,20,1)) # 修改纵坐标刻度

# plt.xlabel('x') # 设置横坐标的标签
# plt.ylabel('y') # 设置纵坐标的标签

plt.title('FCM') # 设置图像的标题
plt.savefig(r'.\fcm.jpg',format='jpg') # 保存聚类结果图
plt.show() # 展示图像
# 如果plt.show()不显示图像,则参考网址https://blog.csdn.net/qq_28019591/article/details/89404773进行解决

3.结果展示
在这里插入图片描述

4.相关说明

上面这个代码,主要是 随机创建了100个二维样本点,然后使用FCM将这100个样本点分为7类,并绘制可视化图。笔者在代码里详细注释了cmeans函数的输入、输出参数,及绘制可视化图过程中的各个语句含义。希望大家动手实践一下,真的很容易理解!

四、参考链接

模糊C均值聚类的介绍1:https://blog.csdn.net/coolyuan/article/details/107515224

模糊C均值聚类的介绍2:https://blog.csdn.net/weixin_48241292/article/details/110291536

cmeans函数介绍:https://blog.csdn.net/FrankieHello/article/details/79581315

cmeans函数实战:https://blog.csdn.net/qq_39709813/article/details/106895486

最后,如果本文对您有所帮助,欢迎关注博主主页,并订阅本专栏。本专栏主要记录笔者在写论文过程中编写的各种可视化代码,例如聚类可视化、混淆矩阵的可视化等,欢迎大家订阅!

  • 0
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用Python实现模糊C均值聚类算法的示例代码: ```python import numpy as np class FuzzyCMeans: def __init__(self, n_clusters=2, max_iter=100, m=2, error=1e-5): self.n_clusters = n_clusters self.max_iter = max_iter self.m = m self.error = error def fit(self, X): n_samples, n_features = X.shape # 初始化隶属度矩阵U U = np.random.rand(n_samples, self.n_clusters) U = np.divide(U, np.sum(U, axis=1)[:, None]) iter_num = 0 while iter_num <= self.max_iter: # 计算聚类中心 centroids = np.dot(U.T, X) / np.sum(U, axis=0)[:, None] # 计算距离矩阵D D = np.zeros((n_samples, self.n_clusters)) for i in range(self.n_clusters): D[:, i] = np.linalg.norm(X - centroids[i], axis=1) # 更新隶属度矩阵U U_old = U.copy() U = np.power(D, -2/(self.m-1)) U = np.divide(U, np.sum(U, axis=1)[:, None]) # 判断是否收敛 if np.linalg.norm(U - U_old) < self.error: break iter_num += 1 self.centroids = centroids self.U = U return centroids, U if __name__ == '__main__': X = np.random.rand(100, 2) fcm = FuzzyCMeans(n_clusters=2) centroids, U = fcm.fit(X) print('聚类中心:\n', centroids) print('隶属度矩阵:\n', U) ``` 在上述代码中,我们首先定义了一个名为`FuzzyCMeans`的类,它包含了模糊C均值聚类算法的初始化函数和拟合函数。其中,初始化函数中设置了聚类数量、最大迭代次数、模糊指数和误差阈值等参数。拟合函数则接收一个数据矩阵`X`作为输入,输出聚类中心和隶属度矩阵。 在拟合函数中,我们首先对隶属度矩阵进行了初始化,并在循环中不断更新聚类中心和隶属度矩阵,直到满足误差阈值或达到最大迭代次数为止。最终,我们返回了聚类中心和隶属度矩阵两个结果。 在代码的最后,我们生成了一个随机的二维数据矩阵,并使用上述代码进行了聚类

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信小海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值