模糊
模糊就是不确定。若把20岁作为确定是否年轻的标准,则21岁是不年轻。生活当中,21也很年轻,可以使用模糊的概念的来理解,即0.8属于年轻,0.2属于不年轻。这里0.8和0.2不是概率,而指的是相似的程度,把这种一个样本属于结果的这种相似的程度称为样本的隶属度,一般用u表示,表示一个样本相似于不同结果的一个程度指标。
以上来自于:https://blog.csdn.net/on2way/article/details/47087201
算法
FCM算法,即模糊C均值(Fuzzy C-means)算法,是一种基于目标函数的模糊聚类算法。
假设有个数据集X,要划分为C个类,那么对应就有C个类中心,每个样本j属于某一类的隶属度为 μij ,n个样本分成c类,模糊划分矩阵维度为c×n。
FCM算法的目标函数:
J
=
∑
i
=
1
c
∑
j
=
1
n
u
i
j
m
∣
∣
x
j
−
c
i
∣
∣
2
(1)
J = \sum_{i=1}^c \sum_{j=1}^n u_{ij}^m ||x_j-c_i||^2 \tag{1}
J=i=1∑cj=1∑nuijm∣∣xj−ci∣∣2(1)
∑ i = 1 c u i j = 1 , j = 1 , 2 , … n (2) \sum_{i=1}^c u_{ij}=1,j=1,2,\dots n \tag{2} i=1∑cuij=1,j=1,2,…n(2)
可见,目标函数由相应样本的隶属度与该样本到各个类中心的距离相乘组成的,m是一个隶属度因子(可看作样本轻缓程度,类似于 x 2 , x 3 x^2,x^3 x2,x3)。等式2为约束条件,一个样本属于所有类的隶属度之和为1。
使用拉格朗日函数求极值:
将约束条件拿到目标函数中,则:
J
=
∑
i
=
1
c
∑
j
=
1
n
u
i
j
m
∣
∣
x
j
−
c
i
∣
∣
2
+
λ
1
(
∑
i
=
1
c
u
i
1
−
1
)
+
⋯
+
λ
j
(
∑
i
=
1
c
u
i
j
−
1
)
+
⋯
+
λ
n
(
∑
i
=
1
c
u
i
n
−
1
)
J = \sum_{i=1}^c \sum_{j=1}^n u_{ij}^m ||x_j-c_i||^2 +\lambda_1(\sum_{i=1}^c u_{i1} -1)+ \dots + \lambda_j(\sum_{i=1}^c u_{ij} -1) + \dots + \lambda_n(\sum_{i=1}^c u_{in} -1)
J=i=1∑cj=1∑nuijm∣∣xj−ci∣∣2+λ1(i=1∑cui1−1)+⋯+λj(i=1∑cuij−1)+⋯+λn(i=1∑cuin−1)
分别对变量
u
i
j
u_{ij}
uij,
c
i
c_i
ci求导:
-
对 u i j u_{ij} uij求导:
把求和展开如下:
[ u 11 m ∣ ∣ x 1 − c 1 ∣ ∣ 2 … u 1 j m ∣ ∣ x j − c 1 ∣ ∣ 2 … u 1 n m ∣ ∣ x n − c 1 ∣ ∣ 2 … u i 1 m ∣ ∣ x 1 − c i ∣ ∣ 2 … u i j m ∣ ∣ x j − c i ∣ ∣ 2 … u i n m ∣ ∣ x n − c i ∣ ∣ 2 … u c 1 m ∣ ∣ x 1 − c c ∣ ∣ 2 … u c j m ∣ ∣ x j − c c ∣ ∣ 2 … u c n m ∣ ∣ x n − c c ∣ ∣ 2 ] \begin{bmatrix} u_{11}^m||x_1-c_1||^2 \dots u_{1j}^m||x_j-c_1||^2 \dots u_{1n}^m||x_n-c_1||^2 \\ \dots\\ u_{i1}^m||x_1-c_i||^2 \dots u_{ij}^m||x_j-c_i||^2 \dots u_{in}^m||x_n-c_i||^2\\ \dots \\ u_{c1}^m||x_1-c_c||^2 \dots u_{cj}^m||x_j-c_c||^2 \dots u_{cn}^m||x_n-c_c||^2 \end{bmatrix} 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
可以看到含 u i j u_{ij} uij只有一项,求导为 m u i j m − 1 ∣ ∣ x j − c i ∣ ∣ 2 mu_{ij}^{m-1}||x_j-c_i||^2 muijm−1∣∣xj−ci∣∣2,其余求导均为0。同理,后面的式子求导为 λ j \lambda_j λj
可得到:
m u i j m − 1 ∣ ∣ x j − c i ∣ ∣ 2 + λ j = 0 mu_{ij}^{m-1}||x_j-c_i||^2 + \lambda_j = 0 muijm−1∣∣xj−ci∣∣2+λj=0
化简可得:
u i j m − 1 = − λ j m ∣ ∣ x j − c i ∣ ∣ 2 u_{ij}^{m-1} = \frac{-\lambda_j}{m ||x_j-c_i||^2} uijm−1=m∣∣xj−ci∣∣2−λju i j = ( − λ j m ∣ ∣ x j − c i ∣ ∣ 2 ) 1 m − 1 = ( − λ j m ) 1 m − 1 ( 1 ∣ ∣ x j − c i ∣ ∣ ( 2 m − 1 ) ) (4) u_{ij} = \left( \frac{-\lambda_j}{m ||x_j-c_i||^2} \right) ^{\frac{1}{m-1}}=(\frac{-\lambda_j}{m})^{\frac{1}{m-1}} \left(\frac{1}{||x_j-c_i||^{(\frac{2}{m-1})}} \right)\tag{4} uij=(m∣∣xj−ci∣∣2−λj)m−11=(m−λj)m−11(∣∣xj−ci∣∣(m−12)1)(4)
想办法消掉 λ \lambda λ,将上式带入(2):
得出:
( − λ j m ) 1 m − 1 = 1 ∑ i = 1 c ( 1 ∥ x j − c i ∥ ( 2 m − 1 ) ) = 1 ∑ k = 1 c ( 1 ∥ x j − c k ∥ ( 2 m − 1 ) ) (5) (\frac{-\lambda_j}{m})^{\frac{1}{m-1}} =\frac{1}{\sum_{i=1}^c (\frac{1}{\lVert x_j-c_i \rVert^{(\frac{2}{m-1})}})}=\frac{1}{\sum_{k=1}^c (\frac{1}{\lVert x_j-c_k \rVert^{(\frac{2}{m-1})}})} \tag{5} (m−λj)m−11=∑i=1c(∥xj−ci∥(m−12)1)1=∑k=1c(∥xj−ck∥(m−12)1)1(5)
重新带入(4):
u
i
j
=
1
∑
k
=
1
c
(
∥
x
j
−
c
i
∥
∥
x
j
−
c
k
∥
)
2
m
−
1
(6)
u_{ij} = \frac{1}{\sum_{k=1}^c \left(\frac{\lVert x_j-c_i \rVert}{\lVert x_j-c_k \rVert} \right) ^ {\frac{2}{m-1}}} \tag{6}
uij=∑k=1c(∥xj−ck∥∥xj−ci∥)m−121(6)
分子就是这个点相对于某一类的类中心距离,而分母是这个点相对于所有类的类中心的距离求和,那么它们两相除表示这个点到某个类中心在这个点到所有类中心的距离和的比重。当求和里面的分子越小,那么整体这个分数就越大,就表示越接近于这个类,也就是对应的uij就越大,表示越属于这个类。
- 对
c
i
c_i
ci求偏导
∑ j = 1 n ( − u i j m ∗ 2 ∗ ( x j − c i ) ) = 0 \sum_{j=1}^n (-u_{ij}^m*2*(x_j-c_i))=0 j=1∑n(−uijm∗2∗(xj−ci))=0
化简得:
c i = ∑ j = 1 n u i j m x j ∑ j = 1 n u i j m c_i = \frac{\sum_{j=1}^n u_{ij}^m x_j}{\sum_{j=1}^n u_{ij}^m} ci=∑j=1nuijm∑j=1nuijmxj
可以发现, u i j , c i u_{ij},c_{i} uij,ci是相互关联的,彼此包含对方。在fcm算法刚开始的时候,两者都没有值,我们可以随便赋值给任意一方,然后开始迭代。 J J J也不断变化迭代,逐渐趋向最小值,当J不再变化或到达指定迭代步数时,算法停止。
算法过程: