{"id":31053086,"url":"https://github.com/raveriss/ft_linear_regression","last_synced_at":"2026-04-15T07:36:31.207Z","repository":{"id":311003376,"uuid":"1041306834","full_name":"raveriss/ft_linear_regression","owner":"raveriss","description":"Implémentation d’un algorithme de machine learning : régression linéaire avec descente de gradient. Le projet prédit le prix d’une voiture selon son kilométrage, avec entraînement (θ0, θ1) sauvegardé en JSON, prédiction en CLI, visualisation, tests, CI/CD et outils qualité.","archived":false,"fork":false,"pushed_at":"2026-04-01T23:28:19.000Z","size":4286,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-02T10:17:11.199Z","etag":null,"topics":["42","42-school","42paris","42school","ci-cd","codecov","data-science","ft-linear-regression","github-actions","gradient-descent","linear-regression","linear-regressions","machine-learning","mutmut","pre-commit","pytest","python3","ruff"],"latest_commit_sha":null,"homepage":"https://www.linkedin.com/in/verissimo-rafael/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/raveriss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-08-20T09:42:58.000Z","updated_at":"2026-04-01T23:28:23.000Z","dependencies_parsed_at":"2025-08-21T15:41:55.920Z","dependency_job_id":"63250118-c814-46eb-8fee-c2a171f52ec4","html_url":"https://github.com/raveriss/ft_linear_regression","commit_stats":null,"previous_names":["raveriss/ft_linear_regression"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/raveriss/ft_linear_regression","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_linear_regression","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_linear_regression/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_linear_regression/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_linear_regression/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/raveriss","download_url":"https://codeload.github.com/raveriss/ft_linear_regression/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_linear_regression/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31831847,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T07:17:56.427Z","status":"ssl_error","status_checked_at":"2026-04-15T07:17:30.007Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["42","42-school","42paris","42school","ci-cd","codecov","data-science","ft-linear-regression","github-actions","gradient-descent","linear-regression","linear-regressions","machine-learning","mutmut","pre-commit","pytest","python3","ruff"],"created_at":"2025-09-15T01:51:52.589Z","updated_at":"2026-04-15T07:36:31.198Z","avatar_url":"https://github.com/raveriss.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ft_linear_regression \n\n\u003cdiv align=\"center\"\u003e\n\n![Python](https://img.shields.io/badge/Python-3.10-3776AB?logo=python\u0026logoColor=white)\n[![CI](https://img.shields.io/github/actions/workflow/status/raveriss/ft_linear_regression/ci.yml?branch=main\u0026logo=githubactions\u0026logoColor=white)](https://github.com/raveriss/ft_linear_regression/actions/workflows/ci.yml)\n[![Coverage](https://img.shields.io/codecov/c/github/raveriss/ft_linear_regression?logo=codecov\u0026logoColor=white)](https://codecov.io/gh/raveriss/ft_linear_regression)\n![Lint](https://img.shields.io/badge/lint-ruff-46A35E?logo=ruff\u0026logoColor=white)\n![Typing](https://img.shields.io/badge/mypy-checked-6f42c1?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI%2BPHBhdGggZmlsbD0iI2ZmZmZmZiIgZD0iTTMgMTlWNWgzLjJMMTIgMTIuNCAxNy44IDVIMjF2MTRoLTNWMTAuMWwtNC44IDYuMUgxMC44TDYgMTAuMVYxOXoiLz48L3N2Zz4%3D)\n![Mutation](https://img.shields.io/badge/mutmut-%E2%89%A590%25-f08a24?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI%2BPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI%2BPHBhdGggZD0iTTcgNGM0IDIuNSA2IDUuNSAxMCA4Ii8%2BPHBhdGggZD0iTTE3IDRjLTQgMi41LTYgNS41LTEwIDgiLz48cGF0aCBkPSJNNyAyMGM0LTIuNSA2LTUuNSAxMC04Ii8%2BPHBhdGggZD0iTTE3IDIwYy00IDIuNS02LTUuNS0xMC04Ii8%2BPC9nPjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiPjxwYXRoIGQ9Ik05IDdoNiIvPjxwYXRoIGQ9Ik04IDEyaDgiLz48cGF0aCBkPSJNOSAxN2g2Ii8%2BPC9nPjwvc3ZnPg%3D%3D)\n![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=precommit\u0026logoColor=white)![black](https://img.shields.io/badge/code%20style-black-000000?logo=black\u0026logoColor=white)\n![Security](https://img.shields.io/badge/security-bandit-2ea44f?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI%2BPGcgZmlsbD0iI2ZmZmZmZiI%2BPHBhdGggZD0iTTEyIDNsNiAyLjJWOWMwIDEuMi0uNyAyLjMtMS44IDIuOGwtNC4yIDIuMS00LjItMi4xQTMuMSAzLjEgMCAwIDEgNiA5VjUuMnoiLz48cGF0aCBkPSJNNy41IDkuMmMuOS0xLjMgMi41LTIuMiA0LjUtMi4yczMuNi45IDQuNSAyLjJjLS44IDEuMy0yLjQgMi4yLTQuNSAyLjJzLTMuNy0uOS00LjUtMi4yeiIvPjxjaXJjbGUgY3g9IjEwIiBjeT0iOS4yIiByPSIxIi8%2BPGNpcmNsZSBjeD0iMTQiIGN5PSI5LjIiIHI9IjEiLz48cGF0aCBkPSJNMTEgMTMuNWgyVjE4aC0yeiIvPjxwYXRoIGQ9Ik05IDE3aDZ2Mkg5eiIvPjwvZz48L3N2Zz4%3D)\n![License](https://img.shields.io/github/license/raveriss/ft_linear_regression?logo=github\u0026logoColor=white)\n\n\u003c/div\u003e\n\n---\n## 📑 Table des matières\n- [🚀 Objectif du projet](#-objectif-du-projet)\n- [🧰 Stack technologique](#-stack-technologique)\n- [⚡ Démarrage rapide](#-démarrage-rapide)\n- [🛠️ Commandes Make](#-commandes-make)\n- [🧪 Procédure de soutenance](#-procédure-de-soutenance-e2e-défense-proof)\n- [📦 Utilisation](#-utilisation)\n- [📝 Données](#-données)\n- [🧠 Architecture](#-architecture)\n- [🛠️ Fichiers de configuration](#fichiers-de-configuration)\n- [🧪 Tests](#-tests)\n- [🔍 Qualité du code](#-qualité-du-code)\n- [📚 Documentation liée](#-documentation-liée)\n- [🛡️ Licence](#licence)\n\n---\n\n## 🚀 Objectif du projet\nImplémenter **un premier algorithme de Machine Learning** : une **régression linéaire simple**.  \n\n👉 Prédire le **prix d’une voiture** en fonction de son kilométrage via :  \n```math\nestimate_price(x) = θ₀ + θ₁ * x\n```\n\n\n- **Deux programmes obligatoires** :  \n  - `train.py` → entraîne le modèle (descente de gradient, mise à jour simultanée de θ).  \n  - `predict.py` → prédit un prix à partir d’un kilométrage (0 avant entraînement).  \n\n🎯 Conformité stricte à l’énoncé 42 :  \n- Pas de `numpy.polyfit` / `sklearn.LinearRegression`.  \n- θ sauvegardés entre runs dans `theta.json`.  \n- Prédiction = **0 avant tout entraînement**.  \n- Pas de crash en soutenance.\n\n---\n\n## 🧰 Stack technologique\n- **Python** : 3.10.18 (Ubuntu 22.04.5 Jammy)  \n- **Gestion dépendances** : [Poetry](https://python-poetry.org/)  \n- **Qualité / CI** : `pytest`, `coverage`, `ruff`, `mypy`, `mutmut` (mutation testing)  \n- Visualisation (**bonus uniquement**) : matplotlib (installé **sur demande** via `poetry install --with viz`)\n\n\n---\n\n## ⚡ Démarrage rapide\n\n\u003e En cas d’entrée invalide (ex. kilométrage négatif ou non numérique) : le programme écrit un message `ERROR: ...` sur **stderr** et quitte avec **exit 2**.\n\n\n### 🔧 Installation\n```bash\n# Avec Poetry (recommandé)\npoetry install --with dev\n```\n\n\u003e ℹ️ Bonus non installé par défaut  \n\u003e Pour activer **uniquement** la visualisation bonus :  \n\u003e `poetry install --with viz --with dev`\n\n\n### ▶️ Lancement\n```bash\n# Entraînement\npoetry run train --data data/samples/data.csv --alpha 0.1 --iters 1000 --theta theta.json\n\n\n# Prédiction\npoetry run predict 85000 --theta theta.json\n```\n\n\u003e ℹ️ Si la droite rouge affichée par `viz` reste quasiment horizontale, vérifiez\n\u003e le contenu de `theta.json`. Une valeur de `--alpha` trop faible (par exemple\n\u003e `1e-7`) laisse les coefficients proches de zéro. Utilisez `--alpha 0.1` (ou\n\u003e `0.01`) et suffisamment d'itérations pour obtenir une pente négative réaliste.\n\n## 🛠️ Commandes Make\n\nLes principales cibles du [Makefile](./Makefile) facilitent l'installation, la qualité du code et l'utilisation du modèle :\n\n| Commande | Description |\n| --- | --- |\n| `make install` | Installe les dépendances avec Poetry (groupe dev inclus). |\n| `make lint` | Analyse statique du code avec Ruff. |\n| `make format` | Formate le code et applique les corrections automatiques de Ruff. |\n| `make type` | Vérifie les types avec Mypy. |\n| `make test` | Lance les tests unitaires via Pytest. |\n| `make cov` | Produit les rapports de couverture (JSON, HTML, console). |\n| `make mut` | Exécute les tests de mutation avec Mutmut. |\n| `make train` | Entraîne le modèle ; variables personnalisables : `DATA`, `ALPHA`, `ITERS`, `THETA`. |\n| `make predict [km]` | Prédit le prix pour un kilométrage donné. |\n| `make viz` | (Bonus) Affiche les données et la droite de régression. |\n\n\n## 🧪 Procédure de soutenance (E2E “défense-proof”)\n\nScénario officiel à démontrer en soutenance, en trois étapes **obligatoires** :\n\n**Étape A :** prédiction avant tout entraînement  \nSuppression du fichier de paramètres\n```bash\nrm -f theta.json\npython3 -m src.predict 50000 --theta theta.json\n```\n→ Résultat attendu : 0 (θ₀=0, θ₁=0 par défaut)\n\n**Étape B :** entraînement du modèle\n\n```bash\npoetry run train --data data.csv --alpha 0.1 --iters 1000 --theta theta.json\n```\n→ Apprentissage des paramètres θ₀ et θ₁, sauvegardés dans theta.json\n\n**Étape C :** prédiction après entraînement\n→ Résultat attendu : prix non nul, cohérent avec la droite apprise (≈ CSV)\n```bash\npython3 -m src.predict 50000 --theta theta.json\n```\n⚠️ Ces trois étapes doivent être **reproductibles à l’identique** devant le jury.\nTout écart (crash, valeur incohérente, absence de 0 en étape A, MAJ non simultanée de θ) = **échec en défense.**\n\n### (Bonus) Visualisation\n\u003e Évaluable **uniquement si le mandatory est parfait**. Non requis pour la soutenance.\n### Si vous avez installé le groupe bonus viz :\n```bash\npoetry run python -m src.viz --data data.csv --theta theta.json --show-residuals\n```\nAjoutez `--show-residuals` pour tracer des lignes verticales représentant les résidus.\nUtilisez `--sigma-k` (défaut `2`) pour colorer en orange les points dont\n`|résidu| \u003e k·σ`; ils sont ajoutés à la légende sous le nom « outliers ».\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/plots/examples/price-vs-km-regression.png\" alt=\"Régression linéaire (price vs km)\" width=\"760\"\u003e\n  \u003cbr\u003e\u003cem\u003eNuage de points et droite θ₀ + θ₁·x (après entraînement).\u003c/em\u003e\n\u003c/p\u003e\n\n---\n\n## 📦 Utilisation\n- **Mode interactif** : `predict.py` demande un kilométrage si non fourni.\n    ### Exemple concret\n```bash\n$ make predict \npoetry run predict --theta theta.json\nEnter mileage: 23000\nPredicted price: 7991.88 €\n```\n- **End-to-End** : `predict (0)` → `train` → `predict ≈ prix`.  \n\n---\n\n## 📝 Données\n- Fichier : [`data/samples/data.csv`](./data/samples/data.csv) (colonnes `km,price`).  \n- Hypothèses :  \n  - km ≥ 0  \n  - valeurs numériques uniquement  \n  - 24 lignes d’exemple (corrélation ≈ −0,86)\n\n---\n\n## 🧠 Architecture\n```\n.\n├── AGENTS.md\n├── author\n├── codecov.yml\n├── CONTRIBUTING.md\n├── coverage.json\n├── data\n│   ├── benchmarks\n│   │   ├── data_anscombe_I.csv\n│   │   ├── data_anscombe_II.csv\n│   │   ├── data_anscombe_III.csv\n│   │   ├── data_anscombe_IV.csv\n│   │   ├── data_away.csv\n│   │   ├── data_bullseye.csv\n│   │   ├── data_circle.csv\n│   │   ├── data_collinear.csv\n│   │   ├── data.csv\n│   │   ├── data_dino.csv\n│   │   ├── data_dots.csv\n│   │   ├── data_duplicate.csv\n│   │   ├── data_flat.csv\n│   │   ├── data_high_lines.csv\n│   │   ├── data_h_lines.csv\n│   │   ├── data_inverse.csv\n│   │   ├── data_noise.csv\n│   │   ├── data_nonlinear.csv\n│   │   ├── data_outlier.csv\n│   │   ├── data_slant_down.csv\n│   │   ├── data_slant_up.csv\n│   │   ├── data_small.csv\n│   │   ├── data_sparse.csv\n│   │   ├── data_star.csv\n│   │   ├── data_step.csv\n│   │   ├── data_v_lines.csv\n│   │   ├── data_wide_lines.csv\n│   │   └── data_x_shape.csv\n│   └── samples\n│       └── data.csv\n├── docs\n│   ├── assets\n│   │   └── plots\n│   │       ├── confiance\n│   │       │   ├── fig01_donnees.png\n│   │       │   ├── fig02_droite_ols.png\n│   │       │   ├── fig03_residus_sigma.png\n│   │       │   ├── fig04_effet_levier.png\n│   │       │   ├── fig05_SE.png\n│   │       │   ├── fig06_bande_95.png\n│   │       │   └── fig07_tableau.png\n│   │       ├── examples\n│   │       │   └── price-vs-km-regression.png\n│   │       └── regression\n│   │           ├── etape1_donnees_brutes.png\n│   │           ├── etape2_droite_initiale.png\n│   │           ├── etape3_droites_successives.png\n│   │           ├── etape4_erreurs_initiales.png\n│   │           ├── etape5_erreurs_finales.png\n│   │           ├── etape6_theta0_vs_iter.png\n│   │           ├── etape7_theta1_vs_iter.png\n│   │           └── etape8_cout_vs_iter.png\n│   ├── confidence_band.md\n│   └── regression_lineaire.md\n├── LICENSE\n├── Makefile\n├── poetry.lock\n├── poetry.toml\n├── pyproject.toml\n├── README.md\n├── src\n│   ├── linear_regression.py\n│   ├── metrics.py\n│   ├── predict\n│   │   ├── __init__.py\n│   │   ├── __main__.py\n│   │   └── predict.py\n│   ├── train\n│   │   ├── __init__.py\n│   │   ├── __main__.py\n│   │   └── train.py\n│   └── viz.py\n└── tests\n    ├── test_accuracy_main.py\n    ├── test_cli.py\n    ├── test_data_parsing.py\n    ├── test_e2e.py\n    ├── test_estimate_price.py\n    ├── test_gradient.py\n    ├── test_json.py\n    ├── test_main_modules.py\n    ├── test_metrics.py\n    ├── test_parser.py\n    ├── test_predict_logic.py\n    └── test_viz.py\n```\n\n*(Bonus : `viz.py` affiche données + droite de régression)*\n*Les tests E2E vérifient aussi les **messages d’erreurs exacts** (snapshot) et les **codes de sortie** (0/1/2).*\n\n---\n\n\u003ch2 id=\"fichiers-de-configuration\"\u003e🛠️ Fichiers de configuration\u003c/h2\u003e\n\n- `pyproject.toml` (Poetry, dépendances, lint, type check)\n  - Groupe optionnel **[tool.poetry.group.viz]** (non installé par défaut, réservé au **bonus**)\n- `requirements.txt` (fallback sans Poetry)\n- `.coveragerc`, `.gitignore`, `Makefile` (raccourcis CI/CD)\n- **Note** : `theta.json` est listé dans `.gitignore` → *ne jamais le versionner*.\n\n---\n\n## 🧪 Tests\n- Portée des tests (mandatory) : `train.py`, `predict.py`, `io_utils.py`, CLI, I/O θ, stratégie GD.  \n- `viz.py` est **hors** mandatory et **hors périmètre** des exigences minimales (peut être testé si le bonus est activé).\n\n### Unitaire\n- Comparaisons float avec `pytest.approx` uniquement (`rtol=1e-2`), jamais `==`.  \n- Test dédié qui échoue si la mise à jour des θ n’est pas **simultanée** (utilisation de temporaires).  \n- Tests robustesse I/O : CSV manquant, colonnes inattendues, valeurs non numériques, JSON `theta` absent/corrompu.  \n- Vérification des **messages d’erreurs et codes retour** (exemples attendus) :  \n  - `ERROR: invalid CSV format (expected columns: km,price)` → exit 2  \n  - `ERROR: invalid mileage (must be a non-negative number)` → exit 2  \n  - `ERROR: theta file not found: \u003cpath\u003e` → exit 2  \n\n### End-to-End\n- `predict(0)=0` → `train` → `predict(km_csv) ≈ price`.  \n- CLI `--help` (exit 0), erreurs d’options (exit ≠ 0, message).  \n  - Entrée interactive : prompt si kilométrage manquant, gestion EOF/pipe.\n\n### Couverture stricte (100 % global + diff + contrôle par fichier)\n```bash\npytest -q\ncoverage run -m pytest\ncoverage json\ncoverage report --fail-under=100\ncoverage html --skip-empty --show-contexts\n```\n\n## 🧾 Codes de sortie \u0026 messages d’erreur (contrat “défense‑proof”)\n\nLes programmes doivent **imprimer ces messages à l’identique sur stderr** et quitter avec le **code indiqué**.\n\n- `ERROR: theta file not found: \u003cpath\u003e` → **exit 2**\n- `ERROR: invalid CSV format (expected columns: km,price)` → **exit 2**\n- `ERROR: invalid mileage (must be a non-negative number)` → **exit 2**\n\nRègles générales :\n- **0** : exécution nominale (train/predict OK).\n- **2** : erreur d’usage/entrée/I‑O/validation (fichier manquant, CSV invalide, saisie invalide, etc.).\n- **1** : erreur interne inattendue (exception non prévue).\n\nTests recommandés :\n- Snapshot minimal des messages d’aide (`--help`) et d’erreur (texte essentiel, stable).\n- Asserts explicites sur `returncode` (0, 1 ou 2 selon les cas).\n\n✅ **Objectifs qualité (mandatory)** :  \n- Coverage **100 %** (statements + branches + diff + contrôle fichier).  \n- Mutation testing **≥90 %** (scope global mandatory, avec survivants justifiés).  \n- **Tolérance floats stricte** : toujours utiliser `pytest.approx(..., rel=1e-2)` (jamais `==` sur floats).  \n- **Test dédié “MAJ simultanée”** : un test échoue explicitement si θ₀, θ₁ sont mis à jour séquentiellement (sans temporaires).  \n- Tests E2E : `predict(0)=0 → train → predict≈csv`.  \n- Tests robustesse I/O : CSV manquant, mal formé, km négatif, NaN, EOF/pipe.  \n- Tests CLI : `--help`, erreurs d’options → exit ≠ 0 avec message clair.  \n- Codes retour : 0 succès, ≠0 échec.  \n\n---\n\n## 🔍 Qualité du code\n- Formatage \u0026 imports : `ruff format`, `isort`.  \n- Typage statique : `mypy`.  \n- Lint : `ruff check`.  \n- CI/CD Ubuntu-only (GitHub Actions).  \n- Hooks `pre-commit` pour vérifier format/lint/tests rapides avant commit.  \n---\n## 📚 Documentation liée\n- [`AGENTS.md`](./AGENTS.md) → Blueprint complet CI/CD + checklist défense-proof.  \n- [`ft_linear_regression_checklist_défense-proof.txt`](./ft_linear_regression_checklist_défense-proof.txt) → Qualité tests \u0026 couverture.  \n- [`ft_linear_regression_murphy_law.txt`](./ft_linear_regression_murphy_law.txt) → Risques \u0026 contre-mesures.  \n- Énoncé officiel : [ft_linear_regression.en.subject.pdf](./ft_linear_regression.en.subject.pdf).  \n- Le bonus est **cloisonné** : il ne doit pas interférer avec le mandatory ni impacter la CI de base.\n\n---\n\n## 📖 Ressources utilisées\n\nLes contenus suivants ont été essentiels pour comprendre et implémenter la régression linéaire et l’algorithme du gradient :\n\n- 🎥 [Playlist YouTube — Machine Learning from Scratch](https://www.youtube.com/playlist?list=PLO_fdPEVlfKqUF5BPKjGSh7aV9aBshrpY)  \n  Série pédagogique détaillant les fondements du Machine Learning et la régression linéaire.\n\n- 📄 [Wikipédia — Fonction linéaire (analyse)](https://fr.wikipedia.org/wiki/Fonction_lin%C3%A9aire_(analyse))  \n  Définitions et propriétés mathématiques de la fonction linéaire.\n\n- 📄 [Wikipédia — Algorithme du gradient](https://fr.wikipedia.org/wiki/Algorithme_du_gradient)  \n  Explication théorique de la descente de gradient et de ses applications en optimisation.\n\n\n\u003ch2 id=\"licence\"\u003e🛡️ Licence\u003c/h2\u003e\nMIT © 2025 — raveriss  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraveriss%2Fft_linear_regression","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fraveriss%2Fft_linear_regression","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraveriss%2Fft_linear_regression/lists"}