Integrative Capstone Project — সব যন্ত্র একসাথে¶
এতদিন প্রতিটা chapter-এ একটা করে ধারণা শিখেছ। Capstone-এ উল্টো খেলা: ৭টা flagship concept, প্রতিটা ৪ভাবে attack করবে —
| ধাপ | নাম | কি করতে হবে | কেন |
|---|---|---|---|
| (i) | Scratch | শুধু বেসিক NumPy (array, +, *, @) দিয়ে নিজে implement |
ভেতরের গিয়ার সত্যিই বোঝো কিনা তার পরীক্ষা |
| (ii) | Library | NumPy/SciPy/scikit-learn-এর তৈরি function দিয়ে একই কাজ | বাস্তব কাজের অভ্যাস + নিজের scratch-এর উত্তর যাচাই |
| (iii) | Derivation | ৫–১০ লাইনে মূল formula-র সংক্ষিপ্ত derivation/proof লেখা | "কেন কাজ করে" — না লিখতে পারলে বোঝা অসম্পূর্ণ |
| (iv) | Visualization | ফলাফলের অন্তত একটা meaningful ছবি | ছবিই ছিল আমাদের মূলমন্ত্র — শেষ পর্যন্ত |
সম্পূর্ণ working solution আছে capstone-project/capstone.ipynb-এ (নিজে চেষ্টার পরে দেখো!)। Data সব synthetic/generated — internet লাগবে না, প্রতিটা section কয়েক সেকেন্ডে চলে।
সাধারণ নিয়ম (সব প্রজেক্টে প্রযোজ্য):
np.random.seed(42)— সব ফল reproducible হতে হবে- Scratch আর library-র উত্তর মিলতে হবে:
np.allclose(...)দিয়ে যাচাই (sign/order ambiguity থাকলে সেটা সামলে) - প্রতিটা প্রজেক্ট শেষে ২–৩ বাক্যে লিখবে: "কি শিখলাম, কোথায় অবাক হলাম"
Project 1 — Least Squares Regression (Part V)¶
গল্প: noisy data-র ভেতর দিয়ে সেরা লাইন/curve টানা — পুরো data science-এর "hello world"।
Task list:
- Synthetic data বানাও: \(y = 3 + 2x - 0.5x^2 + \varepsilon\), \(\varepsilon \sim N(0, 2^2)\), \(n = 60\)
- (i) Scratch: design matrix \(X = [\mathbf{1}, x, x^2]\) গড়ে normal equations \(X^TX\beta = X^Ty\) solve করো —
np.linalg.solveদিয়ে (inverse নয়!) - (ii) Library:
np.linalg.lstsqএবংsklearn.linear_model.LinearRegression— তিনটা উত্তর মেলাও - (iii) Derivation: \(\|X\beta - y\|^2\) minimize করা থেকে normal equations — gradient শূন্য করে
- (iv) Visualization: data scatter + fitted curve + residual segments
Success criteria:
- [ ] তিন পদ্ধতির coefficient
np.allclose-এ মেলে - [ ] Recovered coefficients সত্যিকারের \((3, 2, -0.5)\)-এর কাছাকাছি
- [ ] Residual vector \(r = y - X\hat\beta\) column space-এর orthogonal: \(\|X^Tr\| \approx 0\)
Project 2 — PCA (Part VI)¶
গল্প: high-dimensional data-র "প্রধান দিক" খুঁজে dimension কমানো — variance যতটা সম্ভব বাঁচিয়ে।
Task list:
- Correlated 2D Gaussian data বানাও (\(n=300\)), সাথে একটা 5D dataset যার আসল intrinsic dimension 2
- (i) Scratch: data center করো → covariance matrix \(C = \frac{1}{n-1}X_c^TX_c\) →
np.linalg.eigh→ eigenvalue ক্রমে সাজাও → project - (ii) Library:
sklearn.decomposition.PCA— components ও explained variance মেলাও (sign flip সামলে) - (iii) Derivation: "variance maximize করা unit vector = বৃহত্তম eigenvalue-র eigenvector" — Rayleigh quotient যুক্তি
- (iv) Visualization: scatter + principal axes (eigenvalue-অনুপাতে লম্বা তীর); 5D data-র scree plot
Success criteria:
- [ ] Scratch ও sklearn-এর explained variance ratio মেলে
- [ ] 5D dataset-এর scree plot-এ ২টা component-এর পরে ধপ করে পড়ে যায়
- [ ] প্রথম principal axis চোখে দেখেই data-র লম্বা দিক বরাবর
Project 3 — SVD Image Compression (Part VI)¶
গল্প: একটা ছবি = একটা matrix; rank-\(k\) approximation = কম সংখ্যায় প্রায় একই ছবি।
Task list:
- NumPy দিয়ে একটা synthetic grayscale ছবি বানাও (gradient + বৃত্ত + আয়তক্ষেত্র, \(128\times128\)) — download নয়
- (i) Scratch:
np.linalg.svdথেকে \(U, \Sigma, V^T\) নিয়ে নিজে rank-\(k\) পুনর্গঠন লেখো: \(A_k = \sum_{i=1}^k \sigma_i u_i v_i^T\) - (ii) Library: পুরো matrix পুনর্গঠন করে যাচাই;
np.linalg.matrix_rank-এ approximation-এর rank - (iii) Derivation: Eckart–Young theorem-এর statement + storage হিসাব: \(k(m+n+1)\) বনাম \(mn\)
- (iv) Visualization: মূল ছবি + \(k = 1, 5, 20\) পুনর্গঠন পাশাপাশি; singular value decay curve (log scale)
Success criteria:
- [ ] \(k\) বাড়লে relative error \(\|A - A_k\|_F / \|A\|_F\) একঘেয়েভাবে (monotonically) কমে
- [ ] Error-এর মান theory-র সাথে মেলে: \(\|A-A_k\|_F^2 = \sum_{i>k}\sigma_i^2\)
- [ ] \(k=20\)-এ ছবি চোখে প্রায় original, storage < ৩৫%
Project 4 — Eigenvalue Algorithms (Part VIII)¶
গল্প: np.linalg.eig ভেতরে কি করে? Power method আর QR algorithm নিজে বানিয়ে দেখা।
Task list:
- একটা random symmetric \(6\times6\) matrix বানাও (\(A = B + B^T\))
- (i) Scratch: power method (normalize প্রতি ধাপে) → বৃহত্তম \(|\lambda|\); তারপর unshifted QR algorithm ৩০০ iteration → সব eigenvalue
- (ii) Library:
np.linalg.eigh-এর সাথে মেলাও - (iii) Derivation: \(A^kv_0\)-তে বৃহত্তম eigenvalue-র term কেন জেতে — \(v_0 = \sum c_i q_i\) expansion দিয়ে
- (iv) Visualization: power method-এর convergence curve (error vs iteration, log scale); QR iteration-এ off-diagonal norm-এর পতন
Success criteria:
- [ ] Power method-এর \(\lambda_{\max}\)
eigh-এর সাথে \(10^{-8}\)-এ মেলে - [ ] Convergence rate ছবিতে \(|\lambda_2/\lambda_1|\) ratio-র সাথে সঙ্গতিপূর্ণ (সরলরেখা, log scale)
- [ ] QR algorithm-এর diagonal সব eigenvalue দেয় (sorted মিলিয়ে)
Project 5 — Least Squares Classification (Part VII)¶
গল্প: regression-এর যন্ত্র দিয়েই classifier — VMLS-এর কায়দায় label \(\pm1\) ধরে।
Task list:
- দুই class-এর 2D Gaussian blob বানাও (\(n=200\), খানিকটা overlap সহ), label \(y \in \{-1, +1\}\); train/test ভাগ করো (75/25)
- (i) Scratch: feature matrix \([\mathbf{1}, x_1, x_2]\)-তে least squares fit; prediction \(\hat{y} = \mathrm{sign}(X\beta)\)
- (ii) Library:
sklearn.linear_model.RidgeClassifier(α≈0) বাLogisticRegression-এর সাথে accuracy তুলনা - (iii) Derivation: decision boundary \(\beta_0 + \beta_1x_1 + \beta_2x_2 = 0\) কেন একটা সরলরেখা — আর এটাই hyperplane ধারণার প্রয়োগ
- (iv) Visualization: দুই class-এর scatter + decision boundary line + ভুল-classify হওয়া point গুলো আলাদা marker-এ
Success criteria:
- [ ] Test accuracy ≥ 85% (overlap-ওয়ালা data-তেও)
- [ ] Scratch boundary আর sklearn boundary ছবিতে প্রায় একই জায়গায়
- [ ] Confusion matrix হাতে হিসাব করে ব্যাখ্যা করতে পারো
Project 6 — PageRank (Part VII)¶
গল্প: Google-এর মূল idea — "গুরুত্বপূর্ণ পাতা তারাই, যাদের দিকে গুরুত্বপূর্ণ পাতারা link করে" = একটা Markov matrix-এর steady-state eigenvector।
Task list:
- ১০-node-এর একটা ছোট directed web graph বানাও (adjacency matrix হাতে লিখে; একটা dangling node রেখো)
- (i) Scratch: column-stochastic matrix \(P\) গড়ো → damping দিয়ে Google matrix \(G = dP + \frac{1-d}{n}\mathbf{1}\mathbf{1}^T\) (\(d=0.85\)) → power iteration
- (ii) Library:
np.linalg.eigদিয়ে \(G\)-র eigenvalue-1 eigenvector বের করে normalize — মেলাও - (iii) Derivation: rank vector কেন \(Gr = r\)-এর solution; Perron–Frobenius কেন uniqueness দেয় (statement পর্যায়ে)
- (iv) Visualization: node-গুলো বৃত্তে সাজিয়ে graph আঁকো (তীরসহ), node-এর আকার = PageRank; rank-এর bar chart
Success criteria:
- [ ] Power iteration আর
eig-এর rank vector \(10^{-8}\)-এ মেলে - [ ] \(\sum r_i = 1\), সব \(r_i > 0\)
- [ ] সবচেয়ে বেশি incoming link-ওয়ালা hub node-ই শীর্ষে — আর কেন, ব্যাখ্যা করতে পারো
Project 7 — Randomized SVD (Part VIII)¶
গল্প: দৈত্যাকার matrix-এর SVD পুরোটা না কষে — random projection দিয়ে প্রায়-নিখুঁত উত্তর, অনেক কম খরচে। Modern large-scale ML-এর অস্ত্র।
Task list:
- একটা \(600\times400\) প্রায়-low-rank matrix বানাও: \(A = \sum_{i=1}^{15}\sigma_i u_iv_i^T +\) ক্ষীণ noise (দ্রুত-ক্ষয়ে-যাওয়া \(\sigma_i\))
- (i) Scratch: randomized range finder — \(\Omega \sim N(0,1)^{n\times(k+p)}\) → \(Y = A\Omega\) → QR → \(B = Q^TA\) → ছোট SVD → \(U = QU_B\) (oversampling \(p=10\))
- (ii) Library:
np.linalg.svd(full) এবংsklearn.utils.extmath.randomized_svd-এর সাথে singular value তুলনা - (iii) Derivation: কেন \(A \approx QQ^TA\) যথেষ্ট — range capture-এর যুক্তি ৫ লাইনে
- (iv) Visualization: true vs randomized singular values overlay; runtime তুলনার bar chart (
time.perf_counter)
Success criteria:
- [ ] শীর্ষ ১০টা singular value full SVD-র সাথে আপেক্ষিক ভুল \(<10^{-6}\)-এ মেলে (noise-ছোট হলে)
- [ ] Reconstruction error full rank-\(k\) SVD-র (Eckart–Young optimum) খুব কাছে
- [ ] তোমার scratch randomized SVD full SVD-র চেয়ে দ্রুত (এই আকারেই; বড় matrix-এ ব্যবধান আরো নাটকীয়)
কিভাবে এগোবে — প্রস্তাবিত রুটিন¶
দিনে ২–৩ ঘণ্টা হিসেবে ~২ সপ্তাহ:
| দিন | কাজ |
|---|---|
| ১–২ | Project 1 (LS regression) — সবচেয়ে সহজ, ছন্দ পাওয়ার জন্য |
| ৩–৪ | Project 2 (PCA) |
| ৫–৬ | Project 3 (SVD compression) |
| ৭–৮ | Project 4 (eigenvalue algorithms) |
| ৯–১০ | Project 5 (classification) |
| ১১–১২ | Project 6 (PageRank) |
| ১৩–১৪ | Project 7 (randomized SVD) + পুরো notebook একবার top-to-bottom চালানো |
সোনার নিয়ম: আগে নিজে চেষ্টা → আটকালে সংশ্লিষ্ট Part-এর chapter → তারপরেই capstone.ipynb-এর solution। Solution দেখে বুঝলে সেটা বোঝা; দেখে টাইপ করলে সেটা শুধু টাইপিং প্র্যাকটিস। 😊
শেষ পরীক্ষা (plan.md-র প্রতিশ্রুতি): সাতটা প্রজেক্ট শেষ হলে MIT 18.065-এর একটা problem set খুলে বসো। যদি আটকে না যাও — তুমি সত্যিই "expert" লেভেলে পৌঁছেছ। 🎓