import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display, Markdown
def make_dataset(n_per_class=60, seed=2026):
"""Deux amas gaussiens 2D fortement chevauchants.
Le fort chevauchement rend la precision k-NN sensible aux trois
hyperparametres (k, distancePower, weightBlend) : le paysage de l'objectif
CV est accidente, avec un optimum etroit que seules les methodes a recherche
structuree (Bayes/GA/PSO) atteignent — Grid (k discret grossier) et Random
(aveugle) y laissent de la precision. C'est ce qui rend la comparaison
des cinq optimiseurs lisible dans la sortie (Prong B, EPIC #3801).
"""
r = np.random.default_rng(seed)
X0 = r.normal(loc=[0.6, -0.4], scale=[1.4, 1.0], size=(n_per_class, 2))
X1 = r.normal(loc=[-0.2, 0.5], scale=[1.0, 1.4], size=(n_per_class, 2))
X = np.vstack([X0, X1])
y = np.array([0] * n_per_class + [1] * n_per_class)
perm = r.permutation(len(y))
return X[perm], y[perm]
X, y = make_dataset()
display(Markdown(f"**Dataset** : {X.shape[0]} points, 2 features, 2 classes - chevauchement ~45% (paysage d'accuracy accidente)."))
fig, ax = plt.subplots(figsize=(5, 4))
ax.scatter(X[y==0, 0], X[y==0, 1], s=10, alpha=0.6, label='classe 0')
ax.scatter(X[y==1, 0], X[y==1, 1], s=10, alpha=0.6, label='classe 1')
ax.set_title('Dataset binaire 2D (k-NN depend des hyperparametres)')
ax.legend(); ax.grid(alpha=0.3)
plt.tight_layout()
plt.show()Dataset : 120 points, 2 features, 2 classes - chevauchement ~45% (paysage d’accuracy accidente).


