AI

Fuzzy C-Means

Algorithm

\[ \begin{aligned} &\textbf{Fuzzy C-Means (FCM)} \\[4pt] &\text{Given } X = \{x_1,x_2,\dots,x_n\},\; x_i \in \mathbb{R}^d,\; c \text{ is the number of clusters},\; m>1. \\[6pt] &\text{Membership matrix: } U=[u_{ij}],\; u_{ij}\in[0,1],\; \sum_{j=1}^{c} u_{ij}=1. \\[8pt] &\text{Objective function:} \\[4pt] &J_m(U,V)=\sum_{i=1}^{n}\sum_{j=1}^{c}u_{ij}^{\,m}\,\lVert x_i-v_j\rVert^2. \\[10pt] &\text{Cluster center update:} \\[4pt] &v_j=\frac{\sum_{i=1}^{n}u_{ij}^{\,m}x_i}{\sum_{i=1}^{n}u_{ij}^{\,m}}. \\[10pt] &\text{Membership update:} \\[4pt] &u_{ij}= \frac{1}{ \sum_{k=1}^{c} \left( \frac{\lVert x_i-v_j\rVert}{\lVert x_i-v_k\rVert} \right)^{\frac{2}{m-1}} }. \\[10pt] &\text{Stopping criterion:} \\[4pt] &\max_{i,j}\left|u_{ij}^{(t+1)}-u_{ij}^{(t)}\right|<\varepsilon. \\[8pt] &\text{Repeat until convergence or the maximum number of iterations is reached.} \end{aligned} \]

Example 1

XMembership
x1x2u1u2
A120.90.1
B230.80.2
C580.20.8
D880.10.9
E100.950.15
F010.990.01

Example 2

x1 x2 u1 u2 u3
A 0 5 0.9 0.05 0.05
B 1 4 0.8 0.1 0.1
C 5 8 0.2 0.6 0.2
D 9 2 0.1 0.1 0.8
E 2 0 0.7 0.15 0.15
F 6 8 0.15 0.7 0.15
G 7 7 0.1 0.8 0.1

Install

pip install scikit-fuzzy 

Code

import numpy as np
from skfuzzy.cluster import cmeans
X = np.array([
    [1, 2, 5, 8, 1, 0],
    [2, 3, 8, 8, 0, 1]
])
U = [
    [0.9, 0.8, 0.2, 0.1, 0.95, 0.99],
    [0.1, 0.2, 0.8, 0.9, 0.05, 0.01],
]
cntr, u, u0, d, jm, p, fpc = cmeans(
    data=X,
    c=2,        # số cụm
    m=2.0,      # fuzziness
    error=1e-6,
    maxiter=2,
    init = U,
    #seed=42
)
print("Cluster centers:", cntr)
print("\nMembership matrix (u):", u)
print("\nHard labels:", np.argmax(u, axis=0))
print("\nFuzzy Partition Coefficient (FPC):", fpc)
print("Membersihp init", u0)