এই পর্বে যা পাবেন
- ছোট matrix-এর rank, null space, eigenvalue, SVD আর positive definite যাচাই; kappa আর PAC-এর নমুনার হিসাব
- Gradient descent-এর স্থিতি, momentum, Adam আর Newton-এর ধাপ, Lagrange, KKT আর soft-thresholding
- MLE, MAP, Mahalanobis, Poisson GLM, bootstrap, McNemar, Holm আর Benjamini–Hochberg
- Huber ও pinball loss, softmax, ECE ও Brier, SVM-এর margin আর dual, kernel, Gini, AdaBoost, gradient boosting আর XGBoost gain
- EM, KDE, isolation forest, Bayesian regression, Gaussian process, Metropolis–Hastings আর expected improvement
- Imbalance, forecasting, NDCG, Kaplan–Meier, Shapley, conformal, PSI, fairness, sample size, CUPED, DiD, CLV আর latency
১ · পাতার নিয়ম, ভাগের মানচিত্র আর খাতার কৌশল
মডিউল ১৪-এ স্বাগতম। ডাক্তার শুধু “জ্বর আছে” লেখেন না; থার্মোমিটারে কত, কতদিন, কোন ওষুধ কত মাত্রায়, সব লেখেন। Machine learning-এও “XGBoost ভালো” বলা যথেষ্ট নয়; একটি split-এর gain কত, একটি boosting রাউন্ডে ওজন কীভাবে বদলায়, conformal interval কত চওড়া, হাতে দেখাতে পারা দরকার। বিশ্ববিদ্যালয়ের Machine Learning, Pattern Recognition বা Data Mining কোর্সের পরীক্ষায়, চাকরির লিখিত পরীক্ষায় আর data scientist বা ML engineer ইন্টারভিউতে এ ধরনের ছোট হিসাব প্রায়ই আসে। মডিউলের পরের পর্বগুলো অন্য দিক দেখবে: পর্ব ৭৪ (MCQ প্রশ্নব্যাংক), পর্ব ৭৫ (লিখিত ও মৌখিক প্রশ্ন), পর্ব ৭৬ (ML coding ইন্টারভিউ) আর পর্ব ৭৭ (ধারণা আর system design ইন্টারভিউ)।
কোন ভাগে কী, কোন পর্ব ঝালাবেন
| ভাগ | মডিউল ও কী আছে | মূল পর্ব |
|---|---|---|
| ২ | ১–২: kappa, PAC, rank, eigenvalue, positive definite, SVD | ০৩, ০৫, ০৬, ০৮–১০ |
| ৩ | ৩: gradient descent, momentum, Adam, Newton, Lagrange, KKT, lasso | ১২–১৭ |
| ৪ | ৪: MLE, MAP, Mahalanobis, GLM, bootstrap, McNemar, Holm | ১৮–২২ |
| ৫ | ৫–৬: Huber, pinball, softmax, calibration, SVM, kernel | ২৪–৩০ |
| ৬ | ৭: Gini, bagging, AdaBoost, gradient boosting, XGBoost | ৩২–৩৬ |
| ৭ | ৮–৯: EM, KDE, isolation forest, Bayesian regression, GP, MCMC, EI, ELBO | ৩৯, ৪০, ৪৩, ৪৫–৪৯ |
| ৮ | ১০: imbalance, smoothing, MASE, matrix factorization, NDCG, Kaplan–Meier, active learning | ৫০–৫৫ |
| ৯ | ১১: Shapley, PDP, permutation importance, conformal, PSI, fairness | ৫৬–৬০ |
| ১০ | ১২–১৩: sample size, z-test, CUPED, DiD, SRM, CLV, latency, Little’s law, memory | ৬২–৬৫, ৬৮–৭০ |
এই পাতার নিয়ম — প্রশ্নে অন্য কিছু না বললে
| বিষয় | নিয়ম |
|---|---|
| log | ln (স্বাভাবিক log); শুধু decision tree-র entropy আর information gain-এ log2 (একক bit) |
| দশমিক | মাঝের ধাপে ৪–৫ ঘর, শেষ উত্তর প্রশ্ন যত ঘর চায় |
| Variance | নমুনা থেকে standard error: n − ১ দিয়ে ভাগ; MLE-তে n দিয়ে |
| Test | α = ০.০৫, দুই দিকের (two-sided); McNemar-এ continuity correction-সহ |
| Percentile | Latency-তে nearest rank: ⌈q × n⌉-তম ছোট মান (পর্ব ৬৮-এর নিয়ম) |
| ধাপ | “এক ধাপ” মানে θ ← θ − η × gradient; η (eta) হলো learning rate |
১. দেওয়া তথ্য এক লাইনে। “n = ১০, k = ৭, Beta(২, ২)” লিখে নিলে পরের ধাপে ভুল সংখ্যা বসে না।
২. সংজ্ঞা ঘোষণা করুন। NDCG-এর IDCG কোন item থেকে, percentile কোন নিয়মে, lasso-র objective-এ ½ আছে কি না। একই প্রশ্নে সংজ্ঞা বদলালে উত্তরও বদলায়।
৩. সূত্র আগে, মান পরে। হিসাবে ভুল হলেও সূত্র দেখে পরীক্ষক যুক্তি বোঝেন।
৪. এক লাইনের যাচাই। Eigenvalue-র যোগফল = trace, Shapley-র যোগফল = v(সব) − v(∅), AdaBoost-এর পরে ভুলের মোট ওজন ০.৫, ‖A‖F2 = ∑σ2.
৫. অর্থ এক লাইনে। “κ = ০.৪৯” লিখেই থামবেন না; বলুন, “৭৫% মিলের অর্ধেকের বেশি কাকতালীয়ভাবেই আসত।”
২ · মডিউল ১–২ — শেখার তত্ত্ব, label-এর মান আর linear algebra
ঝালিয়ে নিন: পর্ব ০৩ · শেখার তত্ত্ব, পর্ব ০৫ · Label আর ডেটার মান, পর্ব ০৬ · Vector space আর rank, পর্ব ০৮ · Eigenvalue, পর্ব ০৯ · SVD, পর্ব ১০ · Positive definite matrix.
Cohen’s κ = (po − pe) ÷ (১ − pe). সসীম H-এর PAC bound: n ≥ (ln|H| + ln(২/δ)) ÷ (২ε2). Rank–nullity: rank + nullity = column-সংখ্যা। Eigenvalue: det(A − λI) = ০; যোগফল trace, গুণফল det. Positive definite: সব leading minor ধনাত্মক (Sylvester). SVD: σi = √(AᵀA-এর eigenvalue); rank-k-এর সেরা ভুল (Frobenius) = √(বাকি σ2-এর যোগ)।
২.১(সহজ) দুজন annotator ১০০টি বাংলা রিভিউকে pos বা neg দাগিয়েছেন: দুজনেই pos ৪৫, দুজনেই neg ৩০, প্রথমজন pos কিন্তু দ্বিতীয়জন neg ১৫, উল্টোটা ১০। (ক) Observed agreement po কত? (খ) Chance agreement pe? (গ) Cohen’s κ কত, আর তা কী বলে? (ঝালিয়ে নিন: পর্ব ০৫)
(a) po = (45 + 30) / 100 = 0.75
(b) annotator 1 pos = (45 + 15)/100 = 0.60 ; annotator 2 pos = (45 + 10)/100 = 0.55
pe = 0.60 x 0.55 + 0.40 x 0.45 = 0.33 + 0.18 = 0.51
(c) kappa = (0.75 - 0.51) / (1 - 0.51) = 0.24 / 0.49 = 0.4898
৭৫% মিল শুনতে ভালো, কিন্তু দুজন নিজের অভ্যাসমতো এলোমেলো দাগালেও ৫১% মিলত। κ ≈ ০.৪৯ মানে কাকতালীয়ের বাইরে সম্ভাব্য মিলের অর্ধেকের মতো পাওয়া গেছে। পরের কাজ: guideline স্পষ্ট করা আর মতভেদের ২৫টি রিভিউ আবার দেখা। κ-এর “মাঝারি”, “ভালো” সীমাগুলো হাতের নিয়ম, তত্ত্ব নয়।
২.২(মাঝারি) একটি সসীম hypothesis class-এ |H| = ১,০০০টি নিয়ম। Bound n ≥ (ln|H| + ln(২/δ)) ÷ (২ε2) ধরে (ক) ε = δ = ০.০৫-এ কত নমুনা যথেষ্ট? (খ) n = ৫০০ হলে ৯৫% নিশ্চয়তায় ε কত? (গ) |H| = ১০,০০০ হলে (ক)-র উত্তর কত? (ঘ) সমতলে সরলরেখা দিয়ে ভাগ করা classifier-এর VC dimension কত? (ঝালিয়ে নিন: পর্ব ০৩)
(a) ln 1000 = 6.9078 ; ln(2/0.05) = ln 40 = 3.6889
n >= (6.9078 + 3.6889) / (2 x 0.05^2) = 10.5967 / 0.005 = 2119.3 -> 2120
(b) eps = sqrt(10.5967 / (2 x 500)) = sqrt(0.010597) = 0.1029
(c) ln 10000 = 9.2103 -> n >= 12.8992 / 0.005 = 2579.8 -> 2580
(d) VC = d + 1 = 3 : some 3 points can be shattered, no 4 points can (XOR)
H দশ গুণ হলেও n বাড়ে মাত্র ৪৬০ (ln ১০ ÷ ২ε2), কারণ |H| ঢোকে log হয়ে; অথচ ε অর্ধেক করলে n চার গুণ। Bound সঠিক কিন্তু রক্ষণশীল: পর্ব ০৩-এর simulation-এ অনেক কম নমুনাতেই ব্যর্থতা ৫%-এর নিচে ছিল।
২.৩(সহজ) A-এর তিনটি সারি (১, ২, ৩), (২, ৪, ৬), (১, ০, ১)। (ক) rank আর nullity কত? (খ) Null space-এর একটি basis দিন। (গ) Ax = (৬, ১২, ২)-এর সমাধান আছে কি? থাকলে সব সমাধান লিখুন। (ঝালিয়ে নিন: পর্ব ০৬)
(a) row2 = 2 x row1 ; row1 and row3 independent -> rank 2
nullity = 3 - 2 = 1
(b) x + 2y + 3z = 0 and x + z = 0 -> x = -z, y = -z
basis (-1, -1, 1) ; check A(-1, -1, 1) = (0, 0, 0)
(c) 12 = 2 x 6, same relation as the rows -> consistent ; A(1, 1, 1) = (6, 12, 2)
all solutions: (1, 1, 1) + t(-1, -1, 1)
Column-এর চোখে: col3 = col1 + col2. এটি design matrix হলে XᵀX singular, coefficient অনন্য নয়: (১, ১, ১) আর (০, ০, ২) একই অনুমান দেয়। Multicollinearity-র এটিই চরম রূপ।
২.৪(মাঝারি) দুই feature-এর covariance Σ-এর সারি (৩, ১) আর (১, ৩)। (ক) Eigenvalue আর eigenvector কী? (খ) প্রথম principal component কত ভাগ variance ধরে? (গ) Σ কি positive definite? দুইভাবে দেখান। (ঘ) সারি (১, ২), (২, ১) এমন matrix কি কোনো ডেটার covariance হতে পারে? (ঝালিয়ে নিন: পর্ব ০৮, ১০)
(a) det(S - l I) = (3 - l)^2 - 1 = 0 -> l = 4, 2
l = 4: (1, 1)/sqrt2 ; l = 2: (1, -1)/sqrt2 (orthogonal)
(b) 4 / (4 + 2) = 0.6667
(c) minors 3 > 0, det = 9 - 1 = 8 > 0 -> positive definite
or: both eigenvalues > 0 ; x = (1, -1): x^T S x = 3 - 2 + 3 = 4 > 0
(d) eigenvalues 3 and -1 ; det = -3 < 0 -> indefinite: not a covariance
যাচাই: trace ৬ = ৪ + ২, det ৮ = ৪ × ২. (ঘ)-তে (১, −১)/√২ দিকে “variance” −১ আসত, যা অসম্ভব; তাই covariance সবসময় positive semidefinite.
২.৫(কঠিন) A-এর সারি (৩, ০) আর (৪, ৫)। (ক) Singular value দুটি কত? একটি যাচাই দিন। (খ) সেরা rank-১ approximation A1 আর তার ভুল ‖A − A1‖F? (গ) Condition number আর pseudo-inverse? (ঝালিয়ে নিন: পর্ব ০৯)
(a) A^T A = [[25, 20], [20, 25]] -> eigenvalues 45, 5
sigma1 = sqrt45 = 6.7082 ; sigma2 = sqrt5 = 2.2361
check: ||A||_F^2 = 9 + 16 + 25 = 50 = 45 + 5
(b) v1 = (1, 1)/sqrt2 ; A v1 = (3, 9)/sqrt2
A1 = A v1 v1^T = [[1.5, 1.5], [4.5, 4.5]]
A - A1 = [[1.5, -1.5], [-0.5, 0.5]] ; ||.||_F = sqrt(2.25+2.25+0.25+0.25) = sqrt5 = 2.2361
(c) cond = sigma1 / sigma2 = 3 ; det = 15, full rank -> pseudo-inverse = inverse
A^+ = (1/15) [[5, 0], [-4, 3]]
(খ)-র ভুল ঠিক σ2: Eckart–Young উপপাদ্যের কথা। Recommender-এর low-rank approximation এই নীতিতে চলে: ছোট singular value বাদ দিলে কতটা হারালেন, তা সংখ্যাতেই জানা।
import numpy as np
np.set_printoptions(precision=4, suppress=True)
T = np.array([[45, 15], [10, 30]]) / 100 # 2.1: rows A pos/neg, cols B pos/neg
po = np.trace(T); pe = T.sum(1) @ T.sum(0)
print("2.1 po", po, "pe", round(pe, 4), "kappa", round((po - pe) / (1 - pe), 4))
H, eps, dlt = 1000, 0.05, 0.05 # 2.2
need = (np.log(H) + np.log(2 / dlt)) / (2 * eps**2)
print("2.2 n >=", round(need, 1), "-> n =", int(np.ceil(need)),
"| eps at n=500:", round(np.sqrt((np.log(H) + np.log(2 / dlt)) / 1000), 4),
"| |H|=10^4:", int(np.ceil((np.log(1e4) + np.log(40)) / 0.005)))
A = np.array([[1, 2, 3], [2, 4, 6], [1, 0, 1]]) # 2.3
print("2.3 rank", np.linalg.matrix_rank(A), "| A@(-1,-1,1)", A @ [-1, -1, 1],
"| A@(1,1,1)", A @ [1, 1, 1])
S = np.array([[3., 1], [1, 3]]) # 2.4
lam, V = np.linalg.eigh(S)
print("2.4 eig", lam, "| PC1 share", round(lam[-1] / lam.sum(), 4),
"| minors", S[0, 0], round(np.linalg.det(S), 4),
"| eig [[1,2],[2,1]]", np.linalg.eigvalsh([[1., 2], [2, 1]]))
M = np.array([[3., 0], [4, 5]]) # 2.5
U, s, Vt = np.linalg.svd(M)
A1 = s[0] * np.outer(U[:, 0], Vt[0])
print("2.5 sigma", s, "| sigma^2", s**2, "| ||A||_F^2", (M**2).sum())
print(" A1\n", A1, "\n ||A-A1||_F", round(np.linalg.norm(M - A1), 4),
"| cond", round(s[0] / s[1], 4), "\n pinv*15\n", np.round(np.linalg.pinv(M) * 15, 9) + 0.0)প্রথম লাইন 2.1 po 0.75 pe 0.51 kappa 0.4898. দ্বিতীয় লাইনে n = 2120, eps at n=500: 0.1029 আর |H|=10^4: 2580. 2.3 rank 2, null vector-এ [0 0 0] আর (১, ১, ১)-এ [ 6 12 2]. 2.4 eig [2. 4.], ভাগ 0.6667, minor 3.0 8.0, আর দ্বিতীয় matrix-এ [-1. 3.]. শেষে singular value [6.7082 2.2361], A1-এর সারি [1.5 1.5] আর [4.5 4.5], ভুল 2.2361, cond 3.0 আর ১৫ গুণ pseudo-inverse [[ 5. 0.] [-4. 3.]].
৩ · মডিউল ৩ — Optimization: gradient, momentum, Adam, Newton আর KKT
ঝালিয়ে নিন: পর্ব ১২ · Convexity, পর্ব ১৩ · Gradient descent-এর পরিবার, পর্ব ১৪ · Momentum আর Adam, পর্ব ১৫ · Newton, পর্ব ১৬ · Lagrange আর KKT, পর্ব ১৭ · Regularization-এর তত্ত্ব.
Quadratic বাটিতে প্রতিটি eigen-দিকের ভুল প্রতি ধাপে (১ − ηλ) গুণ; স্থির যদি η < ২/L. Momentum: v ← βv − η∇f, x ← x + v. Adam: m ← β1m + (১ − β1)g, v ← β2v + (১ − β2)g2, m̂ = m/(১ − β1t), v̂ = v/(১ − β2t), x ← x − α m̂/(√v̂ + ε). Newton: x ← x − f′/f″. Lagrange: ∇f = λ∇h. KKT: stationarity, primal ও dual feasibility (μ ≥ ০), complementary slackness (μg = ০)। Soft-thresholding: S(z, λ) = sign(z) max(|z| − λ, ০)।
৩.১(সহজ) f(w) = ½(২w12 + ৮w22), শুরু (১, ১)। (ক) η = ০.১-এ এক ধাপ পরে w আর loss কত? (খ) কোন η পর্যন্ত gradient descent স্থির, সেরা η কত আর তখন ভুল কোন হারে কমে? (গ) η = ০.৩ হলে কী হয়? f কি convex? (ঝালিয়ে নিন: পর্ব ১২, ১৩)
grad = (2 w1, 8 w2) -> each coordinate times (1 - eta x lambda), lambda = 2, 8
(a) eta 0.1: factors 0.8, 0.2 -> w = (0.8, 0.2)
loss 5 -> 0.5 (2 x 0.64 + 8 x 0.04) = 0.8 ; next steps 0.416, 0.2624
(b) stable if eta < 2/L = 2/8 = 0.25
best eta = 2/(mu + L) = 2/10 = 0.2 -> factors 0.6, -0.6
rate (kappa - 1)/(kappa + 1) = 3/5 = 0.6 with kappa = L/mu = 4
(c) eta 0.3: w2 factor 1 - 2.4 = -1.4, |.| > 1 -> diverges: 8.0, 15.392, 30.12
Hessian diag(2, 8), both > 0 -> strongly convex
ফাঁদ: প্রথম ধাপে η = ০.১-এর loss (০.৮) η = ০.২-এর (১.৮) চেয়ে কম দেখায়, অথচ তিন ধাপ পরে ০.২ এগিয়ে (০.২৩৩ বনাম ০.২৬২), কারণ ধীর দিকের গুণক ০.৮-এর বদলে ০.৬. η = ০.২-তে w2 প্রতি ধাপে চিহ্ন বদলায় (zig-zag), তবু ছোট হয়।
৩.২(মাঝারি) f(x) = x2, x0 = ১. (ক) Momentum β = ০.৯, η = ০.১-এ দুই ধাপের v আর x? (খ) Adam α = ০.১, β1 = ০.৯, β2 = ০.৯৯৯, ε = ১০−৮-এ দুই ধাপ? (গ) Bias correction না থাকলে Adam-এর প্রথম ধাপ কত বড় হতো? (ঝালিয়ে নিন: পর্ব ১৪)
(a) g0 = 2 ; v1 = 0.9 x 0 - 0.1 x 2 = -0.2 ; x1 = 0.8
g1 = 1.6 ; v2 = 0.9 x (-0.2) - 0.16 = -0.34 ; x2 = 0.46
(b) t=1: g = 2 ; m = 0.1 x 2 = 0.2 ; v = 0.001 x 4 = 0.004
mhat = 0.2/0.1 = 2 ; vhat = 0.004/0.001 = 4 ; x1 = 1 - 0.1 x 2/2 = 0.9
t=2: g = 1.8 ; m = 0.18 + 0.18 = 0.36 ; v = 0.003996 + 0.00324 = 0.007236
mhat = 0.36/0.19 = 1.8947 ; vhat = 0.007236/0.001999 = 3.6198
x2 = 0.9 - 0.1 x 1.8947/1.9026 = 0.8004
(c) 0.1 x 0.2 / sqrt(0.004) = 0.1 x 3.1623 = 0.3162 (three times too big)
Adam-এর প্রথম ধাপ প্রায় ঠিক α, gradient যত বড়ই হোক, কারণ m̂ ÷ √v̂ = g ÷ |g|. Momentum-এ দ্বিতীয় ধাপ প্রথমটির চেয়ে বড় (০.৩৪ বনাম ০.২০): বেগ জমছে। নিচু ঢালেও বড় পা, এটিই তার সুবিধা আর দোলার কারণ।
৩.৩(মাঝারি) f(x) = ex − ২x, x0 = ০. (ক) সর্বনিম্ন বিন্দু কোথায়? (খ) Newton-এর চার ধাপের x কত? (গ) প্রতি ধাপে ভুল কীভাবে কমে? (ঝালিয়ে নিন: পর্ব ১৫)
(a) f'(x) = e^x - 2 = 0 -> x* = ln 2 = 0.693147 ; f''(x) = e^x > 0 (convex)
(b) x1 = 0 - (1 - 2)/1 = 1
x2 = 1 - (e - 2)/e = 1 - 0.718282/2.718282 = 0.735759
x3 = 0.694042 ; x4 = 0.693148
(c) errors: 0.3069, 0.0426, 0.00090, 0.0000004 -> correct digits roughly double
এটিই quadratic convergence: সমাধানের কাছে ভুল প্রায় আগের ভুলের বর্গের সমানুপাতিক। দাম হলো f″ (বহু মাত্রায় Hessian) হিসাব আর তার সমাধান; তাই বড় model-এ L-BFGS-এর মতো আসন্ন পদ্ধতি।
৩.৪(কঠিন) (ক) x2 + y2-কে ২x + y = ৫ শর্তে ছোট করুন; λ কত? (খ) (x − ৩)2 + (y − ২)2-কে x + y ≤ ৪ শর্তে ছোট করুন; KKT-র চারটি শর্ত যাচাই করুন, μ কত? (গ) শর্ত x + y ≤ ৬ হলে? (ঝালিয়ে নিন: পর্ব ১৬)
(a) grad f = lambda grad h: 2x = 2 lambda, 2y = lambda -> x = lambda, y = lambda/2
2 lambda + lambda/2 = 5 -> lambda = 2 -> (x, y) = (2, 1), f = 5
(b) unconstrained min (3, 2): 3 + 2 = 5 > 4 -> violates, so the constraint is active
L = f + mu (x + y - 4): 2(x - 3) + mu = 0, 2(y - 2) + mu = 0
-> x - 3 = y - 2 and x + y = 4 -> (2.5, 1.5), mu = 1, f = 0.5
stationarity ok ; primal 4 <= 4 ok ; dual mu = 1 >= 0 ok ; mu x g = 1 x 0 = 0 ok
(c) (3, 2) is feasible -> inactive, mu = 0, f = 0
μ = ১ হলো shadow price: সীমা ৪ থেকে ৪ + δ করলে সর্বনিম্ন f = (১ − δ)2/২, তার ঢাল δ = ০-তে −১. SVM-এর dual-এ αi এই একই ভূমিকা নেয়: শুধু “দেয়ালে ঠেকা” বিন্দুর α শূন্য নয়।
৩.৫(মাঝারি) Orthonormal design-এ OLS coefficient z = (৩, −০.৮, ১.৫), λ = ১, objective-এ ½‖y − Xw‖2. (ক) Lasso-র সমাধান? (খ) Ridge-এর (w = z ÷ (১ + λ))? (গ) কোন prior-এর MAP কোনটি, আর λ কত হলে lasso-র সব weight শূন্য? (ঝালিয়ে নিন: পর্ব ১৭)
(a) S(z, 1) = sign(z) max(|z| - 1, 0)
3 -> 2 ; -0.8 -> 0 ; 1.5 -> 0.5 => (2, 0, 0.5)
(b) z / 2 = (1.5, -0.4, 0.75) (smaller, never exactly 0)
(c) lasso = MAP with a Laplace prior ; ridge = MAP with a Gaussian prior
all lasso weights are 0 when lambda >= max|z| = 3
Lasso প্রতিটি coefficient থেকে একই পরিমাণ (λ) কাটে আর ছোটগুলো শূন্য করে; ridge সবাইকে একই অনুপাতে ছোট করে। তাই feature বাছাইয়ে lasso, সম্পর্কিত feature-এর মধ্যে ভার ভাগ করতে ridge.
import numpy as np
lam = np.array([2.0, 8.0]); f = lambda w: 0.5 * (lam * w**2).sum() # 3.1
for eta in [0.1, 0.2, 0.3]:
w = np.array([1.0, 1.0]); path = []
for _ in range(3): w = w - eta * lam * w; path.append(round(float(f(w)), 4))
print(f"3.1 eta={eta}: factors {1 - eta * lam}, loss after 1-3 steps {path}")
x, v = 1.0, 0.0 # 3.2 momentum on x^2
for t in range(2): v = 0.9 * v - 0.1 * 2 * x; x = x + v; print(f"3.2 momentum t={t+1}: v={v:.4f} x={x:.4f}")
x, m, s = 1.0, 0.0, 0.0 # Adam
for t in range(1, 3):
g = 2 * x; m = 0.9 * m + 0.1 * g; s = 0.999 * s + 0.001 * g * g
mh, sh = m / (1 - 0.9**t), s / (1 - 0.999**t); x -= 0.1 * mh / (np.sqrt(sh) + 1e-8)
print(f" adam t={t}: m={m:.4f} v={s:.6f} mhat={mh:.4f} vhat={sh:.4f} x={x:.6f}")
print(" no bias correction, step 1:", round(0.1 * 0.2 / np.sqrt(0.004), 4))
x = 0.0 # 3.3 Newton on e^x - 2x
for t in range(4): x = x - (np.exp(x) - 2) / np.exp(x); print(f"3.3 newton x{t+1} = {x:.6f}")
print(" ln 2 =", round(np.log(2), 6))
A = np.array([[2, 0, -2], [0, 2, -1], [2, 1, 0]]); b = np.array([0, 0, 5]) # 3.4(a) KKT linear system
print("3.4a (x, y, lambda) =", np.linalg.solve(A, b))
x, y = 2.5, 1.5; mu = -2 * (x - 3) # 3.4(b)
print(f"3.4b grad f + mu grad g = {2*(x-3)+mu:.1f}, {2*(y-2)+mu:.1f}; mu = {mu}; f = {(x-3)**2 + (y-2)**2}")
z = np.array([3.0, -0.8, 1.5]); L = 1.0 # 3.5
print("3.5 lasso", np.sign(z) * np.maximum(np.abs(z) - L, 0) + 0.0, "| ridge", np.round(z / (1 + L), 4))তিনটি η-র লাইন: eta=0.1-এ loss [0.8, 0.416, 0.2624], eta=0.2-এ [1.8, 0.648, 0.2333], আর eta=0.3-এ গুণক -1.4 ও loss [8.0, 15.392, 30.1222]. Momentum x=0.8000 আর x=0.4600; Adam x=0.900000 আর x=0.800412, bias correction ছাড়া প্রথম ধাপ 0.3162. Newton 1.000000, 0.735759, 0.694042, 0.693148, পাশে ln 2 = 0.693147. শেষে (x, y, lambda) = [2. 1. 2.], mu = 1.0; f = 0.5, আর lasso [2. 0. 0.5] | ridge [ 1.5 -0.4 0.75].
৪ · মডিউল ৪ — MLE, MAP, Gaussian, GLM, bootstrap আর model তুলনার test
ঝালিয়ে নিন: পর্ব ১৮ · MLE আর MAP, পর্ব ১৯ · Multivariate Gaussian, পর্ব ২০ · GLM, পর্ব ২১ · Bootstrap, পর্ব ২২ · Model তুলনার পরিসংখ্যান.
Bernoulli MLE k/n; Beta(a, b) prior-এ MAP (k + a − ১)/(n + a + b − ২), posterior mean (k + a)/(n + a + b). Mahalanobis d2 = (x − μ)ᵀΣ−১(x − μ)। শর্তসাপেক্ষ Gaussian: গড় μ1 + Σ12Σ22−১(x2 − μ2), variance Σ11 − Σ12Σ22−১Σ21. Poisson GLM: log μ = Xβ, eβ = rate ratio. McNemar: χ2 = (|b − c| − ১)2/(b + c). Holm: k-তম ছোট p ≤ α/(m − k + ১); BH: p(k) ≤ kα/m-এর সবচেয়ে বড় k.
৪.১(সহজ) ১০টি ডেলিভারির ৭টি সময়মতো। (ক) সময়মতো হওয়ার সম্ভাবনার MLE? (খ) Beta(২, ২) prior-এ MAP আর posterior mean? (গ) পাঁচ দিনে বাতিল অর্ডার ৩, ৫, ২, ৪, ৬: Poisson λ-এর MLE derive করুন। (ঝালিয়ে নিন: পর্ব ১৮)
(a) theta_MLE = k/n = 7/10 = 0.7
(b) MAP = (7 + 2 - 1)/(10 + 2 + 2 - 2) = 8/12 = 0.6667
posterior Beta(9, 5): mean = 9/14 = 0.6429
(c) log L = (sum x) ln l - n l + const = 20 ln l - 5 l
d/dl = 20/l - 5 = 0 -> l = 4 (the sample mean)
Prior-এর mode ০.৫, তাই MAP ০.৭ থেকে ০.৫-এর দিকে সরে: MAP = w(k/n) + (১ − w)(০.৫), w = ১০/১২. n = ১,০০০ হলে w প্রায় ১, prior-এর টান প্রায় নেই।
৪.২(মাঝারি) গড় (০, ০), Σ-এর সারি (৪, ২) আর (২, ৩)। (ক) Σ−১? (খ) বিন্দু (২, ২) আর (২, −২)-এর Mahalanobis আর Euclidean দূরত্ব? (গ) x2 = ৩ জানা থাকলে x1-এর শর্তসাপেক্ষ গড় আর variance? (ঝালিয়ে নিন: পর্ব ১৯)
(a) det = 12 - 4 = 8 ; S^-1 = (1/8) [[3, -2], [-2, 4]]
(b) (2, 2) : (3x4 - 2x2x2x2 + 4x4)/8 = (12 - 16 + 16)/8 = 1.5 -> d = 1.2247
(2, -2): (12 + 16 + 16)/8 = 44/8 = 5.5 -> d = 2.3452
Euclidean both sqrt8 = 2.8284
(c) mean = 0 + (2/3)(3 - 0) = 2 ; var = 4 - 2^2/3 = 2.6667
দুটি বিন্দু কেন্দ্র থেকে সমান দূরে, কিন্তু (২, −২) ধনাত্মক correlation-এর উল্টো দিকে, তাই Mahalanobis-এ প্রায় দ্বিগুণ “অস্বাভাবিক”। (গ)-তে variance ৪ থেকে ২.৬৭: x2 জানলে x1-এর অনিশ্চয়তা কমে।
৪.৩(মাঝারি) দৈনিক ফেরত-অনুরোধের Poisson GLM: log μ = ০.৫ + ০.৩x1 − ০.২x2 (x1 = চলতি প্রচারের সংখ্যা, x2 = নতুন ছাড়ের স্তর)। (ক) x1 = ২, x2 = ১-এ প্রত্যাশিত গণনা? (খ) x1 এক বাড়লে আর x2 এক বাড়লে কী হয়? (গ) একই শর্তে ১০ দিনের মোট (offset log ১০)? (ঝালিয়ে নিন: পর্ব ২০)
(a) eta = 0.5 + 0.6 - 0.2 = 0.9 ; mu = e^0.9 = 2.4596 per day
(b) e^0.3 = 1.3499 -> about 35% more (multiplied, not "+0.3")
e^-0.2 = 0.8187 -> about 18% fewer
(c) mu = e^(0.9 + ln 10) = 10 x 2.4596 = 24.596
সবচেয়ে প্রচলিত ভুল: ০.৩-কে “০.৩টি বেশি অনুরোধ” পড়া। Log link-এ প্রভাব গুণে আসে, তাই একই coefficient বড় μ-তে বেশি সংখ্যা যোগ করে।
৪.৪(মাঝারি) (ক) ৫ সারির ডেটায় একটি নির্দিষ্ট সারি একটি bootstrap নমুনায় একবারও না ওঠার সম্ভাবনা? n = ১০০-এ? সীমা? (খ) ১০টি bootstrap নমুনার গড় ডেলিভারি সময় ৩১, ২৯, ৩৪, ৩০, ৩২, ২৮, ৩৩, ৩০, ৩৫, ২৮ মিনিট: bootstrap standard error? (গ) ১,০০০টি replicate থেকে ৯৫% percentile interval-এর জন্য সাজানো তালিকার কোন দুটি অবস্থান? (ঝালিয়ে নিন: পর্ব ২১)
(a) (1 - 1/5)^5 = 0.8^5 = 0.3277 ; 0.99^100 = 0.3660 ; limit 1/e = 0.3679
(b) mean = 310/10 = 31 ; deviations 0,-2,3,-1,1,-3,2,-1,4,-3
sum of squares = 54 ; SE = sqrt(54/9) = sqrt6 = 2.4495
(c) 2.5% and 97.5% -> about the 25th and 975th sorted values
(libraries interpolate slightly differently)
(ক)-র ৩৬.৮% থেকেই random forest-এর out-of-bag ডেটা আসে (পর্ব ৩৩)। (খ)-তে ১০টি replicate শুধু হাতের অনুশীলনের জন্য; বাস্তবে হাজারখানেক লাগে, নইলে SE নিজেই অনিশ্চিত।
৪.৫(কঠিন) (ক) একই ২০০টি অর্ডারে দুটি model: দুজনেই ঠিক ১৫০, A ঠিক কিন্তু B ভুল ২২, A ভুল কিন্তু B ঠিক ১০, দুজনেই ভুল ১৮। McNemar-এর χ2, p আর exact p? (খ) পাঁচটি পরীক্ষার p-value ০.০০৪, ০.০৩০, ০.০১২, ০.০৪১, ০.২০, α = ০.০৫: Bonferroni, Holm আর Benjamini–Hochberg কয়টি null বাতিল করে? (ঝালিয়ে নিন: পর্ব ২২)
(a) only discordant cells: b = 22, c = 10
chi2 = (|22 - 10| - 1)^2 / 32 = 121/32 = 3.7813, df 1 -> p = 0.0518
exact: 2 P(X >= 22), X ~ Binomial(32, 0.5) -> p = 0.0501
(b) sorted: 0.004, 0.012, 0.030, 0.041, 0.20 (m = 5)
Bonferroni: p <= 0.01 -> 1 rejected
Holm: 0.004 <= 0.0100 yes ; 0.012 <= 0.0125 yes ; 0.030 <= 0.0167 no -> stop: 2
BH: limits 0.01, 0.02, 0.03, 0.04, 0.05 ; largest k with p(k) <= limit is 3 -> 3
১৫০ আর ১৮ (দুজনেই ঠিক বা দুজনেই ভুল) কে ভালো তা বলে না, তাই হিসাবে নেই। p প্রায় ০.০৫-এর গায়ে: “A ভালো” বলার আগে বেশি ডেটা। Holm Bonferroni-র মতোই family-wise ভুল রক্ষা করে, কিন্তু বেশি ধরে; BH মিথ্যা আবিষ্কারের অনুপাত (FDR) রক্ষা করে, তাই আরও উদার।
import numpy as np
from scipy import stats
k, n, a, b = 7, 10, 2, 2 # 4.1
print("4.1 MLE", k / n, "| MAP", round((k + a - 1) / (n + a + b - 2), 4),
"| post mean", round((k + a) / (n + a + b), 4), "| Poisson MLE", np.mean([3, 5, 2, 4, 6]))
S = np.array([[4., 2], [2, 3]]); Si = np.linalg.inv(S) # 4.2
for x in ([2, 2], [2, -2]):
x = np.array(x); print("4.2", x, "Mahalanobis", round(np.sqrt(x @ Si @ x), 4),
"Euclid", round(np.linalg.norm(x), 4))
print(" x1 | x2=3: mean", S[0, 1] / S[1, 1] * 3, "var", round(S[0, 0] - S[0, 1]**2 / S[1, 1], 4))
eta = 0.5 + 0.3 * 2 - 0.2 * 1 # 4.3
print("4.3 eta", round(eta, 2), "mu", round(np.exp(eta), 4), "| rate ratio x1", round(np.exp(0.3), 4),
"x2", round(np.exp(-0.2), 4), "| 10 days", round(np.exp(eta + np.log(10)), 3))
print(f"4.4 P(row absent) n=5 {0.8**5:.4f} | n=100 {0.99**100:.4f} | 1/e {np.exp(-1):.4f}")
bm = np.array([31, 29, 34, 30, 32, 28, 33, 30, 35, 28])
print(" bootstrap SE", round(bm.std(ddof=1), 4))
b, c = 22, 10 # 4.5
chi = (abs(b - c) - 1)**2 / (b + c)
print("4.5 chi2", chi, "p", round(stats.chi2.sf(chi, 1), 4),
"| exact p", round(2 * stats.binom.sf(max(b, c) - 1, b + c, 0.5), 4))
p = np.array([0.004, 0.030, 0.012, 0.041, 0.20]); o = np.sort(p); m = len(p)
holm = o <= 0.05 / (m - np.arange(m)); bh = o <= 0.05 * np.arange(1, m + 1) / m
print(" sorted", o, "\n Holm ok", holm, "-> rejects", np.argmin(holm),
"\n BH ok ", bh, "-> rejects", np.max(np.nonzero(bh)[0]) + 1, "| Bonferroni", (p <= 0.01).sum())4.1 MLE 0.7 | MAP 0.6667 | post mean 0.6429 | Poisson MLE 4.0. Mahalanobis 1.2247 আর 2.3452, দুটিরই Euclid 2.8284; শর্তসাপেক্ষ mean 2.0 var 2.6667. GLM-এ mu 2.4596, rate ratio 1.3499 আর 0.8187, ১০ দিনে 24.596. Bootstrap লাইনে 0.3277, 0.3660, 0.3679 আর SE 2.4495. McNemar chi2 3.78125 p 0.0518 | exact p 0.0501. শেষ তিন লাইন Holm-এর [ True True False False False] -> rejects 2, BH-এর rejects 3 আর Bonferroni 1 দেখায়।
৫ · মডিউল ৫–৬ — Linear model গভীরে, calibration, SVM আর kernel
ঝালিয়ে নিন: পর্ব ২৪ · Robust আর quantile regression, পর্ব ২৫ · Multiclass, পর্ব ২৬ · Calibration, পর্ব ২৭ · Hard margin, পর্ব ২৮ · Soft margin আর dual, পর্ব ২৯ · Kernel trick, পর্ব ৩০ · Kernel ridge.
r = y − ŷ. Huber (δ): |r| ≤ δ হলে ½r2, নইলে δ(|r| − δ/২)। Pinball (τ): r ≥ ০-এ τr, নইলে (τ − ১)r. Softmax pk = ezk/∑ez; cross-entropy −ln pআসল, gradient p − y. ECE = ∑(nb/N)|ōb − p̄b|; Brier = গড় (p − y)2; Platt: σ(a·s + b). SVM: margin-এর প্রস্থ ২/‖w‖, hinge max(০, ১ − y f(x)), w = ∑αiyixi.
৫.১(সহজ) পাঁচটি ডেলিভারির residual r = y − ŷ: −৩, −০.৫, ০, ১, ৪ (মিনিট)। গড় loss কত (ক) squared loss-এ, (খ) Huber δ = ১-এ, (গ) pinball τ = ০.৯-এ? (ঝালিয়ে নিন: পর্ব ২৪)
(a) (9 + 0.25 + 0 + 1 + 16) / 5 = 26.25 / 5 = 5.25
(b) |r| <= 1 -> 0.5 r^2 ; else |r| - 0.5
-3 -> 2.5 ; -0.5 -> 0.125 ; 0 -> 0 ; 1 -> 0.5 ; 4 -> 3.5 ; mean 1.325
(c) r >= 0 -> 0.9 r ; r < 0 -> -0.1 r
-3 -> 0.3 ; -0.5 -> 0.05 ; 0 -> 0 ; 1 -> 0.9 ; 4 -> 3.6 ; mean 0.97
Squared loss-এ r = ৪ একাই ১৬, মোটের ৬১%; Huber-এ ৩.৫. তাই outlier থাকলে Huber model-কে কম টানে। Pinball τ = ০.৯-এ কম বলা (r > ০) বেশি বলার চেয়ে নয় গুণ দামি, তাই সমাধান ওপরে ওঠে: ৯০তম quantile, “প্রায় সব ডেলিভারি এর মধ্যে”।
৫.২(মাঝারি) তিন শ্রেণির score (২.০, ১.০, ০.১), আসল শ্রেণি দ্বিতীয়টি। (ক) Softmax সম্ভাবনা? (খ) Cross-entropy? (গ) Score-এর সাপেক্ষে gradient? (ঘ) ১০ শ্রেণিতে one-vs-rest আর one-vs-one-এ কয়টি model? (ঝালিয়ে নিন: পর্ব ২৫)
(a) e^2 = 7.389, e^1 = 2.718, e^0.1 = 1.105 ; sum 11.212
p = (0.6590, 0.2424, 0.0986)
(b) CE = -ln 0.2424 = 1.4170
(c) p - y = (0.6590, -0.7576, 0.0986) (sums to 0)
(d) OvR 10 ; OvO 10 x 9 / 2 = 45 ; softmax: one model with 10 scores
Gradient-এর চিহ্ন বলে আসল শ্রেণির score বাড়বে (−০.৭৫৮ বিয়োগ হবে), বাকিদের কমবে; যোগফল ০ কারণ সব score-এ একই ধ্রুবক যোগ করলে softmax বদলায় না।
৫.৩(মাঝারি) ১০টি অর্ডারে ফেরতের অনুমান p = ০.১, ০.২, ০.৩, ০.৪, ০.৬, ০.৭, ০.৮, ০.৯, ০.৯, ০.৯ আর ফল y = ০, ০, ১, ০, ১, ০, ১, ১, ১, ১. (ক) দুই ঝুড়ি [০, ০.৫) আর [০.৫, ১]-এ ECE? (খ) Brier score? (গ) Platt-এর a = ১.৫, b = −০.৫ হলে score s = ১ আর s = ০-এর সম্ভাবনা? (ঝালিয়ে নিন: পর্ব ২৬)
(a) bin 1: 4 items, mean p 0.25, observed 1/4 = 0.25 -> gap 0
bin 2: 6 items, mean p (0.6 + 0.7 + 0.8 + 2.7)/6 = 0.80, observed 5/6 = 0.8333
gap 0.0333
ECE = 0.4 x 0 + 0.6 x 0.0333 = 0.0200
(b) squared errors .01 .04 .49 .16 .16 .49 .04 .01 .01 .01 -> sum 1.42 -> 0.142
(c) sigma(1.5 x 1 - 0.5) = sigma(1) = 0.7311 ; sigma(-0.5) = 0.3775
ECE প্রায় শূন্য, অথচ Brier ০.১৪২: ঝুড়ির ভেতরে ০.৩-এ ফেরত এসেছে আর ০.৭-এ আসেনি, এই ভুল গড়ে মিশে যায়। তাই ECE রোগনির্ণয়ের যন্ত্র; model তুলনায় Brier বা log loss.
৫.৪-এর ছবি — w = (১, ১), b = −৩-এর সীমারেখা আর margin
Solid line f(x) = 0; dashed lines f(x) = ±1. Circles = class +1, squares = class −1
৫.৪(মাঝারি) w = (১, ১), b = −৩, অর্থাৎ f(x) = x1 + x2 − ৩. বিন্দু: A(১, ১) −১, B(২, ২) +১, C(৩, ৩) +১, D(০, ১) −১, E(২, ১.৫) −১, F(১.৫, ২) +১. (ক) Margin-এর প্রস্থ? (খ) প্রতিটির y·f(x) আর hinge loss; কারা margin-এ, কারা নিয়ম ভাঙে? (গ) এই w-এ C = ১-এর soft-margin objective ½‖w‖2 + C∑ξ? (ঘ) C(৩, ৩)-এর সীমারেখা থেকে দূরত্ব? (ঝালিয়ে নিন: পর্ব ২৭, ২৮)
(a) width = 2/||w|| = 2/sqrt2 = 1.4142
(b) A(1,1) -1: f -1 ; yf 1 -> on margin, hinge 0
B(2,2) +1: f 1 ; yf 1 -> on margin, hinge 0
C(3,3) +1: f 3 ; yf 3 -> outside, 0
D(0,1) -1: f -2 ; yf 2 -> outside, 0
E(2,1.5)-1: f 0.5 ; yf -0.5 -> wrong side, hinge 1.5
F(1.5,2)+1: f 0.5 ; yf 0.5 -> inside margin, hinge 0.5
(c) 0.5 x 2 + 1 x (1.5 + 0.5) = 3.0
(d) |f| / ||w|| = 3 / 1.4142 = 2.1213
y·f(x) হলো functional margin; ‖w‖ দিয়ে ভাগ করলে আসল দূরত্ব। Hinge loss শূন্য নয় এমন বিন্দু (E, F) আর margin-এ থাকা বিন্দু (A, B) মিলেই soft-margin-এর support vector হওয়ার প্রার্থী; তবে এখানে w দেওয়া, শেখা নয়।
৫.৫(কঠিন) দুটি বিন্দু x1 = (১, ১), y1 = +১ আর x2 = (−১, −১), y2 = −১. Hard-margin SVM-এর dual সমাধান করুন: α, w, b, margin-এর প্রস্থ, আর dual ও primal-এর মান মেলান। (ঝালিয়ে নিন: পর্ব ২৮)
dual: max sum(a) - 0.5 sum_ij a_i a_j y_i y_j x_i.x_j s.t. sum a_i y_i = 0, a >= 0
sum a y = 0 -> a1 = a2 = a
x1.x1 = 2, x2.x2 = 2, y1 y2 x1.x2 = (+1)(-1)(-2) = 2
objective 2a - 0.5 (2 + 2 + 2 x 2) a^2 = 2a - 4a^2 -> derivative 0 at a = 1/4
w = 0.25 (1, 1) - 0.25 (-1, -1) = (0.5, 0.5)
y1 (w.x1 + b) = 1 -> 1 + b = 1 -> b = 0
width = 2/||w|| = 2/0.7071 = 2.8284 (= distance between the two points)
dual = 2(0.25) - 4(0.0625) = 0.25 = primal 0.5 ||w||^2 = 0.25
Dual আর primal সমান (strong duality), আর দুটি বিন্দুই support vector. Dual-এ x শুধু dot product হয়ে ঢোকে; সেখানে kernel বসালেই kernel SVM.
৫.৬(মাঝারি) x = (১, ২), z = (৩, ১)। (ক) Polynomial kernel (x·z + ১)2 আর স্পষ্ট feature map দিয়ে যাচাই। (খ) RBF exp(−γ‖x − z‖2), γ = ০.৫? (গ) Kernel ridge: এক মাত্রায় x = ০, ১, y = ১, ৩, k(x, x′) = exp(−(x − x′)2), λ = ০.১: α আর f(০.৫)? (ঝালিয়ে নিন: পর্ব ২৯, ৩০)
(a) x.z = 3 + 2 = 5 -> (5 + 1)^2 = 36
phi(v) = (1, sqrt2 v1, sqrt2 v2, v1^2, v2^2, sqrt2 v1 v2)
phi(x).phi(z) = 1 + 6 + 4 + 9 + 4 + 12 = 36
(b) ||x - z||^2 = 4 + 1 = 5 ; e^(-2.5) = 0.0821
(c) K = [[1, e^-1], [e^-1, 1]] = [[1, 0.3679], [0.3679, 1]]
(K + 0.1 I) alpha = y -> alpha = (-0.0034, 2.7284)
f(0.5) = e^-0.25 x (alpha1 + alpha2) = 0.7788 x 2.7250 = 2.1222
(ক)-তে kernel ছয় মাত্রার dot product একটি গুণে সারে। (গ)-তে f(০.৫) = ২.১২, দুই y-এর গড় ২-এর কাছে, কিন্তু λ আর kernel-এর আকারে একটু ওপরে।
import numpy as np
np.set_printoptions(precision=4, suppress=True)
r = np.array([-3, -0.5, 0, 1, 4]) # 5.1 r = y - yhat
hub = np.where(np.abs(r) <= 1, 0.5 * r**2, np.abs(r) - 0.5)
pin = np.where(r >= 0, 0.9 * r, (0.9 - 1) * r)
print("5.1 huber", hub, hub.mean(), "| pinball", pin, round(pin.mean(), 4), "| MSE", (r**2).mean())
z = np.array([2.0, 1.0, 0.1]); p = np.exp(z) / np.exp(z).sum() # 5.2
print("5.2 softmax", p, "CE", round(-np.log(p[1]), 4), "grad", p - [0, 1, 0], "| OvO K=10", 10 * 9 // 2)
P = np.array([.1, .2, .3, .4, .6, .7, .8, .9, .9, .9]); Y = np.array([0, 0, 1, 0, 1, 0, 1, 1, 1, 1])
lo = P < 0.5; ece = sum(m.mean() * abs(P[m].mean() - Y[m].mean()) for m in (lo, ~lo))
print("5.3 ECE", round(ece, 4), "| Brier", round(((P - Y)**2).mean(), 4),
"| Platt s=1, s=0:", np.round(1 / (1 + np.exp(-(1.5 * np.array([1, 0]) - 0.5))), 4))
w, b = np.array([1.0, 1.0]), -3.0 # 5.4
X = np.array([[1, 1], [2, 2], [3, 3], [0, 1], [2, 1.5], [1.5, 2]]); y = np.array([-1, 1, 1, -1, -1, 1])
yf = y * (X @ w + b); xi = np.maximum(0, 1 - yf)
print("5.4 width", round(2 / np.linalg.norm(w), 4), "| y*f", yf, "| hinge", xi,
"| obj C=1", 0.5 * w @ w + xi.sum())
Xd = np.array([[1., 1], [-1, -1]]); yd = np.array([1., -1]); al = np.array([.25, .25]) # 5.5
wd = (al * yd) @ Xd; Q = np.outer(yd, yd) * (Xd @ Xd.T)
print("5.5 w", wd, "| y*(w.x)", yd * (Xd @ wd), "| width", round(2 / np.linalg.norm(wd), 4),
"| dual", al.sum() - 0.5 * al @ Q @ al, "primal", 0.5 * wd @ wd)
phi = lambda v: np.array([1, *(np.sqrt(2) * v), *(v**2), np.sqrt(2) * v[0] * v[1]]) # 5.6
x, zz = np.array([1., 2]), np.array([3., 1])
print("5.6 (x.z+1)^2", (x @ zz + 1)**2, "phi.phi", round(phi(x) @ phi(zz), 6),
"| RBF g=0.5", round(np.exp(-0.5 * ((x - zz)**2).sum()), 4))
K = np.exp(-np.subtract.outer([0., 1], [0., 1])**2); a = np.linalg.solve(K + 0.1 * np.eye(2), [1., 3])
print(" KRR alpha", a, "| f(0.5)", round(np.exp(-np.array([0.25, 0.25])) @ a, 4))Huber-এর গড় 1.325, pinball 0.97, MSE 5.25. Softmax [0.659 0.2424 0.0986], CE 1.417, OvO K=10 45. 5.3 ECE 0.02 | Brier 0.142, Platt [0.7311 0.3775]. SVM লাইনে width 1.4142, y·f [ 1. 1. 3. 2. -0.5 0.5], hinge [0. 0. 0. 0. 1.5 0.5], obj C=1 3.0. Dual: w [0.5 0.5], দুটি বিন্দুতেই y·(w·x) = 1., width 2.8284 | dual 0.25 primal 0.25. Kernel: 36.0 দুইভাবেই, RBF 0.0821, আর KRR alpha [-0.0034 2.7284] | f(0.5) 2.1222.
৬ · মডিউল ৭ — Tree আর ensemble: Gini, bagging, AdaBoost, gradient boosting, XGBoost
ঝালিয়ে নিন: পর্ব ৩২ · Decision tree গভীরে, পর্ব ৩৩ · Bagging আর random forest, পর্ব ৩৪ · AdaBoost, পর্ব ৩৫ · Gradient boosting, পর্ব ৩৬ · XGBoost, LightGBM আর CatBoost.
Gini = ১ − ∑pk2; information gain = H(মূল) − ∑(ni/n)Hi. B টি অনুমানের গড়ের variance ρσ2 + (১ − ρ)σ2/B. AdaBoost: α = ½ ln((১ − ε)/ε), ভুলের ওজন × eα, ঠিকের × e−α, তারপর যোগফল ১. Gradient boosting: F ← F + ν × (pseudo-residual-এ শেখা গাছ)। XGBoost: leaf weight w* = −G/(H + λ), gain = ½[GL2/(HL + λ) + GR2/(HR + λ) − G2/(H + λ)] − γ; log loss-এ g = p − y, h = p(১ − p).
৬.১(সহজ) ১০ জন গ্রাহকের ৬ জন churn করেছেন। দুটি প্রস্তাবিত split: A — বাঁয়ে ৪ জন (৪ churn, ০ নয়), ডানে ৬ জন (২, ৪); B — বাঁয়ে ৫ (৪, ১), ডানে ৫ (২, ৩)। (ক) মূলের Gini আর entropy (log2)? (খ) প্রতিটি split-এর ওজনযুক্ত Gini আর information gain? (গ) কোনটি বাছবেন? (ঝালিয়ে নিন: পর্ব ৩২)
(a) Gini = 1 - (0.6^2 + 0.4^2) = 0.48 ; H = -0.6 log2 0.6 - 0.4 log2 0.4 = 0.9710
(b) A: left (4,0) Gini 0, H 0 ; right (2,4) Gini 1 - (1/9 + 4/9) = 0.4444, H 0.9183
weighted Gini 0.6 x 0.4444 = 0.2667 (drop 0.2133) ; H 0.5510 (IG 0.4200)
B: left (4,1) Gini 0.32, H 0.7219 ; right (2,3) Gini 0.48, H 0.9710
weighted Gini 0.40 (drop 0.08) ; H 0.8464 (IG 0.1245)
(c) A, by both criteria
ওজন ভুলে সাধারণ গড় নিলে A-এর Gini হতো ০.২২২, ভুল সংখ্যা যদিও এখানে সিদ্ধান্ত একই। Gini আর entropy প্রায় সবসময় একই split বাছে; Gini হিসাবে সস্তা।
৬.২(মাঝারি) প্রতিটি গাছের অনুমানের variance σ2 = ৪, যেকোনো দুটির correlation ρ. Bagging-এর গড়ের variance কত (ক) ρ = ০.৩, B = ১০০-এ, (খ) ρ = ০.৩, B → ∞-এ, (গ) ρ = ০, B = ১০০-এ, (ঘ) ρ = ০.১, B = ১০০-এ? (ঝালিয়ে নিন: পর্ব ৩৩)
var = rho sigma^2 + (1 - rho) sigma^2 / B
(a) 0.3 x 4 + 0.7 x 4/100 = 1.2 + 0.028 = 1.228
(b) 1.2 (floor: more trees cannot go below rho sigma^2)
(c) 0.04
(d) 0.4 + 0.9 x 0.04 = 0.436
গাছ ১০০ থেকে অসীম করলে কমে মাত্র ০.০২৮; ρ ০.৩ থেকে ০.১ করলে ১.২২৮ থেকে ০.৪৩৬. Random forest-এর প্রতি split-এ feature-এর এলোমেলো ভাগ (max_features) ঠিক এই ρ কমানোর কৌশল।
৬.৩(মাঝারি) AdaBoost-এর এক রাউন্ড: ১০টি সারি, প্রতিটির ওজন ০.১; একটি stump তিনটি সারিতে ভুল করে। (ক) ε আর α? (খ) হালনাগাদের পরে ভুল আর ঠিক সারির ওজন, normaliser Z? (গ) ভুল সারিগুলোর মোট ওজন কত, আর তার অর্থ? (ঝালিয়ে নিন: পর্ব ৩৪)
(a) eps = 3 x 0.1 = 0.3 ; alpha = 0.5 ln(0.7/0.3) = 0.5 ln 2.3333 = 0.4236
(b) wrong: 0.1 x e^0.4236 = 0.15275 ; right: 0.1 x e^-0.4236 = 0.06547
Z = 3 x 0.15275 + 7 x 0.06547 = 0.45826 + 0.45826 = 0.91652 = 2 sqrt(0.3 x 0.7)
normalised: wrong 0.16667 ; right 0.07143
(c) 3 x 0.16667 = 0.5
নতুন ওজনে পুরোনো stump-এর ভুল ঠিক ৫০%: সে এখন মুদ্রা ছোড়ার সমান, তাই পরের stump-কে নতুন কিছু শিখতেই হবে। নিচের stepper ধাপগুলো দেখায়।
weights : 0.1 x 10
wrong : rows 1, 2, 3
eps = 0.1 + 0.1 + 0.1 = 0.3
alpha = 0.5 ln(0.7/0.3)
= 0.5 ln 2.3333
= 0.4236
wrong: 0.1 x e^0.4236
= 0.15275
right: 0.1 x e^-0.4236
= 0.06547
Z = 3 x 0.15275 + 7 x 0.06547
= 0.91652
wrong: 0.15275/0.91652
= 0.16667
right: 0.06547/0.91652
= 0.07143
wrong total = 0.5
- ভুলের ভার। সমান ওজনে ভুল তিনটি সারির ওজন যোগ: ε = ০.৩.
- Stump-এর ভোট। α = ½ ln(০.৭/০.৩) = ০.৪২৩৬; ε ০.৫-এর যত নিচে, α তত বড়।
- ওজন বদল। ভুল সারি eα = ১.৫২৭৫ গুণ, ঠিক সারি e−α = ০.৬৫৪৭ গুণ। দুই দলের মোট সমান, ০.৪৫৮২৬ করে।
- Normalise. Z = ০.৯১৬৫২ দিয়ে ভাগ: ভুল সারি ০.১৬৬৬৭, ঠিক সারি ০.০৭১৪৩, ভুলের মোট ঠিক ০.৫.
৬.৪(মাঝারি) x = ১, ২, ৩, ৪; y = ৩, ৫, ৮, ১০. Squared loss-এ gradient boosting, learning rate ০.১, প্রথম গাছ x ≤ ২.৫-এ ভাগ। (ক) F0, pseudo-residual আর পাতার মান? (খ) F1 আর MSE-র বদল? (গ) Log loss হলে residual কী হতো? (ঝালিয়ে নিন: পর্ব ৩৫)
(a) F0 = mean(y) = 26/4 = 6.5
residual = y - F0 = (-3.5, -1.5, 1.5, 3.5) = negative gradient of 0.5 (y - F)^2
leaves (mean residual): x <= 2.5 -> -2.5 ; x > 2.5 -> +2.5
(b) F1 = 6.5 + 0.1 x leaf = (6.25, 6.25, 6.75, 6.75)
MSE 7.25 -> 6.0625
(c) pseudo-residual = y - p (p = sigmoid of the current score)
ছোট learning rate মানে প্রতি গাছে ছোট পা: MSE সামান্য কমে, অনেক গাছ লাগে, কিন্তু overfit কম। Learning rate ১ হলে এক গাছেই MSE ৭.২৫ থেকে ১-এ নামত, আর noise-ও মুখস্থ হওয়ার ঝুঁকি বাড়ত।
৬.৫(কঠিন) চারটি সারি, y = ১, ১, ০, ১; শুরুর raw score ০ (p = ০.৫), log loss, λ = ১, γ = ০. (ক) g আর h? (খ) Split {১, ২} | {৩, ৪} আর {১, ২, ৪} | {৩}-এর gain? (গ) ভালো split-এর leaf weight? (ঘ) γ = ০.৫ হলে কী হয়? (ঝালিয়ে নিন: পর্ব ৩৬)
(a) g = p - y = (-0.5, -0.5, 0.5, -0.5) ; h = p(1 - p) = 0.25 each
root: G = -1, H = 1 -> G^2/(H + 1) = 0.5
(b) {1,2}|{3,4}: GL = -1, HL = 0.5 -> 1/1.5 = 0.6667 ; GR = 0 -> 0
gain = 0.5 (0.6667 + 0 - 0.5) = 0.0833
{1,2,4}|{3}: GL = -1.5, HL = 0.75 -> 2.25/1.75 = 1.2857
GR = 0.5, HR = 0.25 -> 0.25/1.25 = 0.2
gain = 0.5 (1.2857 + 0.2 - 0.5) = 0.4929 (better)
(c) wL = 1.5/1.75 = 0.8571 ; wR = -0.5/1.25 = -0.4
(d) 0.4929 - 0.5 = -0.0071 < 0 -> no split
প্রথম split-এর ডান দিকে g-এর যোগ শূন্য (০.৫ − ০.৫), তাই সেখানে কিছুই শেখার নেই। λ পাতার মানকে শূন্যের দিকে টানে (১.৫/০.৭৫ = ২ নয়, ০.৮৫৭); γ ছোট লাভের split ছেঁটে দেয়।
import numpy as np
gini = lambda c: 1 - ((np.array(c) / sum(c))**2).sum()
ent = lambda c: -sum(q * np.log2(q) for q in np.array(c) / sum(c) if q > 0)
for name, L, R in [("A", [4, 0], [2, 4]), ("B", [4, 1], [2, 3])]: # 6.1
wl = sum(L) / 10; g = wl * gini(L) + (1 - wl) * gini(R); h = wl * ent(L) + (1 - wl) * ent(R)
print(f"6.1 split {name}: gini {gini([6, 4]):.4f}->{g:.4f} (drop {gini([6, 4]) - g:.4f})"
f" | entropy {ent([6, 4]):.4f}->{h:.4f} (IG {ent([6, 4]) - h:.4f})")
for rho, B in [(0.3, 100), (0.3, 10**9), (0.0, 100), (0.1, 100)]: # 6.2
print(f"6.2 rho={rho} B={B}: var = {rho * 4 + (1 - rho) * 4 / B:.4f}")
w = np.full(10, 0.1); wrong = np.arange(10) < 3 # 6.3
eps = w[wrong].sum(); a = 0.5 * np.log((1 - eps) / eps)
w2 = w * np.exp(np.where(wrong, a, -a)); Z = w2.sum(); w2 /= Z
print(f"6.3 eps {eps:.1f} alpha {a:.4f} | wrong {0.1*np.exp(a):.5f} right {0.1*np.exp(-a):.5f}"
f" Z {Z:.5f} | after: wrong {w2[0]:.5f} right {w2[-1]:.5f} sum-wrong {w2[wrong].sum():.4f}")
y = np.array([3., 5, 8, 10]); F = np.full(4, y.mean()); r = y - F # 6.4
leaf = np.r_[np.full(2, r[:2].mean()), np.full(2, r[2:].mean())]; F1 = F + 0.1 * leaf
print("6.4 F0", F[0], "res", r, "leaf", leaf, "F1", F1, "| MSE", (r**2).mean(), "->", ((y - F1)**2).mean())
g = np.array([-0.5, -0.5, 0.5, -0.5]); h = np.full(4, 0.25); lam = 1.0 # 6.5
sc = lambda m: g[m].sum()**2 / (h[m].sum() + lam)
allr = np.ones(4, bool)
for L in ([0, 1], [0, 1, 3]):
m = np.isin(np.arange(4), L); gain = 0.5 * (sc(m) + sc(~m) - sc(allr))
print(f"6.5 left {L}: gain {gain:.5f} | w_L {-g[m].sum() / (h[m].sum() + lam):.4f}"
f" w_R {-g[~m].sum() / (h[~m].sum() + lam) + 0:.4f} | with gamma 0.5: {gain - 0.5:.5f}")Split A-তে Gini 0.4800->0.2667 আর IG 0.4200, split B-তে 0.4000 আর IG 0.1245. Variance 1.2280, 1.2000, 0.0400, 0.4360. AdaBoost alpha 0.4236, Z 0.91652, হালনাগাদে wrong 0.16667 right 0.07143 sum-wrong 0.5000. Boosting-এ F1 [6.25 6.25 6.75 6.75], MSE 7.25 -> 6.0625. XGBoost-এ gain 0.08333 আর gain 0.49286, পাতা 0.8571 ও -0.4000, আর γ = ০.৫-এ -0.00714.
৭ · মডিউল ৮–৯ — Unsupervised আর Bayesian: EM, KDE, isolation forest, GP, MCMC আর EI
ঝালিয়ে নিন: পর্ব ৩৯ · Gaussian mixture আর EM, পর্ব ৪০ · Density estimation, পর্ব ৪৩ · Anomaly detection, পর্ব ৪৫ · Bayesian linear regression, পর্ব ৪৬ · Gaussian process, পর্ব ৪৭ · MCMC, পর্ব ৪৮ · Variational inference, পর্ব ৪৯ · Bayesian optimization.
EM: E-ধাপে responsibility rik ∝ πkN(xi; μk, σk), M-ধাপে μk = ∑rikxi/∑rik. KDE: p̂(x) = (১/nh)∑K((x − xi)/h). Isolation forest: s = ২−E[h]/c(n), c(n) = ২H(n − ১) − ২(n − ১)/n. Bayesian regression (এক চলক): SN−১ = α + β∑x2, mN = βSN∑xy. GP: গড় k*ᵀ(K + σn2I)−১y, variance k** − k*ᵀ(K + σn2I)−১k*. MH: α = min(১, π̃′q(θ | θ′) ÷ π̃q(θ′ | θ))। EI (ছোট করা): z = (f* − μ)/σ, EI = σ(zΦ(z) + φ(z)).
৭.১(মাঝারি) এক মাত্রার ডেটা ১, ২, ৪, ৫; দুটি Gaussian, σ = ১ স্থির, শুরুতে μ1 = ১, μ2 = ৫, π1 = π2 = ০.৫. (ক) E-ধাপে প্রথম component-এর responsibility? (খ) M-ধাপে নতুন μ আর π? (ঝালিয়ে নিন: পর্ব ৩৯)
(a) N(x; 5)/N(x; 1) = exp(((x-1)^2 - (x-5)^2)/2) = exp(4x - 12)
r1 = 1 / (1 + exp(4x - 12))
x=1: 1/(1 + e^-8) = 0.99966 ; x=2: 1/(1 + e^-4) = 0.98201
x=4: 1/(1 + e^4) = 0.01799 ; x=5: 1/(1 + e^8) = 0.00034
(b) N1 = 0.99966 + 0.98201 + 0.01799 + 0.00034 = 2.0 -> pi1 = 0.5
mu1 = (1x0.99966 + 2x0.98201 + 4x0.01799 + 5x0.00034)/2 = 1.5187
mu2 = 4.4813 (by symmetry: 6 - mu1)
দুটি গড় ডেটার দুই দলের কেন্দ্রের (১.৫ আর ৪.৫) দিকে সরেছে। k-means হলে r হতো কঠিন ০ বা ১ আর μ সরাসরি ১.৫; EM নরম ভাগ দেয়, তাই x = ৪-এর সামান্য টান μ1-কে ১.৫১৮৭-এ নেয়।
৭.২(সহজ) ডেটা ১, ২, ৪, ৭; Gaussian kernel. x = ৩-এ KDE-র মান কত, (ক) bandwidth h = ১-এ, (খ) h = ২-এ? (ঝালিয়ে নিন: পর্ব ৪০)
phi(u) = e^(-u^2/2) / sqrt(2 pi)
(a) h = 1: u = 2, 1, -1, -4 -> 0.05399 + 0.24197 + 0.24197 + 0.00013 = 0.53806
p(3) = 0.53806 / (4 x 1) = 0.13452
(b) h = 2: u = 1, 0.5, -0.5, -2 -> 0.24197 + 0.35207 + 0.35207 + 0.05399 = 1.00009
p(3) = 1.00009 / (4 x 2) = 0.12501
সাধারণ ভুল: ১/h ভুলে যাওয়া; তখন (খ)-তে ০.২৫ আসত আর মোট ঘনত্ব ১ থাকত না। বড় h বেশি মসৃণ: ৭-এর দূরের বিন্দুটিও এখন কিছু অবদান রাখে।
৭.৩(মাঝারি) Isolation forest-এ subsample n = ২৫৬, H(i) ≈ ln i + ০.৫৭৭২. (ক) c(২৫৬)? (খ) গড় path length E[h] = ৪, c(n) আর ১৪ হলে score? কোনটি সন্দেহজনক? (ঝালিয়ে নিন: পর্ব ৪৩)
(a) H(255) = ln 255 + 0.5772 = 5.5413 + 0.5772 = 6.1185
c(256) = 2 x 6.1185 - 2 x 255/256 = 12.2370 - 1.9922 = 10.245
(b) E[h] = 4 -> 2^(-4/10.245) = 2^-0.3904 = 0.7629 (isolated fast: suspicious)
E[h] = 10.245 -> 2^-1 = 0.5
E[h] = 14 -> 2^(-1.3665) = 0.3878 (normal)
অস্বাভাবিক বিন্দু কম কাটে একা হয়ে যায়, তাই path ছোট আর score ১-এর কাছে। ০.৫-এর আশপাশে সব score থাকলে স্পষ্ট anomaly নেই।
৭.৪(মাঝারি) y = wx + noise, prior w ~ N(০, ১/α), α = ১, noise precision β = ১; ডেটা (x, y) = (১, ২), (২, ৩)। (ক) Posterior-এর SN আর mN; OLS-এর সঙ্গে তুলনা। (খ) x = ৩-এ predictive গড় আর variance? (গ) কোন λ-র ridge একই গড় দেয়? (ঝালিয়ে নিন: পর্ব ৪৫)
(a) S_N^-1 = 1 + 1 x (1 + 4) = 6 -> S_N = 0.1667
m_N = 1 x (1/6) x (2 + 6) = 1.3333 ; OLS = 8/5 = 1.6
(b) mean = 3 x 1.3333 = 4.0 ; var = 1/beta + 9 x 0.1667 = 1 + 1.5 = 2.5
(c) lambda = alpha/beta = 1 : 8/(5 + 1) = 1.3333
Predictive variance-এর দুই অংশ: ১ (noise, কখনো কমে না) আর ১.৫ (w-এর অনিশ্চয়তা, x দূরে গেলে x2 হারে বাড়ে)। মাত্র দুটি বিন্দু, তাই দ্বিতীয় অংশই বড়।
৭.৫(মাঝারি) GP-তে একটিই পর্যবেক্ষণ (x, y) = (০, ২); kernel k(x, x′) = exp(−(x − x′)2/২), σn2 = ০.১. x* = ১, ০ আর ৩-এ posterior গড় আর variance? (ঝালিয়ে নিন: পর্ব ৪৬)
mean = k* x 2 / 1.1 ; var = 1 - k*^2 / 1.1
x* = 1: k* = e^-0.5 = 0.60653 -> mean 1.1028, var 0.6656
x* = 0: k* = 1 -> mean 1.8182, var 0.0909
x* = 3: k* = e^-4.5 = 0.01111 -> mean 0.0202, var 0.9999
ডেটার ওপরেও গড় ২ নয়, ১.৮২: noise আছে বলে GP পর্যবেক্ষণকে পুরো বিশ্বাস করে না। দূরে (x = ৩) গড় prior-এর ০-তে আর variance prior-এর ১-এ ফেরে, অর্থাৎ “জানি না” বলে।
৭.৬(কঠিন) (ক) MCMC-তে বর্তমান π̃(θ) = ৬, প্রস্তাবিত π̃(θ′) = ৪. প্রতিসম প্রস্তাবে গ্রহণের সম্ভাবনা? q(θ | θ′) = ০.২, q(θ′ | θ) = ০.৪ হলে? (খ) Validation loss ছোট করতে Bayesian optimization; এখনকার সেরা f* = ০.৩০. প্রার্থী P: μ = ০.২৮, σ = ০.০৫; Q: μ = ০.৩৫, σ = ০.১৫ (ξ = ০)। PI আর EI কাকে বাছে? (গ) log p(x) = −১.২ আর একটি q-এর ELBO = −১.৫ হলে KL(q ‖ posterior) কত? (ঝালিয়ে নিন: পর্ব ৪৭–৪৯)
(a) symmetric: min(1, 4/6) = 0.6667
min(1, 4 x 0.2 / (6 x 0.4)) = min(1, 0.8/2.4) = 0.3333
(b) P: z = (0.30 - 0.28)/0.05 = 0.4 ; PI = Phi(0.4) = 0.6554
EI = 0.05 (0.4 x 0.6554 + 0.3683) = 0.03152
Q: z = (0.30 - 0.35)/0.15 = -0.3333 ; PI = 0.3694
EI = 0.15 (-0.3333 x 0.3694 + 0.3774) = 0.03814
PI picks P ; EI picks Q
(c) log p(x) = ELBO + KL -> KL = -1.2 - (-1.5) = 0.3 (>= 0, as it must be)
(খ)-র শিক্ষা: P প্রায় নিশ্চিত কিন্তু ছোট উন্নতি দেয়; Q-এর গড় খারাপ, তবু অনিশ্চয়তা বড় বলে বড় উন্নতির সম্ভাবনা আছে। EI উন্নতির আকারও দেখে, তাই খোঁজ আর কাজে লাগানোর ভারসাম্য রাখে।
import numpy as np
from scipy import stats
np.set_printoptions(precision=5, suppress=True)
x = np.array([1., 2, 4, 5]); mu = np.array([1., 5]) # 7.1 EM, sigma = 1, pi = 0.5
d = stats.norm.pdf(x[:, None], mu, 1) * 0.5; r = d / d.sum(1, keepdims=True)
N = r.sum(0)
print("7.1 r1", r[:, 0], "| N", N, "| new mu", (r * x[:, None]).sum(0) / N, "| new pi", N / 4)
pts = np.array([1., 2, 4, 7]) # 7.2 KDE
print("7.2 phi", stats.norm.pdf(3 - pts).round(5), "| p(3)", round(stats.norm.pdf(3 - pts).mean(), 5),
"| h=2:", round(stats.norm.pdf((3 - pts) / 2).mean() / 2, 5))
c = lambda n: 2 * (np.log(n - 1) + 0.5772) - 2 * (n - 1) / n # 7.3
print("7.3 c(256)", round(c(256), 3), "| s(Eh=4)", round(2 ** (-4 / c(256)), 4),
"s(Eh=c)", 2 ** (-1.0), "s(Eh=14)", round(2 ** (-14 / c(256)), 4))
X, Y, al, be = np.array([1., 2]), np.array([2., 3]), 1.0, 1.0 # 7.4
SN = 1 / (al + be * X @ X); mN = be * SN * X @ Y
print("7.4 S_N", round(SN, 4), "m_N", round(mN, 4), "OLS", X @ Y / (X @ X),
"| x*=3 mean", round(3 * mN, 4), "var", round(1 / be + 9 * SN, 4))
for xs in (1.0, 0.0, 3.0): # 7.5 GP, one point
ks = np.exp(-(xs - 0) ** 2 / 2)
print(f"7.5 x*={xs}: k*={ks:.5f} mean={ks * 2 / 1.1:.5f} var={1 - ks**2 / 1.1:.5f}")
print("7.6 MH sym", round(min(1, 4 / 6), 4), "asym", round(min(1, 4 * 0.2 / (6 * 0.4)), 4))
for m, s in [(0.28, 0.05), (0.35, 0.15)]:
z = (0.30 - m) / s
print(f" mu={m} sd={s}: z={z:.4f} PI={stats.norm.cdf(z):.4f} "
f"EI={s * (z * stats.norm.cdf(z) + stats.norm.pdf(z)):.6f}")
print(" KL = logp - ELBO =", round(-1.2 - (-1.5), 4))EM: r1 [0.99966 0.98201 0.01799 0.00034], N [2. 2.], new mu [1.51866 4.48134]. KDE p(3) 0.13452 আর h=2: 0.12501. c(256) 10.245, score 0.7629, 0.5, 0.3878. Bayesian regression S_N 0.1667 m_N 1.3333 OLS 1.6, predictive mean 4.0 var 2.5. GP তিন লাইনে mean=1.10278 var=0.66556, 1.81818 ও 0.09091, 0.02020 ও 0.99989. MH 0.6667 আর 0.3333; P-এর EI=0.031522, Q-এর EI=0.038135; শেষে KL ... 0.3.
৮ · মডিউল ১০ — বিশেষ ডেটা: imbalance, forecasting, recommender, survival আর active learning
ঝালিয়ে নিন: পর্ব ৫০ · Imbalanced ডেটা, পর্ব ৫১ · Time series forecasting, পর্ব ৫২ · ML দিয়ে forecasting, পর্ব ৫৩ · Recommender system, পর্ব ৫৪ · কম label-এ শেখা, পর্ব ৫৫ · Survival analysis.
class_weight="balanced": n ÷ (k × nc). খরচের সীমা (সঠিক সিদ্ধান্তে খরচ ০): p* = CFP ÷ (CFP + CFN). Prior সংশোধন: odds × (আসল prior odds ÷ training-এর prior odds). SES: ℓt = αyt + (১ − α)ℓt−১. MASE = MAE ÷ training-এর naive MAE. Matrix factorization: r̂ = μ + bu + bi + p·q. NDCG = DCG ÷ IDCG, DCG = ∑reli/log2(i + ১)। Kaplan–Meier: Ŝ(t) = ∏(১ − dj/nj); Greenwood: Var ≈ Ŝ2∑d/(n(n − d)).
৮.১(সহজ) ১,০০০টি লেনদেনে ২০টি জালিয়াতি। (ক) “সব স্বাভাবিক” model-এর accuracy আর recall? (খ) class_weight="balanced"-এর দুই ওজন? (গ) ফসকানো জালিয়াতির ক্ষতি ২,০০০ টাকা, অকারণ যাচাই ৫০ টাকা: সম্ভাবনার সীমা? (ঘ) ৫০:৫০ করে undersample করা ডেটায় শেখা model একটি লেনদেনে p = ০.৬ বলে; আসল ২% হারে সংশোধিত সম্ভাবনা? (ঝালিয়ে নিন: পর্ব ৫০)
(a) accuracy 980/1000 = 0.98 ; recall 0/20 = 0
(b) normal 1000/(2 x 980) = 0.5102 ; fraud 1000/(2 x 20) = 25
(c) p* = 50 / (50 + 2000) = 0.0244
(d) odds 0.6/0.4 = 1.5 ; x (0.02/0.98) / (0.5/0.5) = 0.030612 -> p = 0.0297
৬০% শুনে ভয় পাওয়ার কারণ নেই; আসল হারে মাত্র ৩%. তবু ০.০২৪৪-এর সীমা পেরিয়েছে, তাই খরচের হিসাবে যাচাই করাই লাভজনক। Undersampled model-এর সম্ভাবনা সরাসরি সিদ্ধান্তে বসানো সাধারণ ভুল।
৮.২(মাঝারি) পাঁচ দিনের বিক্রি ২০, ২৪, ২২, ২৬, ৩০; simple exponential smoothing, α = ০.৫, ℓ1 = y1. (ক) স্তরগুলো আর পরের দুই দিনের পূর্বাভাস? (খ) পরের দুই দিনের আসল বিক্রি ২৮ আর ৩১: MAE, training-এর naive MAE আর MASE? (ঝালিয়ে নিন: পর্ব ৫১)
(a) l2 = 0.5 x 24 + 0.5 x 20 = 22 ; l3 = 0.5 x 22 + 0.5 x 22 = 22
l4 = 0.5 x 26 + 0.5 x 22 = 24 ; l5 = 0.5 x 30 + 0.5 x 24 = 27
forecast day 6 and day 7: 27 (flat)
(b) MAE = (|28 - 27| + |31 - 27|)/2 = 2.5
naive in-sample: |24-20|, |22-24|, |26-22|, |30-26| = 4, 2, 4, 4 -> 3.5
MASE = 2.5 / 3.5 = 0.7143
MASE ১-এর নিচে মানে training-এর “গতকালই আজ” নিয়মের গড় ভুলের চেয়ে কম। তবে বিক্রি বাড়ছে আর SES-এর পূর্বাভাস সমতল, তাই সামনের দিনে ভুল বাড়বে; trend থাকলে Holt-এর পদ্ধতি।
৮.৩(মাঝারি) (ক) μ = ৩.৬, bu = ০.২, bi = −০.১, pu = (০.৮, −০.২), qi = (১.০, ০.৫): অনুমিত রেটিং? আসল রেটিং ৫ হলে η = ০.১, λ = ০.০২-এ SGD-এর প্রচলিত নিয়ম p ← p + η(e·q − λp)-এ নতুন pu? (খ) একটি তালিকার প্রথম পাঁচটির প্রাসঙ্গিকতা ১, ০, ১, ০, ০, আর ক্রেতার মোট প্রাসঙ্গিক পণ্য ৩টি: NDCG@৫, precision@৫, recall@৫? (ঝালিয়ে নিন: পর্ব ৫৩)
(a) p.q = 0.8 - 0.1 = 0.7 ; r_hat = 3.6 + 0.2 - 0.1 + 0.7 = 4.4 ; e = 0.6
p = (0.8 + 0.1(0.6 x 1.0 - 0.016), -0.2 + 0.1(0.6 x 0.5 + 0.004))
= (0.8584, -0.1696)
(b) DCG = 1/log2(2) + 1/log2(4) = 1 + 0.5 = 1.5
IDCG (3 relevant at the top) = 1 + 1/log2(3) + 1/log2(4) = 2.1309
NDCG@5 = 1.5 / 2.1309 = 0.7039 ; P@5 = 2/5 = 0.4 ; R@5 = 2/3 = 0.6667
IDCG-এ তালিকার বাইরে থাকা তৃতীয় প্রাসঙ্গিক পণ্যটিও ধরা হয়েছে। শুধু তালিকার item থেকে IDCG নিলে (১ + ০.৬৩০৯) উত্তর ০.৯১৯৭; দুই সংজ্ঞাই চালু, তাই খাতায় লিখে দিন।
৮.৪(মাঝারি) আটজন ক্রেতা কত মাস পরে চলে গেছেন (+ মানে censored, তখনো আছেন): ২, ৩+, ৪, ৪, ৫+, ৬, ৮+, ৯. (ক) Kaplan–Meier Ŝ(t)? (খ) Median টিকে থাকার সময়? (গ) t = ৪-এ Greenwood standard error? (ঝালিয়ে নিন: পর্ব ৫৫)
t n d factor S(t)
2 8 1 7/8 0.8750
4 6 2 4/6 0.5833 (3+ has left the risk set)
6 3 1 2/3 0.3889 (5+ left)
9 1 1 0/1 0.0000 (8+ left)
(b) first t with S(t) <= 0.5 -> 6 months
(c) S^2 x (1/(8 x 7) + 2/(6 x 4)) = 0.3403 x 0.1012 = 0.03443 -> SE = 0.1856
Censored মানুষকে “চলে গেছেন” ধরলে, বা বাদ দিলে, দুটোই ভুল: যতদিন দেখা গেছে ততদিন তাঁরা ঝুঁকির দলে (n) থাকেন, তারপর নিঃশব্দে সরে যান। নিচের stepper টেবিলটি ভরে।
at risk: 2 3+ 4 4 5+ 6 8+ 9
n = 8 ; leave d = 1
S(2) = 1 x 7/8
= 0.8750
3+ censored: out, no event
at risk: 4 4 5+ 6 8+ 9
n = 6 ; leave d = 2
S(4) = 0.8750 x 4/6
= 0.5833
5+ censored: out
at risk: 6 8+ 9
n = 3 ; leave d = 1
S(6) = 0.5833 x 2/3
= 0.3889 (median 6)
8+ censored: out
at risk: 9
n = 1 ; leave d = 1
S(9) = 0.3889 x 0/1
= 0
- প্রথম ঘটনা। আটজনই ঝুঁকিতে, একজন গেলেন: গুণক ৭/৮, Ŝ = ০.৮৭৫০.
- Censored সরলেন। ৩+ ঘটনা ছাড়াই দল ছাড়লেন, তাই n = ৬. দুজন গেলেন: Ŝ = ০.৮৭৫০ × ৪/৬ = ০.৫৮৩৩.
- Median পেরোল। ৫+ সরলেন, n = ৩, একজন গেলেন: Ŝ = ০.৩৮৮৯, প্রথমবার ০.৫-এর নিচে, তাই median ৬ মাস।
- শেষ ঘটনা। ৮+ সরলেন, শেষজন ৯ মাসে গেলেন: Ŝ = ০. শেষে মাত্র একজন বলে এই অংশের অনিশ্চয়তা বিশাল।
৮.৫(সহজ) Label ছাড়া তিনটি রিভিউয়ে model-এর তিন শ্রেণির সম্ভাবনা: A (০.৫০, ০.৩০, ০.২০), B (০.৪০, ০.৪০, ০.২০), C (০.৪৫, ০.৩০, ০.২৫)। Least confidence, margin আর entropy (ln) নিয়মে কোনটিকে আগে label করতে পাঠাবেন? (ঝালিয়ে নিন: পর্ব ৫৪)
1 - max margin (top1 - top2) entropy
A 0.50 0.20 1.0297
B 0.60 0.00 1.0549
C 0.55 0.15 1.0671
least confidence -> B (largest) ; margin -> B (smallest) ; entropy -> C (largest)
তিন নিয়ম সবসময় একমত নয়: entropy তৃতীয় শ্রেণির ০.২৫-কেও গোনে, margin শুধু শীর্ষ দুটি দেখে। কোনটি ভালো, তা ডেটা আর লক্ষ্যভেদে বদলায়; learning curve দিয়ে random-এর সঙ্গে তুলনা করে দেখুন।
import numpy as np
np.set_printoptions(precision=4, suppress=True)
n0, n1 = 980, 20 # 8.1
print("8.1 weights neg", round(1000 / (2 * n0), 4), "pos", 1000 / (2 * n1), "| p*", round(50 / 2050, 5))
odds = 0.6 / 0.4 * (0.02 / 0.98) / (0.5 / 0.5); print(" corrected p", round(odds / (1 + odds), 4))
y = [20, 24, 22, 26, 30]; l = [y[0]] # 8.2 SES, alpha 0.5
for v in y[1:]: l.append(0.5 * v + 0.5 * l[-1])
mae = np.mean(np.abs(np.array([28, 31]) - l[-1])); scale = np.mean(np.abs(np.diff(y)))
print("8.2 levels", l, "| MAE", mae, "naive-in-sample", scale, "MASE", round(mae / scale, 4))
p, q = np.array([0.8, -0.2]), np.array([1.0, 0.5]) # 8.3
pred = 3.6 + 0.2 - 0.1 + p @ q; e = 5 - pred
print("8.3 pred", round(pred, 4), "err", round(e, 4), "| new p", p + 0.1 * (e * q - 0.02 * p))
rel = np.array([1, 0, 1, 0, 0]); disc = 1 / np.log2(np.arange(2, 7))
dcg = rel @ disc; idcg = disc[:3].sum()
print(" DCG", round(dcg, 4), "IDCG", round(idcg, 4), "NDCG@5", round(dcg / idcg, 4),
"| P@5", rel.mean(), "R@5", round(rel.sum() / 3, 4))
t = np.array([2, 3, 4, 4, 5, 6, 8, 9]); ev = np.array([1, 0, 1, 1, 0, 1, 0, 1]) # 8.4
S, gw = 1.0, 0.0
for u in np.unique(t[ev == 1]):
n_r = (t >= u).sum(); d = ((t == u) & (ev == 1)).sum()
S *= 1 - d / n_r; gw += d / (n_r * (n_r - d)) if n_r > d else 0
print(f"8.4 t={u}: n={n_r} d={d} S={S:.5f}", f"SE={S * np.sqrt(gw):.5f}" if n_r > d else "")
P = np.array([[0.5, 0.3, 0.2], [0.4, 0.4, 0.2], [0.45, 0.3, 0.25]]) # 8.5
ps = np.sort(P, 1)[:, ::-1]
print("8.5 1-max", 1 - ps[:, 0], "| margin", ps[:, 0] - ps[:, 1], "| entropy", -(P * np.log(P)).sum(1))ওজন neg 0.5102 pos 25.0, সীমা p* 0.02439, সংশোধিত সম্ভাবনা 0.0297. SES-এর স্তর [20, 22.0, 22.0, 24.0, 27.0], MASE 0.7143. Recommender pred 4.4 err 0.6, new p [ 0.8584 -0.1696], আর NDCG@5 0.7039 | P@5 0.4 R@5 0.6667. Kaplan–Meier-এর চার লাইন S=0.87500, 0.58333 (SE=0.18556), 0.38889, 0.00000. শেষ লাইনে তিন মাপ: [0.5 0.6 0.55], [0.2 0. 0.15], [1.0297 1.0549 1.0671].
৯ · মডিউল ১১ — ব্যাখ্যা, অনিশ্চয়তা আর ন্যায্যতা: Shapley, PDP, conformal, PSI, fairness
ঝালিয়ে নিন: পর্ব ৫৬ · Permutation importance, PDP আর ICE, পর্ব ৫৭ · SHAP আর LIME, পর্ব ৫৮ · Conformal prediction, পর্ব ৫৯ · Distribution shift, পর্ব ৬০ · ML-এ ন্যায্যতা.
Shapley: φi = ∑ [|S|!(M − |S| − ১)!/M!](v(S ∪ {i}) − v(S)); যোগফল v(সব) − v(∅)। PDP: একটি feature-এর মান বেঁধে সব সারির অনুমানের গড়; ICE: প্রতিটি সারির আলাদা রেখা। Permutation importance = মূল score − এলোমেলো করার পরের গড় score. Split conformal: k = ⌈(n + ১)(১ − α)⌉, q̂ = k-তম ছোট score. PSI = ∑(a − e)ln(a/e). Demographic parity: selection rate সমান; equal opportunity: TPR সমান; reweighing: w = P(দল)P(label) ÷ P(দল, label).
৯.১(মাঝারি) একটি অর্ডারের ঝুঁকির score তিনটি feature-এর coalition-ভেদে: v(∅) = ১০, v(A) = ১৪, v(B) = ১২, v(C) = ১০, v(AB) = ১৮, v(AC) = ১৫, v(BC) = ১৩, v(ABC) = ২০. প্রতিটি feature-এর Shapley value কত? একটি যাচাই দিন। (ঝালিয়ে নিন: পর্ব ৫৭)
weights for M = 3: |S| = 0 -> 1/3 ; |S| = 1 -> 1/6 ; |S| = 2 -> 1/3
A: {} 14-10 = 4 ; {B} 18-12 = 6 ; {C} 15-10 = 5 ; {B,C} 20-13 = 7
phi_A = 4/3 + 6/6 + 5/6 + 7/3 = 5.5
B: {} 2 ; {A} 4 ; {C} 3 ; {A,C} 5 -> 2/3 + 4/6 + 3/6 + 5/3 = 3.5
C: {} 0 ; {A} 1 ; {B} 1 ; {A,B} 2 -> 0 + 1/6 + 1/6 + 2/3 = 1.0
check: 5.5 + 3.5 + 1.0 = 10 = v(ABC) - v({}) = 20 - 10
C একা কিছুই যোগ করে না (v(C) = v(∅)), তবু Shapley ১.০, কারণ অন্যদের সঙ্গে মিলে অবদান রাখে। Shapley ভাগ করে model-এর অনুমান, কারণ নয়: “C বদলালে ঝুঁকি কমবে” এখান থেকে বলা যায় না।
৯.২(সহজ) (ক) Model f(x1, x2) = ২x1 + x1x2, ডেটায় x2-এর মান ০, ১, ২. x1 = ১ আর ৩-এ PDP? প্রতিটি সারির ICE-এর ঢাল? (খ) অন্য একটি model-এর মূল AUC ০.৮৫; x1 তিনবার এলোমেলো করলে AUC ০.৭১, ০.৬৯, ০.৭৩, আর x2-এ ০.৮৪, ০.৮৬, ০.৮৫. Permutation importance? (ঝালিয়ে নিন: পর্ব ৫৬)
(a) PDP(1) = mean(2, 3, 4) = 3 ; PDP(3) = mean(6, 9, 12) = 9 -> PDP slope 3
ICE slopes = 2 + x2 = 2, 3, 4 (PDP shows only their average)
(b) x1: 0.85 - mean(0.71, 0.69, 0.73) = 0.85 - 0.71 = 0.14
x2: 0.85 - 0.85 = 0.00
(ক)-তে interaction-এর কারণে প্রতিটি সারির ঢাল আলাদা; PDP-র একটি রেখা তা লুকায়, ICE দেখায়। (খ)-তে ০ মানে এই model আর ডেটায় x2 এলোমেলো করলে AUC বদলায় না; তার সঙ্গে খুব সম্পর্কিত অন্য feature থাকলে ভার ভাগ হয়ে যায়, তাই “অদরকারি” বলার আগে সাবধান।
৯.৩(মাঝারি) Calibration ভাগের ১৯টি ডেলিভারিতে |y − ŷ| (মিনিট): ০.৪, ১.১, ০.৭, ২.৫, ০.৯, ১.৬, ০.৩, ১.২, ৩.১, ০.৮, ১.৯, ০.৫, ১.৪, ২.২, ০.৬, ১.০, ২.৮, ১.৩, ০.২. নতুন অর্ডারে ŷ = ৩০. α = ০.১, ০.২, ০.০৫ আর ০.০১-এ interval কী? (ঝালিয়ে নিন: পর্ব ৫৮)
sorted: 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.6 1.9 2.2 2.5 2.8 3.1
alpha 0.10: k = ceil(20 x 0.90) = 18 -> q = 2.8 -> [27.2, 32.8]
alpha 0.20: k = ceil(20 x 0.80) = 16 -> q = 2.2 -> [27.8, 32.2]
alpha 0.05: k = ceil(20 x 0.95) = 19 -> q = 3.1 -> [26.9, 33.1]
alpha 0.01: k = ceil(19.8) = 20 > 19 -> no finite q: infinite interval
n নয়, n + ১: নতুন score-টিকে নিয়ে মোট ২০টি সংখ্যা। α = ০.০১-এ ১৯টি calibration বিন্দু যথেষ্ট নয়; অন্তত ৯৯টি লাগে। নিশ্চয়তাটি গড়পড়তা (marginal), প্রতিটি দলের জন্য আলাদা নয়।
৯.৪(মাঝারি) একটি feature-এর চারটি bin-এ reference ভাগ e = (০.২৫, ০.২৫, ০.২৫, ০.২৫), এই মাসে a = (০.১০, ০.২০, ০.৩০, ০.৪০)। PSI কত, আর প্রচলিত হাতের নিয়মে কী বলে? (ঝালিয়ে নিন: পর্ব ৫৯)
bin e a a - e ln(a/e) term
1 0.25 0.10 -0.15 -0.9163 0.1374
2 0.25 0.20 -0.05 -0.2231 0.0112
3 0.25 0.30 0.05 0.1823 0.0091
4 0.25 0.40 0.15 0.4700 0.0705
PSI = 0.2282 -> 0.1 to 0.25 band: "watch"
প্রতিটি পদ ≥ ০, কারণ (a − e) আর ln(a/e)-র চিহ্ন একই। সীমাগুলো (০.১, ০.২৫) ঋণ-scoring-এর চর্চা থেকে আসা হাতের নিয়ম; bin-এর সংখ্যা বদলালে সংখ্যাও বদলায়, তাই একই bin-নীতিতে তুলনা করুন।
৯.৫(কঠিন) “পরে টাকা দিন” সুবিধার একটি কাল্পনিক model দুই দলে: দল A — TP ৪০, FN ১০, FP ২০, TN ১৩০; দল B — TP ১৫, FN ১৫, FP ৫, TN ৬৫. (ক) প্রতিটি দলের selection rate, TPR, FPR আর precision? (খ) Demographic parity-র পার্থক্য ও অনুপাত, equal opportunity-র ফাঁক? (গ) Reweighing-এ (দল, y = ১)-এর ওজন? (ঝালিয়ে নিন: পর্ব ৬০)
(a) n sel TPR FPR precision
A 200 0.30 0.80 0.1333 0.6667
B 100 0.20 0.50 0.0714 0.7500
(b) parity: diff 0.10 ; ratio 0.20/0.30 = 0.6667 (< 0.8 rule of thumb)
equal opportunity: TPR gap 0.30 ; FPR gap 0.0619 (equalized odds needs both)
(c) P(y=1) = 80/300
A: (200/300)(80/300)/(50/300) = 1.0667 ; B: (100/300)(80/300)/(30/300) = 0.8889
Precision-এ B এগিয়ে, TPR-এ অনেক পিছিয়ে: যোগ্য B-গ্রাহকের অর্ধেক সুবিধা পান না। দুই দলের base rate আলাদা (০.২৫ আর ০.৩০), তাই সব metric একসঙ্গে সমান করা সাধারণত অসম্ভব; কোন ক্ষতি বেশি গুরুতর, সেই সিদ্ধান্ত থেকে metric বাছুন।
import numpy as np
from itertools import combinations
from math import factorial as fa
v = {(): 10, ("A",): 14, ("B",): 12, ("C",): 10, ("A", "B"): 18, # 9.1
("A", "C"): 15, ("B", "C"): 13, ("A", "B", "C"): 20}
F = ("A", "B", "C"); M = 3; phi = {}
for i in F:
rest = [f for f in F if f != i]; phi[i] = 0.0
for k in range(M):
for S in combinations(rest, k):
wgt = fa(k) * fa(M - k - 1) / fa(M)
phi[i] += wgt * (v[tuple(sorted(S + (i,)))] - v[S])
print("9.1 phi", {k: round(x, 4) for k, x in phi.items()}, "sum", round(sum(phi.values()), 4))
x2 = np.array([0., 1, 2]); f = lambda a, b: 2 * a + a * b # 9.2
print("9.2 PDP(x1=1)", f(1, x2).mean(), "PDP(x1=3)", f(3, x2).mean(), "| ICE slopes", 2 + x2)
print(" perm. importance", np.round(0.85 - np.array([[0.71, 0.69, 0.73], [0.84, 0.86, 0.85]]).mean(1), 4))
s = np.array([0.4, 1.1, 0.7, 2.5, 0.9, 1.6, 0.3, 1.2, 3.1, 0.8, # 9.3
1.9, 0.5, 1.4, 2.2, 0.6, 1.0, 2.8, 1.3, 0.2]); n = len(s); srt = np.sort(s)
for a in (0.1, 0.2, 0.05, 0.01):
k = int(np.ceil((n + 1) * (1 - a)))
print(f"9.3 alpha={a}: k={k}", "q =", srt[k - 1] if k <= n else "inf (k > n)")
e = np.array([.25, .25, .25, .25]); a_ = np.array([.10, .20, .30, .40]) # 9.4
print("9.4 PSI terms", np.round((a_ - e) * np.log(a_ / e), 5), "PSI", round(((a_ - e) * np.log(a_ / e)).sum(), 4))
for g, (tp, fn, fp, tn) in {"A": (40, 10, 20, 130), "B": (15, 15, 5, 65)}.items(): # 9.5
n = tp + fn + fp + tn
print(f"9.5 {g}: sel {(tp + fp) / n:.4f} TPR {tp / (tp + fn):.4f} FPR {fp / (fp + tn):.4f} "
f"prec {tp / (tp + fp):.4f} | reweigh y=1 {(n / 300) * (80 / 300) / ((tp + fn) / 300):.4f}")
print(" DP ratio", round(0.20 / 0.30, 4))9.1 phi {'A': 5.5, 'B': 3.5, 'C': 1.0} sum 10.0: সব coalition গুনে হাতের উত্তর মিলল। PDP 3.0 আর 9.0, ICE-এর ঢাল [2. 3. 4.], importance [0.14 0. ]. Conformal-এর চার লাইন: k=18 q = 2.8, k=16 q = 2.2, k=19 q = 3.1 আর k=20 q = inf (k > n). PSI 0.2282. Fairness: A sel 0.3000 TPR 0.8000 FPR 0.1333 prec 0.6667, B sel 0.2000 TPR 0.5000 FPR 0.0714 prec 0.7500, reweighing 1.0667 আর 0.8889, DP ratio 0.6667.
১০ · মডিউল ১২–১৩ — A/B test, causal, customer analytics আর production-এর হিসাব
ঝালিয়ে নিন: পর্ব ৬২ · A/B test-এর পরিকল্পনা, পর্ব ৬৩ · A/B test-এর বিশ্লেষণ, পর্ব ৬৪ · Causal inference, পর্ব ৬৫ · Customer analytics, পর্ব ৬৮ · Model serving, পর্ব ৬৯ · Test আর নজরদারি, পর্ব ৭০ · বড় ডেটায় ML.
অনুপাতের sample size (প্রতি দলে): n = [z১−α/২√(২p̄(১ − p̄)) + z১−β√(p1q1 + p2q2)]2 ÷ (p2 − p1)2; গড়ের: n = ২(z১−α/২ + z১−β)2σ2/δ2. CUPED: θ = Cov(X, Y)/Var(X), variance × (১ − ρ2). DiD = (চিকিৎসিত পরে − আগে) − (তুলনার পরে − আগে)। CLV = m ÷ (১ + d − r). Nearest rank: ⌈q × n⌉-তম মান। Little’s law: L = λW.
১০.১(মাঝারি) চেকআউটে conversion এখন ৫%; ৬%-এ ওঠা (MDE ১ শতাংশ বিন্দু) ধরতে চান, α = ০.০৫ (দুই দিকের), power ৮০%. (ক) প্রতি দলে কতজন? (খ) গড় অর্ডারমূল্যের পরীক্ষায় σ = ৪০০ টাকা, δ = ২০ টাকা হলে? (ঝালিয়ে নিন: পর্ব ৬২)
z(0.975) = 1.9600 ; z(0.80) = 0.8416 ; p-bar = 0.055
(a) 1.96 x sqrt(2 x 0.055 x 0.945) = 1.96 x 0.3224 = 0.6319
0.8416 x sqrt(0.05 x 0.95 + 0.06 x 0.94) = 0.8416 x 0.3223 = 0.2713
n = (0.6319 + 0.2713)^2 / 0.01^2 = 0.8158 / 0.0001 = 8157.7 -> 8158 per arm
(b) n = 2 x (1.96 + 0.8416)^2 x 400^2 / 20^2 = 2 x 7.849 x 400 = 6279.1 -> 6280
উত্তর ওপরে গোল করুন, নিচে নয়। δ অর্ধেক করলে n চার গুণ; তাই ছোট পরিবর্তন ধরার পরীক্ষা অনেক দামি, আর আগে থেকে n ঠিক না করে বারবার উঁকি দেওয়া (peeking) false positive বাড়ায়।
১০.২(মাঝারি) (ক) Control-এ ১০,০০০ জনে ৫০০, treatment-এ ১০,০০০ জনে ৫৭০ জন কিনেছেন: pooled z-test-এর z আর p? (খ) পরীক্ষার আগের খরচ X আর পরের Y-এর Var(X) = Var(Y) = ২,০০০, Cov(X, Y) = ১,২০০. CUPED-এর θ, ρ আর variance কতটা কমে? (ঝালিয়ে নিন: পর্ব ৬৩)
(a) p1 = 0.050, p2 = 0.057 ; pooled p = 1070/20000 = 0.0535
SE = sqrt(0.0535 x 0.9465 x (2/10000)) = 0.003182
z = 0.007 / 0.003182 = 2.1996 -> two-sided p = 0.0278
(b) theta = 1200/2000 = 0.6 ; rho = 1200 / sqrt(2000 x 2000) = 0.6
Var(Y_cuped) = (1 - 0.36) Var(Y) = 0.64 Var(Y)
same power with 64% of the users (like 1/0.64 = 1.5625 times the sample)
p = ০.০২৮ মানে “B ভালো হওয়ার সম্ভাবনা ৯৭%” নয়; মানে, আসলে পার্থক্য না থাকলে এত বড় বা বড় z পাওয়ার সম্ভাবনা ২.৮%. CUPED গড় পার্থক্য বদলায় না, শুধু noise কমায়।
১০.৩(মাঝারি) (ক) একটি জেলায় ডেলিভারি fee বাড়ানো হলো। সাপ্তাহিক গড় অর্ডার: সেই জেলায় আগে ১২০, পরে ১০৫; তুলনার জেলায় আগে ১০০, পরে ৯৮. DiD কত, আর কোন অনুমানে? (খ) ৫০:৫০ বরাদ্দের A/B test-এ ২০,০০০ জনের ১০,২০০ আর ৯,৮০০ জন দুই দলে এলেন: sample ratio mismatch? (ঝালিয়ে নিন: পর্ব ৬৩, ৬৪)
(a) DiD = (105 - 120) - (98 - 100) = -15 - (-2) = -13 orders per week
assumption: parallel trends (without the fee, both would have moved alike)
(b) expected 10000 each ; chi2 = 200^2/10000 + 200^2/10000 = 8.0, df 1 -> p = 0.0047
-> the split itself is broken: find the cause before reading any effect
শুধু আগে-পরে দেখলে −১৫ বলতেন; তুলনার জেলাও ২ কমেছে (মৌসুম বা বাজার), সেটুকু বাদ দিয়ে −১৩. SRM-এ ২% বিচ্যুতি ছোট দেখায়, কিন্তু ২০,০০০ জনে তা কাকতালীয় হওয়া খুব অসম্ভাব্য।
১০.৪(সহজ) (ক) একজন গ্রাহক মাসে m = ২০০ টাকা লাভ দেন, মাসিক retention r = ০.৮, মাসিক discount d = ০.০১: অসীম সময়ের CLV? (খ) শুধু ১২ মাস ধরলে? (গ) একটি cohort-এ ১,০০০ জন, পরের মাসে ৬০০, তার পরের মাসে ৪৫০: মাসভিত্তিক retention? (ঝালিয়ে নিন: পর্ব ৬৫)
(a) CLV = 200 / (1 + 0.01 - 0.8) = 200 / 0.21 = 952.38 taka
(b) 952.38 x (1 - (0.8/1.01)^12) = 952.38 x 0.9390 = 894.30 taka
(c) month 1: 600/1000 = 0.60 ; month 2: 450/600 = 0.75 (450/1000 = 0.45 of the start)
(ক)-র ৯৪% মূল্যই প্রথম ১২ মাসে আসে, কারণ r = ০.৮-এ লোক দ্রুত কমে। (গ)-তে retention সাধারণত সময়ের সঙ্গে বাড়ে: যাঁরা টিকে থাকেন, তাঁরা বেশি অনুগত। তাই একটি স্থির r বাস্তবের সরল রূপ।
১০.৫(মাঝারি) একটি prediction API-র ২০টি latency (ms): ১২, ১৫, ১১, ১৪, ৯০, ১৩, ১৬, ১২, ১৮, ২৫০, ১৪, ১৩, ১৭, ১৫, ১২, ১৯, ১৪, ১৬, ১৩, ৬০. (ক) গড়, p৫০, p৯০, p৯৫, p99 (nearest rank)? (খ) প্রতি সেকেন্ডে ৪০০টি অনুরোধ, গড়ে ২৫ ms: একসঙ্গে গড়ে কয়টি চলছে? (গ) একটি worker একটি অনুরোধে ১০ ms নেয়; ৭০% ব্যবহারের লক্ষ্যে কয়টি worker? (ঝালিয়ে নিন: পর্ব ৬৮)
(a) sorted: 11 12 12 12 13 13 13 14 14 14 15 15 16 16 17 18 19 60 90 250
mean = 644 / 20 = 32.2
p50: ceil(0.50 x 20) = 10th = 14 ; p90: 18th = 60
p95: 19th = 90 ; p99: ceil(19.8) = 20th = 250
(b) L = lambda W = 400 x 0.025 = 10 requests in flight
(c) one worker = 100 req/s ; 400 / (100 x 0.7) = 5.7 -> 6 workers
গড় ৩২.২ ms কোনো আসল অনুরোধের মতো নয়: ১৭টি ২০ ms-এর নিচে, তিনটি অনেক ওপরে। তাই budget লেখা হয় p95 বা p99-এ। ২০টি মাপে p99 মানে শুধু সবচেয়ে খারাপটি; ভরসাযোগ্য p99-এর জন্য অনেক বেশি অনুরোধ লাগে।
১০.৬(সহজ) (ক) ৫ কোটি সারি আর ২০টি সংখ্যার column float64-এ কত GB? float32-এ? ১০ লাখ সারির একটি chunk? (খ) নজরদারিতে ৪০টি feature প্রতিদিন ৫% স্তরে স্বাধীনভাবে test করলে, কোনো বদল না থাকলেও গড়ে কয়টি ভুয়া সতর্কতা, আর অন্তত একটির সম্ভাবনা? (ঝালিয়ে নিন: পর্ব ৬৯, ৭০)
(a) 50,000,000 x 20 x 8 B = 8.0 GB ; float32: 4.0 GB
one chunk of 1,000,000 rows: 1,000,000 x 20 x 8 = 160 MB
(b) expected false alerts 40 x 0.05 = 2 per day
P(at least one) = 1 - 0.95^40 = 0.8715 ; Bonferroni per test: 0.05/40 = 0.00125
৮ GB একটি সাধারণ ল্যাপটপের memory-তে টানাটানি, আর pandas-এ মাঝের কপি মিলিয়ে আরও বেশি লাগে; তাই chunk ধরে পড়া বা out-of-core পদ্ধতি। (খ) দেখায় কেন প্রতিদিন প্রায় নিশ্চিতভাবে অন্তত একটি “drift” সতর্কতা আসবে, যদি সংশোধন না থাকে।
import numpy as np
from scipy import stats
za, zb = stats.norm.ppf(0.975), stats.norm.ppf(0.80) # 10.1
p1, p2 = 0.05, 0.06; pb = (p1 + p2) / 2
n = (za * np.sqrt(2 * pb * (1 - pb)) + zb * np.sqrt(p1 * (1 - p1) + p2 * (1 - p2)))**2 / (p2 - p1)**2
print(f"10.1 z {za:.4f} {zb:.4f} | proportions n/arm {n:.1f} -> {int(np.ceil(n))}"
f" | mean metric n/arm {2 * (za + zb)**2 * 400**2 / 20**2:.1f}")
x1, x2, m = 500, 570, 10000 # 10.2
p = (x1 + x2) / (2 * m); se = np.sqrt(p * (1 - p) * 2 / m); z = (x2 - x1) / m / se
print(f"10.2 pooled p {p:.4f} SE {se:.6f} z {z:.4f} p-value {2 * stats.norm.sf(z):.4f}")
print(" CUPED theta", 1200 / 2000, "| rho 0.6 -> var x", 1 - 0.6**2, "| n-equivalent x", round(1 / 0.64, 4))
print("10.3 DiD", (105 - 120) - (98 - 100), end=" | ")
obs = np.array([10200, 9800]); chi = ((obs - 10000)**2 / 10000).sum()
print("SRM chi2", chi, "p", round(stats.chi2.sf(chi, 1), 5))
M, r, d = 200, 0.8, 0.01 # 10.4
clv = M / (1 + d - r); c12 = clv * (1 - (r / (1 + d))**12)
print(f"10.4 CLV {clv:.2f} | 12 months {c12:.2f} | check sum {sum(M * r**(t-1) / (1+d)**t for t in range(1, 13)):.2f}")
lat = np.array([12, 15, 11, 14, 90, 13, 16, 12, 18, 250, 14, 13, 17, 15, 12, 19, 14, 16, 13, 60])
srt = np.sort(lat); nr = lambda q: srt[int(np.ceil(q * len(srt))) - 1] # 10.5 nearest rank
print("10.5 sorted", srt.tolist(), "\n mean", lat.mean(), "p50", nr(0.5), "p90", nr(0.9),
"p95", nr(0.95), "p99", nr(0.99))
print(" Little L =", 400 * 0.025, "| workers at 70%:", 400 / (100 * 0.7), "->", int(np.ceil(400 / 70)))
print("10.6 bytes f64", 50_000_000 * 20 * 8 / 1e9, "GB | f32", 50_000_000 * 20 * 4 / 1e9,
"GB | chunk 1M rows", 1_000_000 * 20 * 8 / 1e6, "MB | P(>=1 false alert)", round(1 - 0.95**40, 4))z 1.9600 0.8416, অনুপাতে n/arm 8157.7 -> 8158, গড়ে 6279.1. z-test z 2.1996 p-value 0.0278; CUPED theta 0.6, var x 0.64, 1.5625. 10.3 DiD -13 | SRM chi2 8.0 p 0.00468. CLV 952.38 | 12 months 894.30, আর মাস ধরে সরাসরি যোগেও 894.30. Latency: mean 32.2 p50 14 p90 60 p95 90 p99 250; Little L = 10.0, worker 6. শেষ লাইনে 8.0 GB, 4.0 GB, 160.0 MB আর 0.8715.
সাধারণ ভুল: সংজ্ঞা না লিখে সংখ্যা লেখা। NDCG-এর IDCG, percentile-এর নিয়ম, McNemar-এ continuity correction, lasso-র objective-এ ½, sample size-এর কোন সূত্র: প্রতিটিতে দুই-তিনটি চালু রূপ আছে, আর উত্তর বদলায়। খাতার শুরুতে এক লাইনে নিজের সংজ্ঞা লিখলে ভিন্ন রূপের সঠিক উত্তরও পরীক্ষক মেলাতে পারেন।
শেষ মুহূর্তের সূত্র-তালিকা আর সাধারণ ভুল
পরীক্ষার আগে এই এক টেবিলই যথেষ্ট; তৃতীয় কলামের ভুলগুলো মনে রাখাই বেশি কাজের।
| বিষয় | সূত্র | সাধারণ ভুল | পর্ব |
|---|---|---|---|
| Kappa, PAC | (po − pe)/(১ − pe); n ≥ (ln|H| + ln(২/δ))/(২ε2) | শতকরা মিলকেই মান ভাবা; ε কমানোর দাম ভুলে যাওয়া | ০৩, ০৫ |
| Rank, eigen, SVD | rank + nullity = n; ∑λ = trace; ‖A‖F2 = ∑σ2 | σ-কে AᵀA-এর eigenvalue বলা (আসলে তার বর্গমূল) | ০৬–১০ |
| Gradient, momentum, Adam | η < ২/L; v ← βv − η∇f; m̂ = m/(১ − βt) | প্রথম ধাপের loss দেখে η বাছা; bias correction বাদ | ১৩, ১৪ |
| Newton, KKT | x ← x − f′/f″; μ ≥ ০, μg = ০ | নিষ্ক্রিয় শর্তে μ ≠ ০ রাখা; সক্রিয় কি না যাচাই না করা | ১৫, ১৬ |
| Lasso, ridge | S(z, λ); z/(১ + λ) | ridge-কেও শূন্য করে ভাবা | ১৭ |
| MLE, MAP | k/n; (k + a − ১)/(n + a + b − ২) | MAP আর posterior mean গোলানো | ১৮ |
| Mahalanobis, GLM | (x − μ)ᵀΣ−১(x − μ); eβ গুণে | coefficient-কে যোগে পড়া | ১৯, ২০ |
| McNemar, Holm, BH | (|b − c| − ১)2/(b + c); α/(m − k + ১); kα/m | সব চারটি ঘর ব্যবহার; Holm-এ থামতে ভুলে যাওয়া | ২২ |
| Calibration | ECE = ∑(nb/N)|ō − p̄|; Brier = গড় (p − y)2 | ECE ছোট মানেই model ভালো ভাবা | ২৬ |
| SVM | প্রস্থ ২/‖w‖; hinge max(০, ১ − yf); w = ∑αyx | ১/‖w‖ বা ‖w‖ লেখা | ২৭, ২৮ |
| Tree, ensemble | Gini ১ − ∑p2; ρσ2 + (১ − ρ)σ2/B; α = ½ln((১ − ε)/ε) | ওজন ছাড়া গড়; normalise ভুলে যাওয়া | ৩২–৩৪ |
| XGBoost | w* = −G/(H + λ); gain-এ ½ আর −γ | λ বা ½ বাদ; g-কে y − p লেখা | ৩৬ |
| EM, KDE, GP | r ∝ πN; (১/nh)∑K; k*ᵀ(K + σ2I)−১y | KDE-তে ১/h বাদ; GP-তে noise বাদ | ৩৯, ৪০, ৪৬ |
| MH, EI | min(১, অনুপাত × q-এর অনুপাত); σ(zΦ + φ) | অপ্রতিসম q-এর সংশোধন বাদ; বড় করা আর ছোট করার z গোলানো | ৪৭, ৪৯ |
| Imbalance | CFP/(CFP + CFN); prior odds সংশোধন | ০.৫ সীমা; undersampled সম্ভাবনা সরাসরি ব্যবহার | ৫০ |
| Forecast, NDCG, KM | MASE; DCG/IDCG; ∏(১ − d/n) | censored-কে ঘটনা ধরা; IDCG-এর সংজ্ঞা না লেখা | ৫১–৫৫ |
| Shapley, conformal, PSI | ভারযুক্ত প্রান্তিক অবদান; ⌈(n + ১)(১ − α)⌉; ∑(a − e)ln(a/e) | n + ১-এর বদলে n; Shapley-কে কারণ ভাবা | ৫৭–৫৯ |
| Fairness | selection rate, TPR, FPR দলভেদে | একটি metric-কেই “ন্যায্যতা” ভাবা | ৬০ |
| A/B, causal | sample size; z; θ = Cov/Var; DiD | p-কে “B ভালোর সম্ভাবনা” পড়া; SRM না দেখা | ৬২–৬৪ |
| CLV, latency | m/(১ + d − r); ⌈q n⌉-তম; L = λW | গড় latency দিয়ে SLO লেখা | ৬৫, ৬৮ |
২০ মিনিটের মিনি-সেট — ঘড়ি ধরে করুন
আটটি ছোট প্রশ্ন, প্রতিটিতে আড়াই মিনিট। Calculator চলবে, চেকার নয়। ৭–৮ ঠিক হলে প্রস্তুত, ৫–৬ হলে সংশ্লিষ্ট ভাগ আবার, ৪-এর কম হলে ভাগ ২ থেকে আবার শুরু করুন।
- Covariance-এর সারি (২, ০) আর (০, ৮): প্রথম principal component কত ভাগ variance ধরে?
- Lasso-র soft-thresholding: S(−২.৫, ১) কত?
- Beta(১, ১) prior, ৫ বারে ৩ সাফল্য: MAP কত?
- AdaBoost-এ ε = ০.২ হলে α কত?
- ৫টি ধনাত্মক আর ৫টি ঋণাত্মক সারির node-এর Gini?
- McNemar: b = ১৫, c = ৫ (continuity correction-সহ) χ2?
- Split conformal: n = ৯৯, α = ০.১. কততম ছোট score?
- চিকিৎসিত দল আগে ৫০, পরে ৬০; তুলনার দল আগে ৪০, পরে ৪৫. DiD?
উত্তরমিনি-সেটের উত্তর আর এক লাইনের কারণ (নিজে করার পরে খুলুন)
1. eigenvalues 8, 2 -> 8/10 = 0.8
2. sign(-2.5) x max(2.5 - 1, 0) = -1.5
3. flat prior: MAP = MLE = 3/5 = 0.6 (posterior mean would be 4/7 = 0.5714)
4. 0.5 ln(0.8/0.2) = 0.5 ln 4 = 0.6931
5. 1 - (0.25 + 0.25) = 0.5
6. (|15 - 5| - 1)^2 / 20 = 81/20 = 4.05
7. ceil(100 x 0.9) = 90th
8. (60 - 50) - (45 - 40) = 10 - 5 = 5
সবচেয়ে বেশি ভুল হয় ৩ আর ৭-এ: Beta(১, ১)-এ MAP ঠিক MLE (posterior mean নয়), আর conformal-এ n নয়, n + ১ দিয়ে গুণ।
AI-এর যুগে — AI-এর হিসাব, derivation আর কোড যাচাই
AI সহকারীকে XGBoost gain বা conformal interval-এর অঙ্ক দিলে পরিষ্কার, আত্মবিশ্বাসী উত্তর আসে। তাতে প্রায়ই সংজ্ঞা চুপচাপ বদলে যায় (n না n + ১, ½ আছে কি না), বিশ্বাসযোগ্য কিন্তু ভুল derivation আসে, বা পুরোনো library-র কোড। ভুলগুলো চেনা:
| AI-এর ভুল | পরিণাম | কীভাবে ধরবেন |
|---|---|---|
পুরোনো API: LogisticRegression-এ বাদ পড়া multi_class, pandas-এর append, XGBoost/LightGBM-এর পুরোনো argument | TypeError, সতর্কবার্তা বা চুপচাপ অন্য আচরণ | নিজের version-এর মূল docs, তারপর চালানো |
| না থাকা function বা hyperparameter বানানো | কোড চলে না, বা ভুল জিনিস শেখে | help() বা docs-এ নামটি খোঁজা |
| Test set-এ tuning, বা split-এর আগে scaling/SMOTE | Leakage, ফোলানো score | আগে split, locked test set, pipeline-এ fit |
| Training বা একটি split-এর metric-কে চূড়ান্ত বলা | ভাগ্যের ওপর নির্ভর সিদ্ধান্ত | কয়েকটি seed বা fold, সরল baseline-এর পাশে |
| Imbalance বা calibration উপেক্ষা | ০.৫ সীমায় প্রায় কিছুই ধরা পড়ে না | খরচ থেকে সীমা, reliability diagram |
| SHAP বা Shapley-কে কারণ হিসেবে পড়া | ভুল ব্যবসায়িক সিদ্ধান্ত | ব্যাখ্যা model-এর, জগতের নয়; কারণের জন্য পরীক্ষা বা causal নকশা |
| বিশ্বাসযোগ্য কিন্তু ভুল derivation (চিহ্ন, ½, λ বাদ) | খাতায় শূন্য, কোডে নীরব ভুল | ছোট উদাহরণে নিজে আবার derive করে সংখ্যা মেলানো |
AI-কে উত্তরদাতা নয়, যাচাইকারী হিসেবে ব্যবহার করুন। ক্রেতার নাম, ফোন নম্বর বা প্রতিষ্ঠানের গোপন ডেটা prompt-এ দেবেন না; সংখ্যাগুলো নিজের বানানো উদাহরণে বদলে নিন।
যাচাইয়ের চেকলিস্ট
নিজেকে যাচাই করুন
প্রতিটি প্রশ্নে খাতায় হিসাব করে তবে উত্তর বাছুন। সব তথ্য প্রশ্নের ভেতরেই আছে।
ক্রমSplit conformal দিয়ে regression-এর interval বানানোর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- ডেটাকে training আর calibration ভাগে আলাদা করা
- শুধু training ভাগে model শেখানো
- Calibration ভাগের প্রতিটি সারিতে |y − ŷ| score বের করা
- Score সাজিয়ে ⌈(n + ১)(১ − α)⌉-তম ছোট মান q̂ নেওয়া
- নতুন সারিতে ŷ − q̂ থেকে ŷ + q̂ পর্যন্ত interval দেওয়া
(সহজ) একটি linear SVM-এ w = (৩, ৪)। Margin-এর প্রস্থ (দুই margin রেখার দূরত্ব) কত?
- ০.৪
- ০.২
- ৫
- ২.৫
(মাঝারি) XGBoost-এর একটি পাতায় gradient-এর যোগ G = −৩, hessian-এর যোগ H = ২, λ = ১. সেরা leaf weight কত?
- ১.৫
- ১.০
- −১.০
- ৩.০
(সহজ) সারি (১, ২) আর (২, ৪)-এর matrix-এর rank কত?
- ০
- ২
- ১
- ৪
(সহজ) Orthonormal design-এ একটি OLS coefficient z = ৪, λ = ১. Ridge (w = z/(১ + λ)) কত দেয়?
- ৩.০
- ২.০
- ৪.০
- ০
(মাঝারি) বড় n-এর ডেটায় একটি নির্দিষ্ট সারি একটি bootstrap নমুনায় অন্তত একবার ওঠার সম্ভাবনা প্রায় কত?
- ০.৩৬৮
- ০.৫০০
- ১.০০০
- ০.৬৩২
(মাঝারি) তিনটি পরীক্ষার p-value ০.০১, ০.০২, ০.০৪, α = ০.০৫. Holm কয়টি null বাতিল করে?
- ১
- ২
- ৩
- ০
(মাঝারি) Momentum v ← ০.৯v − ০.১g. এখন v = −০.২ আর gradient g = ১. নতুন v কত?
- −০.২৮
- −০.৩০
- −০.০৮
- −০.১৮
(মাঝারি) f(x) = (x − ৫)2, x0 = ০. Newton-এর এক ধাপ পরে x কত?
- ১০
- ২.৫
- ০
- ৫
(মাঝারি) গড় (০, ০), Σ = diag(৪, ১), বিন্দু x = (২, ১)। Mahalanobis দূরত্ব কত?
- ২.২৩৬
- ১.৪১৪
- ২.০০০
- ৪.১২৩
(মাঝারি) ১০ জন ক্রেতা। t = ১-এ ২ জন চলে গেলেন; তারপর ১ জন censored; t = ২-এ বাকি ৭ জনের ১ জন চলে গেলেন। Kaplan–Meier Ŝ(২) কত?
- ০.৬০০০
- ০.৭০০০
- ০.৬৮৫৭
- ০.৮০০০
(মাঝারি) A/B test-এ আগের খরচ আর metric-এর correlation ρ = ০.৫. CUPED-এর পরে metric-এর variance আগের কত ভাগ?
- ০.৭৫
- ০.৫০
- ০.২৫
- ১.২৫
(সহজ) ২০টি latency মাপ ছোট থেকে বড় সাজানো। Nearest-rank নিয়মে p95 কোনটি?
- ১০তম
- ১৮তম
- ২০তম
- ১৯তম
(কঠিন) Validation loss ছোট করতে Bayesian optimization; সেরা f* = ০.৩০. একটি প্রার্থীর posterior μ = ০.৩০, σ = ০.১০ (ξ = ০)। Expected improvement কত? (φ(০) = ০.৩৯৮৯)
- ০
- ০.০৩৯৯
- ০.৫০০০
- ০.৩৯৮৯
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব শব্দ এখানে একসাথে:
মনে রাখুন
- সংজ্ঞা আগে, হিসাব পরে: n না n + ১, ½ আছে কি না, IDCG কোন item থেকে, percentile কোন নিয়মে। অর্ধেক মতভেদ এখানেই।
- যাচাইয়ের এক লাইন: ∑λ = trace, ∑σ2 = ‖A‖F2, AdaBoost-এর পরে ভুলের ওজন ০.৫, Shapley-র যোগ v(সব) − v(∅), dual = primal.
- গুণে পড়া, যোগে নয়: GLM-এর eβ, CUPED-এর (১ − ρ2), bagging-এর ρσ2 মেঝে।
- একটি সংখ্যা পুরো গল্প নয়: ECE-এর পাশে Brier, precision-এর পাশে দলভেদে TPR, গড় latency-র পাশে p95, p-value-র পাশে SRM.
- চেকার দিয়ে মেলান: আগে হাতে, তারপর কোড; কোড আগে চালালে ভুল ধাপটি শেখা হয় না।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৭৪ · MCQ প্রশ্নব্যাংক — Machine Learningপরবর্তী পর্বসব মডিউল থেকে ৭৩টি MCQ, প্রতিটি বিকল্পের ব্যাখ্যাসহ।
- মেশিন লার্নিং · কোর্স হোম৭৭টি পর্বপরের পর্ব ৭৪, MCQ প্রশ্নব্যাংক, আর পুরো রোডম্যাপ এখান থেকে।
- AI-এর ভিত্তি · পর্ব ৭৫ · Numerical অনুশীলনভিত্তিBayes, entropy, ROC AUC, k-means, TF-IDF আর backprop-এর প্রাথমিক হিসাব।
- পর্ব ২৮ · Soft margin, hinge loss আর dualআবার পড়ুনC-এর ভূমিকা, dual problem আর support vector.
- পর্ব ৩৬ · XGBoost, LightGBM আর CatBoostআবার পড়ুনLeaf weight আর split gain-এর derivation, হাতে-কলমে।
- পর্ব ৫৮ · Conformal predictionআবার পড়ুনSplit conformal, coverage-এর নিশ্চয়তা আর তার সীমা।
- পর্ব ৬২ · A/B test-এর পরিকল্পনাআবার পড়ুনPower, sample size আর peeking-এর ফাঁদ।
- DSA · Trace আর complexity অনুশীলনপাশের ট্র্যাকAlgorithm-এর হাতে-করা trace আর জটিলতার হিসাব।