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
| X | Membership |
| x1 | x2 | u1 | u2 |
| A | 1 | 2 | 0.9 | 0.1 |
| B | 2 | 3 | 0.8 | 0.2 |
| C | 5 | 8 | 0.2 | 0.8 |
| D | 8 | 8 | 0.1 | 0.9 |
| E | 1 | 0 | 0.95 | 0.15 |
| F | 0 | 1 | 0.99 | 0.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)