FCM算法与K-means 算法

FCM算法

一.原理介绍

模糊C均值(Fuzzy C-means)算法简称FCM算法,是一种基于目标函数的模糊聚类算法,主要用于数据的聚类分析。理论成熟,应用广泛,是一种优秀的聚类算法。

首先介绍一下模糊这个概念,所谓模糊就是不确定,确定性的东西是什么那就是什么,而不确定性的东西就说很像什么。比如说把20岁作为年轻不年轻的标准,那么一个人21岁按照确定性的划分就属于不年轻,而我们印象中的观念是21岁也很年轻,这个时候可以模糊一下,认为21岁有0.9分像年轻,有0.1分像不年轻,这里0.9与0.1不是概率,而是一种相似的程度,把这种一个样本属于结果的这种相似的程度称为样本的隶属度,一般用u表示,表示一个样本相似于不同结果的一个程度指标。

基于此,假定数据集为X,如果把这些数据划分成c类的话,那么对应的就有c个类中心为C,每个样本j属于某一类i的隶属度为uijuij,那么定义一个FCM目标函数(1)及其约束条件(2)如下所示:

J=∑i=1c∑j=1numij||xj−ci||2(1)
(1)J=∑i=1c∑j=1nuijm||xj−ci||2
∑i=1cuij=1,j=1,2...,n(2)
(2)∑i=1cuij=1,j=1,2...,n

看一下目标函数(式1)而知,由相应样本的隶属度与该样本到各个类中心的距离相乘组成的,m是一个隶属度的因子,个人理解为属于样本的轻缓程度,就像x2x2与x3x3这种一样。式(2)为约束条件,也就是一个样本属于所有类的隶属度之和要为1。观察式(1)可以发现,其中的变量有uij、ciuij、ci,并且还有约束条件,那么如何求这个目标函数的极值呢?
这里首先采用拉格朗日乘数法将约束条件拿到目标函数中去,前面加上系数,并把式(2)的所有j展开,那么式(1)变成下列所示: 
J=∑i=1c∑j=1numij||xj−ci||2+λ1(∑i=1cui1−1)+...+λj(∑i=1cuij−1)+...+λn(∑i=ncuin−1))(3)
(3)J=∑i=1c∑j=1nuijm||xj−ci||2+λ1(∑i=1cui1−1)+...+λj(∑i=1cuij−1)+...+λn(∑i=ncuin−1))

现在要求该式的目标函数极值,那么分别对其中的变量uij、ciuij、ci求导数,首先对uijuij求导。
分析式(3),先对第一部分的两级求和的uijuij求导,对求和形式下如果直接求导不熟悉,可以把求和展开如下: 
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢um11||x1−c1||2⋮umi1||x1−ci||2⋮umc1||x1−cc||2⋯⋮⋯⋮⋯um1j||xj−c1||2⋮umij||xj−ci||2⋮umcj||xj−cc||2⋯⋮⋯⋮⋯um1n||xn−c1||2⋮umin||xn−ci||2⋮umcn||xn−cc||2⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
[u11m||x1−c1||2⋯u1jm||xj−c1||2⋯u1nm||xn−c1||2⋮⋮⋮⋮⋮ui1m||x1−ci||2⋯uijm||xj−ci||2⋯uinm||xn−ci||2⋮⋮⋮⋮⋮uc1m||x1−cc||2⋯ucjm||xj−cc||2⋯ucnm||xn−cc||2]

这个矩阵要对uijuij求导,可以看到只有uijuij对应的umij||xj−ci||2uijm||xj−ci||2保留,其他的所有项中因为不含有uijuij,所以求导都为0。那么umij||xj−ci||2uijm||xj−ci||2对uijuij求导后就为m||xj−ci||2um−1ijm||xj−ci||2uijm−1。
再来看后面那个对uijuij求导,同样把求和展开,再去除和uijuij不相关的(求导为0),那么只剩下这一项:λj(uij−1)λj(uij−1),它对uijuij求导就是λjλj了。

那么最终J对uijuij的求导结果并让其等于0就是: 
∂J∂uij=m||xj−ci||2um−1ij+λj=0
∂J∂uij=m||xj−ci||2uijm−1+λj=0

这个式子化简下,将uijuij解出来就是: 
um−1ij=−λjm||xj−ci||2
uijm−1=−λjm||xj−ci||2

进一步: 
uij=(−λjm||xj−ci||2)1m−1=(−λjm)1m−1(1||xj−ci||(2m−1))(4)(4)uij=(−λjm||xj−ci||2)1m−1=(−λjm)1m−1(1||xj−ci||(2m−1))
要解出uijuij则需要把λjλj去掉才行。这里重新使用公式(2)的约束条件,并把算出来的uijuij代入式(2)中有:

1=∑i=1cuij=∑i=1c(−λjm)1m−1(1||xj−ci||(2m−1))=(−λjm)1m−1∑i=1c(1||xj−ci||(2m−1))1=∑i=1cuij=∑i=1c(−λjm)1m−1(1||xj−ci||(2m−1))=(−λjm)1m−1∑i=1c(1||xj−ci||(2m−1))
这样就有(其中把符号i换成k): 
(−λjm)1m−1=(1∑i=1c(1||xj−ci||(2m−1)))=(1∑k=1c(1||xj−ck||(2m−1)))(−λjm)1m−1=(1∑i=1c(1||xj−ci||(2m−1)))=(1∑k=1c(1||xj−ck||(2m−1)))
把这个重新代入到式(4)中有: 
uij=(1∑k=1c(1||xj−ck||(2m−1)))(1||xj−ci||(2m−1))=(1∑k=1c(||xj−ci||(2m−1))||xj−ck||(2m−1)))=1∑k=1c(||xj−ci||||xj−ck||)(2m−1)(5)(5)uij=(1∑k=1c(1||xj−ck||(2m−1)))(1||xj−ci||(2m−1))=(1∑k=1c(||xj−ci||(2m−1))||xj−ck||(2m−1)))=1∑k=1c(||xj−ci||||xj−ck||)(2m−1)
好了,式子(5)就是最终的uijuij迭代公式。

下面在来求J对cici的导数。由公式(2)可以看到只有∑i=1c∑j=1numij||xj−ci||2∑i=1c∑j=1nuijm||xj−ci||2这一部分里面含有cici,对其二级求和展开如前面所示的,那么它对cici的导数就是: 
∂J∂ci=∑j=1n(−umij∗2∗(xj−ci))=0∂J∂ci=∑j=1n(−uijm∗2∗(xj−ci))=0 
即: 
∑j=1n(umijci)=∑j=1n(xjumij)∑j=1n(uijmci)=∑j=1n(xjuijm) ci=∑j=1n(xjumij)∑j=1numij(6)(6)ci=∑j=1n(xjuijm)∑j=1nuijm
好了,公式(6)就是类中心的迭代公式。

我们发现uijuij与cici是相互关联的,彼此包含对方,有一个问题就是在fcm算法开始的时候既没有uijuij也没有cici,那要怎么求解呢?很简单,程序开始的时候我们随便赋值给uijuij或者cici其中的一个,只要数值满足条件即可。然后就开始迭代,比如一般的都赋值给uijuij,那么有了uijuij就可以计算cici,然后有了cici又可以计算uijuij,反反复复,在这个过程中还有一个目标函数J一直在变化,逐渐趋向稳定值。那么当J不在变化的时候就认为算法收敛到一个比较好的结了。可以看到uijuij和cici在目标函数J下似乎构成了一个正反馈一样,这一点很像EM算法,先E在M,有了M在E,在M直至达到最优。

公式(5),(6)是算法的关键。现在来重新从宏观的角度来整体看看这两个公式,先看(5),在写一遍 
uij=1∑k=1c(||xj−ci||||xj−ck||)(2m−1)
uij=1∑k=1c(||xj−ci||||xj−ck||)(2m−1)

假设看样本集中的样本1到各个类中心的隶属度,那么此时j=1,i从1到c类,此时上述式中分母里面求和中,分子就是这个点相对于某一类的类中心距离,而分母是这个点相对于所有类的类中心的距离求和,那么它们两相除表示什么,是不是表示这个点到某个类中心在这个点到所有类中心的距离和的比重。当求和里面的分子越小,是不是说就越接近于这个类,那么整体这个分数就越大,也就是对应的uijuij就越大,表示越属于这个类,形象的图如下: 
 
再来宏观看看公式(6),考虑当类i确定后,式(6)的分母求和其实是一个常数,那么式(6)可以写成: 
ci=∑j=1n(xjumij)∑j=1numij=∑j=1numij∑j=1numijxj
ci=∑j=1n(xjuijm)∑j=1nuijm=∑j=1nuijm∑j=1nuijmxj

这是类中心的更新法则。说这之前,首先让我们想想kmeans的类中心是怎么更新的,一般最简单的就是找到属于某一类的所有样本点,然后这一类的类中心就是这些样本点的平均值。那么FCM类中心怎么样了?看式子可以发现也是一个加权平均,类i确定后,首先将所有点到该类的

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值