# AFCM (Without Graph Embedding) Documentation


## 🔍 Overview
This version of Adaptive Fuzzy C-Means (AFCM) performs clustering by adaptively updating fuzzy memberships and cluster centers, without incorporating any graph structure. It is a simplified form of the full AFCM model and operates directly on the original data space.

---
## ⚙️ Class Definition
**Class Name:** `AFCMSIMPLE`

This class implements the simplified AFCM model with adaptive fuzzy memberships and convergence control.
```python
class AFCMSimple:
    def __init__(self, c: int, m: float = 2.0, max_iter: int = 100, tol: float = 1e-5):
        self.c = c
        self.m = m
        self.max_iter = max_iter
        self.tol = tol
```

---

## 📋 Parameters

| Parameter     | Type   | Default | Description                                  |
|---------------|--------|---------|----------------------------------------------|
| `c`           | int    | —       | Number of clusters                           |
| `m`           | float  | 2.0     | Fuzziness degree                             |
| `max_iter`    | int    | 100     | Maximum number of iterations                 |
| `tol`         | float  | 1e-5    | Tolerance for convergence                    |

---
## 🚀 Usage Examples
```python
from soft_clustering._afcm_simple._afcm_simple import AFCMSimple
import numpy as np

X = np.vstack([
    np.random.normal(loc=[0, 0], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[3, 3], scale=0.5, size=(50, 2)),
])

model = AFCMSimple(c=2)
labels, U = model.fit_predict(X)

print("Cluster Labels:", labels)
print("Membership Matrix:", U)
```

---

### 📥 Input / 📤 Output

- **Input to `fit_predict(X)`**:
  - `X (np.ndarray)`: Data matrix of shape (N x D)

- **Returns**:
  - `labels (np.ndarray)`: Final hard cluster assignments (N,)
  - `U (np.ndarray)`: Final fuzzy membership matrix (N x C)

---

## 🛠️ Methods

- `__init__(self, c, m=2.0, max_iter=100, tol=1e-5)`: Initializes the model with cluster count and training options.
- `fit_predict(self, X)`: Learns fuzzy memberships and returns both final labels and the U matrix.

---


## 📝 Implementation Notes

- This version does not include graph embedding or regularization terms.
- It iteratively updates fuzzy memberships and centers until convergence.
- Suitable for data without known manifold structure or graph connectivity.

---

## 📚 Reference

This implementation is based on:
**"Adaptive Fuzzy C-Means with Graph Embedding"**,  
but applies the simplified version without Laplacian constraints.
