কনটেন্টে যান

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:

  1. Synthetic data বানাও: \(y = 3 + 2x - 0.5x^2 + \varepsilon\), \(\varepsilon \sim N(0, 2^2)\), \(n = 60\)
  2. (i) Scratch: design matrix \(X = [\mathbf{1}, x, x^2]\) গড়ে normal equations \(X^TX\beta = X^Ty\) solve করো — np.linalg.solve দিয়ে (inverse নয়!)
  3. (ii) Library: np.linalg.lstsq এবং sklearn.linear_model.LinearRegression — তিনটা উত্তর মেলাও
  4. (iii) Derivation: \(\|X\beta - y\|^2\) minimize করা থেকে normal equations — gradient শূন্য করে
  5. (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:

  1. Correlated 2D Gaussian data বানাও (\(n=300\)), সাথে একটা 5D dataset যার আসল intrinsic dimension 2
  2. (i) Scratch: data center করো → covariance matrix \(C = \frac{1}{n-1}X_c^TX_c\)np.linalg.eigh → eigenvalue ক্রমে সাজাও → project
  3. (ii) Library: sklearn.decomposition.PCA — components ও explained variance মেলাও (sign flip সামলে)
  4. (iii) Derivation: "variance maximize করা unit vector = বৃহত্তম eigenvalue-র eigenvector" — Rayleigh quotient যুক্তি
  5. (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:

  1. NumPy দিয়ে একটা synthetic grayscale ছবি বানাও (gradient + বৃত্ত + আয়তক্ষেত্র, \(128\times128\)) — download নয়
  2. (i) Scratch: np.linalg.svd থেকে \(U, \Sigma, V^T\) নিয়ে নিজে rank-\(k\) পুনর্গঠন লেখো: \(A_k = \sum_{i=1}^k \sigma_i u_i v_i^T\)
  3. (ii) Library: পুরো matrix পুনর্গঠন করে যাচাই; np.linalg.matrix_rank-এ approximation-এর rank
  4. (iii) Derivation: Eckart–Young theorem-এর statement + storage হিসাব: \(k(m+n+1)\) বনাম \(mn\)
  5. (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:

  1. একটা random symmetric \(6\times6\) matrix বানাও (\(A = B + B^T\))
  2. (i) Scratch: power method (normalize প্রতি ধাপে) → বৃহত্তম \(|\lambda|\); তারপর unshifted QR algorithm ৩০০ iteration → সব eigenvalue
  3. (ii) Library: np.linalg.eigh-এর সাথে মেলাও
  4. (iii) Derivation: \(A^kv_0\)-তে বৃহত্তম eigenvalue-র term কেন জেতে — \(v_0 = \sum c_i q_i\) expansion দিয়ে
  5. (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:

  1. দুই class-এর 2D Gaussian blob বানাও (\(n=200\), খানিকটা overlap সহ), label \(y \in \{-1, +1\}\); train/test ভাগ করো (75/25)
  2. (i) Scratch: feature matrix \([\mathbf{1}, x_1, x_2]\)-তে least squares fit; prediction \(\hat{y} = \mathrm{sign}(X\beta)\)
  3. (ii) Library: sklearn.linear_model.RidgeClassifier (α≈0) বা LogisticRegression-এর সাথে accuracy তুলনা
  4. (iii) Derivation: decision boundary \(\beta_0 + \beta_1x_1 + \beta_2x_2 = 0\) কেন একটা সরলরেখা — আর এটাই hyperplane ধারণার প্রয়োগ
  5. (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:

  1. ১০-node-এর একটা ছোট directed web graph বানাও (adjacency matrix হাতে লিখে; একটা dangling node রেখো)
  2. (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
  3. (ii) Library: np.linalg.eig দিয়ে \(G\)-র eigenvalue-1 eigenvector বের করে normalize — মেলাও
  4. (iii) Derivation: rank vector কেন \(Gr = r\)-এর solution; Perron–Frobenius কেন uniqueness দেয় (statement পর্যায়ে)
  5. (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:

  1. একটা \(600\times400\) প্রায়-low-rank matrix বানাও: \(A = \sum_{i=1}^{15}\sigma_i u_iv_i^T +\) ক্ষীণ noise (দ্রুত-ক্ষয়ে-যাওয়া \(\sigma_i\))
  2. (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\))
  3. (ii) Library: np.linalg.svd (full) এবং sklearn.utils.extmath.randomized_svd-এর সাথে singular value তুলনা
  4. (iii) Derivation: কেন \(A \approx QQ^TA\) যথেষ্ট — range capture-এর যুক্তি ৫ লাইনে
  5. (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" লেভেলে পৌঁছেছ। 🎓