快速学习一个算法--Fuzzy C Means聚类
聚类是一种无监督机器学习算法,它根据共享属性等标准将相似的数据点分组在一起。每个簇都有与簇中其他数据点相似的数据点,而作为一个整体,簇与其他数据点不同。通过利用聚类算法,我们可以发现数据中隐藏的结构、模式和相关性。Fuzzy C Means (FCM) 是各种聚类算法中的一种。它之所以成为一种强大的聚类技术,是因为它可以处理复杂、重叠的簇。今天云朵君和大家一起通过这篇文章更好地理解这种技术。
了解模糊 C 均值是什么。 了解模糊 C 均值算法的工作原理。 能够区分模糊 C 均值和 K 均值。 学习使用 Python 实现模糊 C 均值。
什么是Fuzzy C Means?
Fuzzy C Means(模糊 C 均值)是一种软聚类技术,其中每个数据点被分配一个聚类以及它在该聚类中的概率。
但是等等!什么是软聚类?
在了解模糊 C 均值之前,让我们先了解软聚类的含义以及它与硬聚类有何不同。
硬聚类和软聚类是将数据点划分为簇的两种不同方法。硬聚类也称为清晰聚类,根据某些标准(例如数据点与簇中心的接近程度)将每个数据点精确地分配给一个簇。它会产生不重叠的簇。K-Means 就是硬聚类的一个例子。
软聚类,也称为模糊聚类或概率聚类,为每个数据点分配一定程度的成员资格/概率值,这些值表示数据点属于每个聚类的可能性。软聚类允许表示可能属于多个聚类的数据点。模糊 C 均值和高斯混合模型是软聚类的示例。
模糊 C 均值的工作原理
现在我们清楚了硬聚类和软聚类的区别,让我们了解模糊 C 均值算法的工作原理。
如何运行 FCM 算法
初始化:从数据集中随机选择并初始化聚类质心,并指定模糊度参数(m)来控制聚类中的模糊度。 成员更新:使用距离度量(例如:欧几里得距离)根据每个数据点到聚类质心的距离计算每个数据点对每个聚类的成员程度。 质心更新:更新质心值,并根据更新的成员资格值重新计算聚类质心。 收敛检查:重复步骤2和3,直到达到指定的迭代次数或成员值和质心收敛到稳定值。
模糊 C 均值背后的数学原理
在传统的 K-means 算法中,我们通过以下步骤进行数学求解:
根据 k 值随机初始化聚类中心。 使用距离度量计算到每个质心的距离。例如:欧几里得距离、曼哈顿距离。 将聚类分配给每个数据点,然后形成 k 聚类。 对于每个聚类,计算属于该聚类的数据点的平均值,然后更新每个聚类的质心。 更新直到质心不再改变或者预定义次数的迭代结束。
但在模糊 C 均值中,算法有所不同。
1.我们的目标是最小化目标函数,如下所示:
n = 数据点的数量
c = 聚类数
x = 'i' 数据点
v = 'j' 簇的质心
w = 第 i 个数据点对于第 j 个聚类的隶属度值
m = 模糊性参数(m>1)
使用以下公式更新会员值:
使用数据点的加权平均值更新聚类质心值:
不断更新成员值和聚类中心,直到成员值和聚类中心不再发生显著变化或达到预定义的迭代次数。 将每个数据点分配给其具有最高成员值的集群或多个集群。
模糊 C 均值与 K 均值有何不同?
这两种聚类算法都存在一些差异。其中包括:
| Fuzzy C Means | K-Means |
|---|---|
| 每个数据点被分配到各个聚类的一定隶属度,表示该点属于各个聚类的概率或可能性。 | 每个数据点根据最近的质心(通常使用欧几里得距离确定)被专门分配给一个且仅一个聚类。 |
| 它不对聚类的形状或方差施加任何限制。它可以处理不同形状和大小的聚类,从而使其更加灵活。 | 它假设簇是球形的,且方差相等。因此,它可能无法很好地处理非球形或大小各异的簇。 |
| 由于它允许软的、概率的聚类分配,因此对噪声和异常值不太敏感。 | 对数据中的噪声和异常值很敏感 |
使用 Python 实现 FCM
现在使用 Python 实现模糊 C 均值。
数据集:mall_customers.csv · GitHub[1]
!pip install scikit-fuzzy
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import skfuzzy as fuzz
from sklearn.preprocessing import StandardScaler###Load and explore the dataset
data = pd.read_csv("/content/mall_customers.csv")
# Display the first few rows of the dataset and check for missing values
print(data.head(),"\n")
print(data.info())
# Preprocess the data
X = data[['Annual Income (k$)', 'Spending Score (1-100)']].values
print(X)
# Scale the features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(X_scaled)
#Apply Fuzzy C Means clustering
n_clusters = 5 # Number of clusters
m = 2 # Fuzziness parameter
cntr, u, u0,d,jm,p, fpc = fuzz.cluster.cmeans(
X_scaled.T, n_clusters, m, error=0.005, maxiter=1000, init=None
)
# Visualize the clusters
cluster_membership = np.argmax(u, axis=0)
plt.figure(figsize=(8, 6))
for i in range(n_clusters):
plt.scatter(X[cluster_membership == i, 0], X[cluster_membership == i, 1], label=f'Cluster {i+1}')
plt.scatter(cntr[0], cntr[1], marker='x', color='black', label='Centroids')
plt.title('Fuzzy C-Means Clustering on Mall Customer Data')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.grid(True)
plt.show()
备注:
dagta:输入数据矩阵,其中每行代表一个数据点,每列代表一个特征。 clusters:要形成的簇的数量。 m:模糊度指数,控制聚类的模糊程度。 error:终止标准指定连续迭代之间分割矩阵 (u) 的最小变化。如果变化低于此阈值,算法终止。 maxiter:算法收敛的最大迭代次数。如果算法未在此限制内收敛,则会提前终止。 init:初始聚类中心。如果为 None,则使用随机初始化。
该函数返回以下内容:
u:最终的模糊分割矩阵,其中每个元素 u[i, j] 表示隶属度。 u0:初始模糊分割矩阵。 d:最终的距离矩阵,其中每个元素 d[i, j] 表示第 i 个数据点和第 j 个聚类质心之间的距离。 jm:算法每次迭代时的目标函数值。 p:算法执行的最终迭代次数。 fpc:模糊分割系数(FPC),衡量聚类解决方案的质量。
输出:
FCM 的应用
以下是 FCM 算法最常见的 5 种应用:
图像分割:根据像素强度将图像分割为有意义的区域。 模式识别:识别具有复杂关系的数据集中的模式和结构。 医学成像:分析医学图像以识别感兴趣的区域或异常。 客户细分:根据客户的购买行为对客户进行细分。 生物信息学:聚类基因表达数据以识别具有相似功能的共表达基因。
FCM 的优点和缺点
现在,让我们讨论一下使用模糊 C 均值的优点和缺点。
优点
对噪声的鲁棒性:与传统的聚类算法相比,FCM 对异常值和噪声的敏感度较低。 软分配:提供软的、概率的分配。 灵活性:可以适应重叠的集群和不同程度的集群成员。
缺点
对初始化的敏感性:性能对聚类质心的初始位置很敏感。 计算复杂性: FCM 的迭代特性会增加计算费用,尤其是对于大型数据集而言。 参数选择:选择适当的参数值,例如模糊性参数(m)会影响聚类结果的质量。
写在最后
模糊 C 均值是一种聚类算法,它非常多样化,在揭示数据中隐藏的含义(以模式的形式)方面非常强大,为处理复杂数据集提供了灵活性。与 k 均值算法相比,它可以被认为是一种更好的算法。通过了解其原理、应用、优势和局限性,数据科学家和从业者可以有效地利用这种聚类算法从他们的数据中提取有价值的见解,从而做出明智的决策。
关键点:
Fuzzy C Means 是一种软聚类技术,允许概率聚类分配,与 K-Means 等硬聚类算法的独占分配形成对比。 它迭代地更新聚类成员和质心,最小化目标函数以实现收敛并发现复杂、重叠的聚类。 与 K-Means 不同,FCM 由于采用概率方法,对噪声和异常值不太敏感,因此适用于具有多变结构的数据集。 使用 scikit-fuzzy 等库的 Python 实现 FCM 使从业者能够将该技术有效地应用于现实世界的数据集,从而促进数据分析和决策。
参考资料
mall_customers.csv · GitHub: https://gist.github.com/ryanorsinger/cb1222e506c1266b9cc808143ddbab82
🏴☠️宝藏级🏴☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫 等,从入门到进阶!
长按👇关注- 数据STUDIO -设为星标,干货速递