# Bayesian Inference - MCMC
[](https://www.python.org/)
[](./requirements.txt)
Ce dépôt regroupe quatre scripts qui mettent en œuvre l’**inférence bayésienne** pour ajuster des modèles à des données :
- estimation par **maximum de vraisemblance** (χ²) avec **bruit gaussien coloré**,
- **MCMC “fait maison”** (Metropolis–Hastings) avec matrice de covariance complète,
- **MCMC avec `emcee`** et tests de convergence (Gelman–Rubin, autocorrélation),
- application à un **spectre réel de galaxie** pour estimer le **redshift** via le doublet [O III] (4959–5007 Å).
Les scripts enregistrent automatiquement les figures en **PNG** dans le dossier courant.
---
## 📂 Structure proposée
Bayesian Inference - MCMC/ │ ├── 1_chi2_minimisation_colored_noise.py ├── 2_mcmc_metropolis_hastings.py ├── 3_mcmc_emcee_and_convergence.py ├── 4_galaxy_spectrum_oiii_redshift.py ├── data/ │ ├── mydata.npz # PSD, y, f, r (TP données simulées) │ └── f1245_888.dat # Spectre galaxie KISSR 127 (KPNO/KISS) ├── figures/ └── README.md
> Si tes fichiers ont d’autres noms, mets simplement ce README à jour pour refléter la réalité.
---
## 🧰 Contenu des scripts
### 1) `1_chi2_minimisation_colored_noise.py`
- Charge `data/mydata.npz` contenant `psd`, `y`, `f`, `r`.
- Génère du **bruit coloré** à partir d’une **PSD** ; estime la **matrice de covariance** par Monte Carlo.
- Ajuste un **profil NFW généralisé + gaussienne** (fusion d’une sous-structure) via **`curve_fit`**.
- Calcule **χ²**, ddl, et enregistre :
- `data_profile.png`, `inverse_covariance.png`, `fit_vs_data.png`, `triangle_plot.png`.
### 2) `2_mcmc_metropolis_hastings.py`
- Implémente un **Metropolis–Hastings** pur **NumPy** :
- `log_prior` borné, `log_likelihood` avec **covariance complète** (bruit coloré), `log_acceptance`.
- Lance **une** ou **plusieurs chaînes** (multi-chaînes), trace les **traces** et **nuages de points** (ex. `(rp, rho0)`).
- Sauvegarde (exemples) :
- `mcmc_data_profile.png`, `mcmc_inverse_covariance.png`,
- `mcmc_trace_rho0_main.png`, `mcmc_scatter_rp_rho0_main.png`,
- `mcmc_traces_rho0_chains.png`, `mcmc_scatter_rp_rho0_chains.png`.
### 3) `3_mcmc_emcee_and_convergence.py`
- Utilise **`emcee`** (Ensemble Sampler) sur le même modèle.
- Tests de **convergence** : **Gelman–Rubin** (R̂), **autocorrélation** et **temps d’autocorrélation** → *thinning*.
- Compare **EMCEE** vs **MLE** (triangles `getdist`).
- Sauvegarde (exemples) :
- `emcee_data_profile.png`, `emcee_inverse_covariance.png`,
- `emcee_autocorr_param*.png`, `emcee_vs_mle_triangle.png`.
### 4) `4_galaxy_spectrum_oiii_redshift.py`
- Charge `data/f1245_888.dat` (CSV avec colonnes `L` et `f`).
- Estime le **continuum** (> 6600 Å) par **fit linéaire**, en déduit l’**écart-type du bruit**.
- Ajuste la portion **> 6350 Å** avec un **doublet [O III]** (amplitude unique A, largeur `sigma` commune, **z** commun) + **continuum linéaire**.
- **Deux passes MCMC** (5000 + 5000 pas) : la 2ᵉ est initialisée au **minimum de χ²** trouvé à la 1ʳᵉ.
- Convergence R̂, autocorrélation, **redshift final** (moyenne ± 1σ).
- Sauvegarde :
- `spectre_continuum.png`, `portion_modele_initial.png`,
- `fit_doublet_final.png`, `chains_traces_pass2.png`,
- `autocorr_param_*.png`, `triangle_emcee_pass2.png`.
---
## ⚙️ Installation
### Dépendances (Python ≥ 3.9 recommandé)
- `numpy`, `pandas`, `matplotlib`, `scipy`
- `emcee`
- `getdist`
- **Optionnel** : `codecarbon` (si tu veux mesurer les émissions CO₂ dans certaines versions)
Installe tout via :
```bash
pip install numpy pandas matplotlib scipy emcee getdist codecarbon
Depuis le répertoire du projet :
python 1_chi2_minimisation_colored_noise.py
python 2_mcmc_metropolis_hastings.py
python 3_mcmc_emcee_and_convergence.py
python 4_galaxy_spectrum_oiii_redshift.pyLes figures .png seront créées dans le dossier courant.
Données : place
mydata.npzetf1245_888.datdans./data/(ou adapte les chemins en en-tête des scripts).
- L’estimation de la covariance avec
M = 10 000réalisations peut être lente. Pour un test rapide, descends temporairement àM = 2000puis remonte pour les résultats finaux. - Le MCMC (surtout multi-chaînes) peut nécessiter plus de pas pour une vraie convergence (R̂ < 1.03).
Augmente
n_stepset/oun_walkerssi besoin. get_autocorr_timepeut échouer si la chaîne est trop courte → prolonge le run puis réévalue.
- emcee: Foreman-Mackey et al., 2013 — https://emcee.readthedocs.io
- GetDist: https://getdist.readthedocs.io
- CodeCarbon: https://mlco2.github.io/codecarbon/
- Profil NFW généralisé : Navarro, Frenk & White (1996–1997) et variantes.