Fuzzy C Means 算法及其 Python 实现——写得很清楚,见原文

Fuzzy C Means 算法及其 Python 实现

1. K-Means 算法向 FCM 算法的扩展

在 K-Means 算法中,如果要将数据集合 X={ X_1,X_2,X_3,dots,X_n } 划分为 k\,(1 le k le n) 个类,使得任意数据对象 X_i 必须属于并且仅属于一个类,同时每一个类至少包含一个数据对象,那么可以用一个 k	imes n 的矩阵 U 来表示,矩阵中的任意一个元素 u_{ij} 可以表示为:

  [{u_{ij}} = left{ egin{cases}  1& {X_i in G_j}  \  0& {X_i 
otin G_j} end{cases} 
ight.]

其中 {G_j}left( {j = 1,2, ldots ,k} 
ight) 表示第 j 个类。并且 U 需要满足如下条件 (1 le i le k,\,1 le j le n)

  [left{ egin{cases}  {u_{ij}} in {0,1}  \  sumlimits_{i = 1}^k {{u_{ij}}} = 1  \  sumlimits_{j = 1}^n {{u_{ij}}} > 0 end{cases} 
ight.]

如果上述矩阵 U 中的元素 u_{ij} 的取值范围不仅仅是 0 或者 1,那么就可以推广到模糊集合上的划分,U 就变成了模糊判定矩阵。此时 {u_{ij}} 需满足:

(1) egin{equation*}  left{ egin{cases}  {u_{ij}} in [ 0,1 ]}  \  sumlimits_{i = 1}^k {{u_{ij}}} = 1  \  sumlimits_{j = 1}^n {{u_{ij}}} > 0 end{cases} 
ight. end{equation*}

2. 目标函数与聚类中心

K-Means 算法在度量数据对象的非相似性(或者说距离)时一般使用欧几里得距离,要求每个类的聚类中心与数据对象的距离平方之和最小,目标函数可以表示为:

  [J = sumlimits_{i = 1}^k {sumlimits_{j = 1}^n {s_{ij}^2} }]

  [{s_{ij}} = Eculid({C_i},{X_j})]

其中 C_i 表示任意聚类中心,而聚类中心一般取类内所有对象在各属性上的平均值,因此可以表示为:

  [{C_i} = frac{{sumlimits_{j,{X_j} in {G_i}} {{X_j}} }}{{sumlimits_{j = 1}^n {{u_{ij}}} }}]

{G_i}{kern 1pt} left( {1 le i le k} 
ight) 表示任意一个类。

将算法推广到模糊集后,Dunn 对样本与类中心之间的距离采用隶属度的平方来加权,Bezdek 则进一步引入了隶属度的加权指数 m 从而得到了新的目标函数:

(2) egin{equation*}  J = sumlimits_{i = 1}^k {sumlimits_{j = 1}^n {{{left( {{u_{ij}}} 
ight)}^m}s_{ij}^2} } end{equation*}

要使得 (2) 式达到最小值则要求聚类中心 C_i 和隶属度 u_{ij} 满足如下条件:

(3) egin{equation*}  {C_i} = frac{{sumlimits_{j = 1}^n {u_{ij}^m{X_j}} }}{{sumlimits_{j = 1}^n {u_{ij}^m} }} end{equation*}

(4) egin{equation*}  {u_{ij}} = frac{1}{{sumlimits_{l = 1}^k {{{left( {frac{{{u_{ij}}}}{{{u_{lj}}}}} 
ight)}^{2/left( {m - 1} 
ight)}}} }} end{equation*}

3. FCM 算法计算过程

见原文和代码实现

原文地址:https://www.cnblogs.com/bonelee/p/7229752.html