Analyse spectrale
Une sinusoïde de pulsation, d'amplitude et de phase inconnues est observée dans du bruit :
avec scipy ensuite, jusqu'à la stratégie professionnelle, la recherche en deux temps.
1. Lien avec le cours
Le projet réunit les deux pages du chapitre 2 : la base de Fourier du modèle linéaire et sa solution analytique des moindres carrés pour la partie linéaire du modèle, la recherche sur grille et la descente de gradient pour sa partie non linéaire, et la variance Monte-Carlo pour juger le résultat.
2. Structure du code
Le cadre commun des projets d'estimation s'applique : le modèle d'abord, une classe au gabarit de scipy.stats, puis la loss, une fonction séparée, et enfin les algorithmes qui la minimisent, à la main puis avec scipy.
class NoisySinusoid:
"""Sinusoid of unknown pulsation in white Gaussian noise."""
def __init__(self, N=80, A=1.0, phi=np.pi / 4, sigma=0.5):
...
def rvs(self, omega0, rng):
"""One realization x of length N."""
...
def fourier_basis(omega, N):
"""H(omega): two columns, cos(omega n) and sin(omega n)."""
...
def loss(omega, x):
"""Concentrated least squares loss J(omega)."""
...Tests imposés. Sans bruit, fourier_basis sont quasi orthogonales,
3. Travail demandé
- La structure du modèle. Démontrer, par la formule d'addition du cosinus, la décomposition
en explicitant
Implémenter
- La grille, à la main. Implémenter la recherche sur grille :
pulsations régulièrement espacées, évaluer partout, retenir la meilleure, puis en déduire , , et donc et . Étudier l'erreur d'estimation en fonction de ( , , , ) et donner le coût en nombre d'évaluations de . Quelle est la précision limite d'une grille à points ? - Le gradient, à la main. Implémenter la descente
, le gradient étant approché par différence finie centrée, . Étudier systématiquement les deux réglages : le pas (trop grand, divergence ; trop petit, lenteur) et l'initialisation (tracer final en fonction de initial sur tout : la carte des bassins d'attraction). Conclure : de quoi la descente de gradient est-elle capable, et incapable ? - Les outils
scipy. Résoudre le même problème avecscipy.optimize.minimize_scalarpuisscipy.optimize.minimize(méthodes"BFGS"et"Nelder-Mead", avec la même initialisation que l'étape 4). Ces optimiseurs professionnels échappent-ils aux minima locaux ? Comparer précision et nombre d'évaluations avec vos implémentations. - La recherche en deux temps. Combiner : une grille grossière (
) pour localiser le bassin global, puis un raffinement local (votre gradient, ou minimizeinitialisé au meilleur point de grille). À budget d'évaluations égal, comparer la précision de la grille fine seule et de la stratégie en deux temps : chiffrer le gain, et expliquer en deux phrases pourquoi cette division du travail, un algorithme global grossier puis un algorithme local précis, est la stratégie standard. - Ouverture. Par Monte-Carlo (
tirages, estimateur en deux temps), estimer la variance de pour , , , . Vérifier empiriquement que la variance décroît environ en , une décroissance bien plus rapide que le de la moyenne empirique : mesurer une fréquence est un problème remarquablement favorable. Remarquer enfin que maximiser , l'équivalent de minimiser , redonne presque le périodogramme : la loss concentrée de ce projet est l'outil historique de l'analyse spectrale.
4. Livrables
Le notebook reproductible des modalités communes, avec la démonstration de la séparation (étape 1) rédigée, la carte des bassins d'attraction de l'étape 4, le tableau comparatif précision/coût des étapes 3 à 6, et la courbe variance/
