সমাধান — অধ্যায় ৫.৭ · Nonparametric Regression: Kernels & Splines¶
অধ্যায়
part-5-modeling/05-07-nonparametric-regression.md-এর section ৭-এর সব অনুশীলনীর পূর্ণ সমাধান। চলমান dataset — seednp.random.default_rng(20260619), \(n=150\): \(x=\operatorname{sort}(\text{Uniform}(0,1))\); সত্যিকারের ফাংশন \(f(x)=\sin(2\pi x)\); \(y_i=f(x_i)+\varepsilon_i\), \(\varepsilon_i\sim\mathcal N(0,0.3^2)\)। প্রতিটি সংখ্যাগত ফলnumpy/statsmodels/scipyদিয়ে যাচাই করা হয়েছে — §ঘ-এর runnable script এ-ই data-generation-ক্রমে নিচের canonical সংখ্যা হুবহু পুনরুৎপাদন করে। canonical সংখ্যা: linear OLS \(R^2=0.510\) (MSE-vs-true \(0.1995\)); Nadaraya–Watson (Gaussian) MSE-vs-true — \(h=0.02\to0.0095\), \(h=0.05\to0.0077\), \(h=0.20\to0.1228\), \(h=0.40\to0.2865\), LOOCV-সেরা \(h\approx0.03\); cubic B-spline (OLS-on-basis) — df\(=4\to\) MSE \(0.0051\), df\(=6\to R^2=0.810\) (MSE \(0.0019\)), df\(=9\to\) MSE \(0.0024\); smoothing spline (\(s=13.5\)) MSE \(0.0197\); true \(f(0.25)=1\), \(f(0.5)=0\)।
ক · ধারণাগত (conceptual)¶
৭.১ ★ — parametric বনাম nonparametric¶
(ক) parametric regression \(f\)-কে একটা সসীম-মাত্রিক স্থির রূপে বাঁধে — যেমন \(f(x)=\beta_0+\beta_1 x\), parameter \(\beta\in\mathbb R^p\) যেখানে \(p\) stays স্থির, \(n\) বাড়লেও বাড়ে না। অনুমান শক্ত, কিন্তু সঠিক হলে কম data-তেই দক্ষ। nonparametric regression \(f\)-এর রূপ আগে থেকে বাঁধে না; কার্যকর parameter-সংখ্যা data-র সাথে বাড়তে পারে — \(f\)-কে data থেকেই "আকার নিতে" দেওয়া। নমনীয়, কিন্তু বেশি data দরকার ও convergence ধীর।
(খ) চলমান উদাহরণে সত্য \(f(x)=\sin(2\pi x)\) একটা বাঁকা ফাংশন, আর সরলরেখা সেটিকে ধরতেই পারে না — fit ও সত্যের মধ্যে একটা পদ্ধতিগত ফাঁক। এটা উচ্চ bias (model misspecification / underfitting), variance নয়। প্রমাণ: \(R^2=0.510\) মানে সরলরেখা মোট তারতম্যের অর্ধেকও ব্যাখ্যা করতে পারছে না, এবং MSE-vs-true \(0.1995\) বড় — কারণ অনমনীয় রূপ চূড়া-খাঁজ ধরতে অক্ষম।
(গ) nonparametric যুক্তিসঙ্গত যখন: (i) সম্পর্কের রূপ অজানা বা জটিল (যেমন এখানে \(\sin\)); (ii) পর্যাপ্ত data আছে (nonparametric data-হাংরি); (iii) লক্ষ্য prediction, coefficient-ব্যাখ্যা নয়। parametric ভালো যখন: তত্ত্ব থেকে রূপ জানা (physics-এর সূত্র, ক্ষয়ের exponential), data কম, অথবা coefficient-এর সরাসরি অর্থ (effect size, elasticity) দরকার।
৭.২ ★ — Nadaraya–Watson একটা স্থানীয় weighted average¶
(ক) weight \(w_i(x)=\dfrac{K_h(x-x_i)}{\sum_j K_h(x-x_j)}\)। যোগফল: $\(\sum_i w_i(x)=\sum_i\frac{K_h(x-x_i)}{\sum_j K_h(x-x_j)}=\frac{\sum_i K_h(x-x_i)}{\sum_j K_h(x-x_j)}=1.\)$ লব ও হর একই যোগফল (শুধু index-নাম ভিন্ন), তাই অনুপাত \(1\) — যেকোনো kernel ও যেকোনো \(h\)-এর জন্য। অর্থাৎ \(\hat f(x)=\sum_i w_i(x)y_i\) সত্যিকারের একটা weighted average (ভারিত গড়) (convex combination)।
(খ) যদি সব \(y_i=c\) (ধ্রুবক) হতো: $\(\hat f(x)=\sum_i w_i(x)\,c=c\sum_i w_i(x)=c\cdot 1=c.\)$ ধ্রুবক ফাংশন হুবহু পুনরুৎপাদিত — Nadaraya–Watson ধ্রুবকে কোনো bias আনে না। এটা কাঙ্ক্ষিত: যেকোনো যুক্তিসঙ্গত smoother-এর অন্তত একটা সমতল সংকেতকে নিখুঁতভাবে ধরা উচিত (নইলে এমনকি no-signal ক্ষেত্রেও সে ভুল করবে)।
(গ) box kernel \(K(u)=\tfrac12\mathbb 1\{\lvert u\rvert\le1\}\) ⇒ \(K_h(x-x_i)\ne0\) শুধু যখন \(\lvert x-x_i\rvert\le h\)। তাই \(x\)-এর \(h\)-দূরত্বের ভেতরের সব বিন্দু সমান weight পায়, বাইরের শূন্য — \(\hat f(x)\) হয় ঐ window-এর \(y\)-গুলোর সাধারণ গড় (moving average / local mean)। অর্থাৎ box-kernel Nadaraya–Watson = সরল window-গড়।
৭.৩ ★★ — bandwidth \(h\) ↔ bias–variance tradeoff¶
(ক) খুব ছোট \(h\) (\(0.02\)): প্রতিটা estimate কয়েকটামাত্র কাছের বিন্দুর গড় ⇒ noise কম গড়-হয় ⇒ উচ্চ variance; fit কাঁপা/wiggly — data-র random ওঠানামাকেই অনুসরণ করে। bias কম (স্থানীয়ভাবে সত্যের কাছাকাছি), কিন্তু অস্থির।
(খ) খুব বড় \(h\) (\(0.40\)): অনেক দূরের বিন্দুও মিশে যায় ⇒ estimate প্রায় গোটা data-র গড়ের দিকে ⇒ উচ্চ bias (oversmoothing); \(\sin\)-এর চূড়া-খাঁজ মসৃণ হয়ে চাপা পড়ে, fit প্রায় সমতল। variance কম, কিন্তু সত্য থেকে বহু দূরে।
(গ) MSE-vs-true: \(h=0.02\to0.0095\), \(h=0.05\to\mathbf{0.0077}\), \(h=0.20\to0.1228\), \(h=0.40\to0.2865\) — স্পষ্ট U-আকার: \(h\) বাড়ার সাথে আগে কমে (variance↓), তারপর বাড়ে (bias↑)। এই চারটার মধ্যে সর্বনিম্ন \(h=0.05\)-এ। optimal \(h\) হলো দুই চরমের আপস — যথেষ্ট বড় যাতে noise গড়-হয় (variance নিয়ন্ত্রণ), কিন্তু যথেষ্ট ছোট যাতে \(\sin\)-এর গঠন থাকে (bias নিয়ন্ত্রণ)। পূর্ণ optimum LOOCV-তে \(h\approx0.03\) (§৭.১৩)।
৭.৪ ★★ — optimal bandwidth-এর rate \(h^\*\propto n^{-1/5}\)¶
(ক) \(n\) বাড়লে যেকোনো ছোট window-এও যথেষ্ট বিন্দু পাওয়া যায়; তাই variance না-বাড়িয়ে \(h\) ছোট করা যায়, আর ছোট window মানে কম bias (স্থানীয়ভাবে \(f\) প্রায় ধ্রুবক/রৈখিক)। ফলে বেশি data ⇒ সূক্ষ্মতর স্থানীয় fit ⇒ optimal \(h\) কমে। (তত্ত্ব: kernel-MSE \(\approx \underbrace{c_1 h^4}_{\text{bias}^2}+\underbrace{c_2/(nh)}_{\text{variance}}\); এর \(h\)-মিনিমাইজার \(h^\*\propto n^{-1/5}\), এবং সেখানে MSE \(\propto n^{-4/5}\)।)
(খ) parametric (সঠিক রূপ) estimator-এর MSE \(\propto n^{-1}\); nonparametric kernel-এর সর্বোত্তম MSE \(\propto n^{-4/5}\) — ধীরতর। কারণ: parametric একটা স্থির রূপ ধরে নেওয়ায় সব data একসাথে অল্প কয়েকটা parameter-এ "তথ্য জমা" করে; nonparametric-এ অজানা \(f\)-এর প্রতিটা স্থানীয় অংশ আলাদাভাবে শিখতে হয় (কম তথ্য-ভাগাভাগি, রূপ-অনুমানের শক্তি নেই), তাই একই \(n\)-এ কম কার্যকর। উচ্চ মাত্রায় এটা আরও তীব্র — "curse of dimensionality"।
(গ) \(n\) ১০ গুণ বাড়লে optimal \(h\) গুণিতক \(10^{-1/5}=10^{-0.2}\approx0.631\) — অর্থাৎ optimal \(h\) প্রায় \(0.63\) গুণ (≈\(37\%\) ছোট) হয়। বড় sample-এ সামান্যই ছোট window দরকার — convergence ধীর হওয়ারই আরেক রূপ।
৭.৫ ★★ — regression spline = OLS on a basis; effective df = basis-সংখ্যা¶
(ক) হ্যাঁ — knot ঠিক করার পর B-spline basis-function \(B_k(x)\)-গুলো স্থির (data-নির্ভর নয়)। তাই \(\hat f(x)=\sum_k\gamma_k B_k(x)\) হলো features \(\{B_k(x)\}\)-এর ওপর একটা সাধারণ linear regression — parameter \(\gamma\)-তে রৈখিক, ৫.১-এর polynomial/basis-expansion-এর সরাসরি ধারাবাহিকতা; শুধু basis বদলেছে (monomial → স্থানীয়, স্থিতিশীল B-spline)। তাই OLS-এর গোটা যন্ত্র (normal equation, hat matrix) সরাসরি খাটে।
(খ) df = basis-function সংখ্যা = নমনীয়তা। বেশি df ⇒ curve আরও স্থানীয় বাঁক ধরতে পারে ⇒ bias কমে, fit আঁটসাঁট হয়। চলমান উদাহরণে df\(=4\to\) MSE \(0.0051\) (সামান্য underfit) → df\(=6\to0.0019\) (সর্বনিম্ন) — df বাড়ানোয় fit উন্নত। তবে অতি-বেশি df-এ variance/overfit বাড়ে: df\(=9\to0.0024\) (আবার সামান্য বেড়ে) — ক্লাসিক U-আকার।
(গ) regression spline একটা linear smoother \(\hat{\mathbf f}=S\mathbf y\), যেখানে \(S=B(B^\top B)^{-1}B^\top\) — একটা projection (hat) matrix। যেকোনো projection-এর জন্য \(\operatorname{tr}(S)=\operatorname{rank}(B)=K\) (basis-column-সংখ্যা, যদি পূর্ণ rank)। আর \(K\) = estimate-করা \(\gamma_k\)-এর সংখ্যা। তাই effective degrees of freedom \(=\operatorname{tr}(S)=K\) = basis-সংখ্যা = coefficient-সংখ্যা (পূর্ণ প্রমাণ §৭.১১)। ঠিক যেমন সাধারণ OLS-এ \(p\) predictor মানে df \(=p\)।
৭.৬ ★★ — knots, এবং natural cubic spline¶
(ক) knot বাড়ালে টুকরো-polynomial-এর সংখ্যা বাড়ে ⇒ effective df ও নমনীয়তা বাড়ে (এবং variance)। প্রান্তে (boundary) সাধারণ cubic spline প্রায়ই বুনো/অস্থির: সেখানে data কম, অথচ cubic-এর ঘাত বেশি (cubic term প্রান্তে দ্রুত ওঠানামা করে), তাই fit বড় উলম্ব দোলা ও অনির্ভরযোগ্য extrapolation দেখায় — উচ্চ boundary variance।
(খ) natural cubic spline দুই প্রান্তের বাইরে \(f\)-কে রৈখিক হতে বাধ্য করে — সমতুল্যভাবে, প্রান্তে \(f''=0\) চাপায়। এতে প্রান্তে polynomial-এর উচ্চ-ঘাত (quadratic/cubic) ওঠানামা নিষিদ্ধ হয়; প্রান্তে fit একটা স্থিতিশীল রেখায় বসে। ফলে যেখানে data সবচেয়ে কম সেখানেই variance কমে, extrapolation যুক্তিসঙ্গত হয়।
(গ) দুই প্রান্তে দুটো করে শর্ত (প্রতিটিতে \(f''=0\) এবং \(f'''=0\)-জাতীয় constraint, মোট কার্যত ৪টা) parameter "বাঁচায়"। তাই একই knot-সংখ্যায় natural cubic spline-এর effective df সাধারণ cubic spline-এর চেয়ে কম — কম নমনীয় কিন্তু প্রান্তে অনেক স্থিতিশীল; data কম থাকলেও নিরাপদ। (এজন্যই natural cubic spline-ই smoothing spline-এর গাণিতিক সমাধান-শ্রেণি।)
খ · গণনামূলক (computational)¶
৭.৭ ★ — Nadaraya–Watson হাতে: box-kernel weighted average¶
বিন্দু: \((0.0,0.0),(0.1,0.8),(0.3,0.5)\); box kernel \(K(u)=\tfrac12\mathbb 1\{\lvert u\rvert\le1\}\); \(h=0.15\); query \(x=0.1\)।
(ক) \(u_i=(x-x_i)/h=(0.1-x_i)/0.15\): $\(u_1=\frac{0.1-0.0}{0.15}=0.667\ (\lvert u_1\rvert\le1,\ \text{ভেতরে}),\quad u_2=\frac{0.1-0.1}{0.15}=0\ (\text{ভেতরে}),\quad u_3=\frac{0.1-0.3}{0.15}=-1.333\ (\lvert u_3\rvert=1.333>1,\ \textbf{বাইরে}).\)$
(খ) শুধু বিন্দু \(1,2\) window-এ; box kernel-এ তারা সমান weight পায় (\(w_1=w_2\), \(w_3=0\)): $\(\hat f(0.1)=\frac{\sum_i w_i y_i}{\sum_i w_i}=\frac{y_1+y_2}{2}=\frac{0.0+0.8}{2}=\mathbf{0.40}.\)$
(গ) এটি window-এর ভেতরের \(y\)-মানগুলোর সাধারণ গড় (\(\tfrac{0+0.8}{2}\)) — box kernel-এ Nadaraya–Watson = local mean (moving average), যা §৭.২(গ)-এর সরাসরি উদাহরণ।
৭.৮ ★ — Gaussian-kernel weighted average হাতে¶
একই বিন্দু; Gaussian kernel \(K(u)=e^{-u^2/2}\) (normalize হবে বলে ধ্রুবক বাদ); \(h=0.1\); query \(x=0.1\)।
(ক) raw weight \(k_i=\exp\!\big(-\tfrac12\big(\tfrac{0.1-x_i}{0.1}\big)^2\big)\): $\(k_1=e^{-\frac12(1)^2}=e^{-0.5}=0.6065,\qquad k_2=e^{-\frac12(0)^2}=1,\qquad k_3=e^{-\frac12(2)^2}=e^{-2}=0.1353.\)$
(খ) \(\sum_j k_j=0.6065+1+0.1353=1.7418\); normalize: $\(w_1=\frac{0.6065}{1.7418}=0.348,\quad w_2=\frac{1}{1.7418}=0.574,\quad w_3=\frac{0.1353}{1.7418}=0.0777.\)$ $\(\hat f(0.1)=\sum_i w_i y_i=0.348(0)+0.574(0.8)+0.0777(0.5)=0+0.4595+0.0388=\mathbf{0.498}\approx0.50.\)$
(গ) box-kernel ফল \(0.40\)-এর চেয়ে একটু বড় (\(\approx0.50\)): Gaussian দূরের বিন্দু \(3\) (\(y=0.5\))-কে শূন্য না দিয়ে ছোট weight (\(0.0777\)) দেয়, তাই উত্তর সামান্য উপরে টানে। গুরুত্বপূর্ণ বৈসাদৃশ্য — smooth kernel-এ কোনো বিন্দু হঠাৎ "কাটা" পড়ে না, তাই \(x\)-এর সাথে \(\hat f\) ধারাবাহিকভাবে বদলায় (box-এর মতো ঝাঁকুনি-জাম্প নেই)।
৭.৯ ★★ — bias–variance সংখ্যায় পড়া¶
MSE-vs-true: \(h=0.02\to0.0095\), \(h=0.05\to0.0077\), \(h=0.20\to0.1228\), \(h=0.40\to0.2865\); linear OLS \(0.1995\)।
(ক) সাজানো (MSE ছোট→বড়): \(h=0.05\,(0.0077)<h=0.02\,(0.0095)<h=0.20\,(0.1228)<h=0.40\,(0.2865)\)। - \(h=0.02\): variance-প্রধান অঞ্চল (কাঁপা fit), তবু bias কম বলে MSE মোটামুটি ছোট। - \(h=0.05\): ভারসাম্য — সর্বনিম্ন MSE। - \(h=0.20,\ 0.40\): bias-প্রধান (oversmoothing) — MSE দ্রুত বাড়ে।
(খ) বড় \(h\)-এ kernel প্রায় সব বিন্দুকে সমান-ভাবে মেশায় ⇒ \(\hat f\) প্রায় ধ্রুবক (গোটা data-র গড়ের দিকে) ⇒ \(\sin(2\pi x)\)-এর গঠন প্রায় পুরো হারায়। \(h=0.20\) (\(0.1228\)) linear OLS-এর (\(0.1995\)) কাছাকাছি, আর \(h=0.40\) (\(0.2865\)) এর চেয়েও খারাপ — কারণ একটা ধ্রুবক একটা সরলরেখার চেয়েও কম নমনীয়, তাই \(\sin\)-কে আরও খারাপভাবে ধরে।
(গ) MSE-অনুপাত: \(0.1995/0.0077\approx\mathbf{25.9}\) গুণ ছোট। সঠিক bandwidth-এর kernel smoother linear OLS-এর চেয়ে প্রায় ২৬ গুণ ছোট MSE দেয় — সরলরেখা \(\sin(2\pi x)\)-কে ধরতে bias-এ এতটাই ব্যর্থ। এটাই nonparametric-এর নমনীয়তার বাস্তব মূল্য: রূপ অজানা/বাঁকা হলে স্থানীয় পদ্ধতি বিপুলভাবে এগিয়ে।
৭.১০ ★★ — regression spline df ও fit¶
cubic B-spline (OLS-on-basis): df\(=4\to\) MSE \(0.0051\), df\(=6\to R^2=0.810\), MSE \(0.0019\), df\(=9\to\) MSE \(0.0024\)।
(ক) df\(=6\) মানে \(6\)টা B-spline basis-coefficient estimate হয় (intercept-সহ মোট column-সংখ্যা code-এ সামান্য বেশি দেখাতে পারে — নিচের নোট), তাই effective df \(\approx6\) (\(S=B(B^\top B)^{-1}B^\top\)-এর \(\operatorname{tr}\))। \(n=150\)-এর তুলনায় অত্যন্ত parsimonious (\(6\ll150\)) — মাত্র ৬টা সংখ্যায় গোটা curve।
নোট (reproducibility):
patsy-রbs(x, df=6, degree=3, include_intercept=True)মোট \(7\) column দেয় (intercept-সহ), তাই \(S\)-এর \(\operatorname{tr}=7\)। "df=6" বলতে B-spline-এর spline-df বোঝানো হয়েছে; effective df-এর সঠিক সংজ্ঞা \(\operatorname{tr}(S)\) = মোট estimate-করা coefficient। মূল শিক্ষা অপরিবর্তিত: effective df = basis-column-সংখ্যা, যা \(n\)-এর তুলনায় খুবই ছোট।
(খ) df \(4\to6\): MSE কমল (\(0.0051\to0.0019\)) — কম basis মানে সামান্য underfit (bias বেশি), df বাড়ালে নমনীয়তা বেড়ে bias কমে। df \(6\to9\): MSE আবার সামান্য বাড়ল (\(0.0019\to0.0024\)) — অতিরিক্ত basis মানে বেশি নমনীয়তা ⇒ variance বাড়ে (noise-ও ধরা শুরু, সামান্য overfit)। সব মিলিয়ে df-এর সাথে U-আকার — ঠিক bandwidth-এর মতোই bias–variance tradeoff, শুধু ডায়াল ভিন্ন।
(গ) সেরা spline (df\(=6\), MSE \(\mathbf{0.0019}\)) সেরা kernel (\(h=0.05\), MSE \(0.0077\))-এর চেয়ে একটু এগিয়ে (প্রায় \(4\) গুণ ছোট MSE)। কারণ: cubic spline একটা মসৃণ global basis যা \(\sin\)-এর মতো অসীম-মসৃণ ফাংশনকে মাত্র কয়েকটা coefficient-এ চমৎকার approximate করে, এবং boundary-তেও স্থিতিশীল; Nadaraya–Watson স্থানীয়-গড় বলে সামান্য বেশি variance বহন করে (এবং প্রান্তে boundary bias)। মসৃণ সত্য-ফাংশনে basis-পদ্ধতির এটাই স্বাভাবিক সুবিধা।
গ · প্রমাণভিত্তিক (proof-based)¶
৭.১১ ★★ — regression spline একটা linear smoother; effective df \(=\operatorname{tr}(S)=K\)¶
\(B\): \(n\times K\) B-spline basis-matrix (\(B_{ik}=B_k(x_i)\)), পূর্ণ column-rank \(K\); \(\hat\gamma=(B^\top B)^{-1}B^\top\mathbf y\) (OLS)।
(ক) linear smoother। fitted মান: $\(\hat{\mathbf f}=B\hat\gamma=B(B^\top B)^{-1}B^\top\mathbf y=S\mathbf y,\qquad S:=B(B^\top B)^{-1}B^\top.\)$ \(S\) data-matrix \(B\) ও \(x_i\)-এর ওপর নির্ভর করে, \(\mathbf y\)-এর ওপর নয়; তাই \(\hat{\mathbf f}\) হলো \(\mathbf y\)-এর একটা রৈখিক রূপান্তর ⇒ regression spline একটা linear smoother। ∎
(খ) \(S\) একটা projection। symmetry: $\(S^\top=\big(B(B^\top B)^{-1}B^\top\big)^\top=B\big((B^\top B)^{-1}\big)^\top B^\top=B(B^\top B)^{-1}B^\top=S,\)$ যেহেতু \(B^\top B\) symmetric ⇒ তার inverse-ও symmetric। idempotency: $\(S^2=B(B^\top B)^{-1}\underbrace{B^\top B(B^\top B)^{-1}}_{=I_K}B^\top=B(B^\top B)^{-1}B^\top=S.\)$ \(S^\top=S\) ও \(S^2=S\) ⇒ \(S\) একটা orthogonal projection matrix (column-space of \(B\)-এর ওপর)। ∎
(গ) \(\operatorname{tr}(S)=K\)। cyclic property of trace (\(\operatorname{tr}(AB)=\operatorname{tr}(BA)\)): $\(\operatorname{tr}(S)=\operatorname{tr}\!\big(B(B^\top B)^{-1}B^\top\big)=\operatorname{tr}\!\big((B^\top B)^{-1}\underbrace{B^\top B}_{}\big)=\operatorname{tr}(I_K)=K.\)$ তাই effective degrees of freedom \(=\operatorname{tr}(S)=K\) = basis-function-সংখ্যা = estimate-করা coefficient-সংখ্যা। ∎
এজন্যই linear smoother-এর জটিলতা/নমনীয়তাকে \(\operatorname{tr}(S)\) দিয়ে সংজ্ঞায়িত করা হয়: projection-এ তা ঠিক rank (\(=K\)); সাধারণ smoother-এও (Nadaraya–Watson, smoothing spline) \(\operatorname{tr}(S)\) একই "কার্যকর parameter-সংখ্যা"-র ভূমিকা রাখে, যা ভিন্ন পদ্ধতিকে এক স্কেলে তুলনাযোগ্য করে (৫.২-এর model-complexity-র সাধারণীকরণ)।
৭.১২ ★★★ — smoothing-spline penalty \(\lambda\): দুই সীমা¶
penalized criterion: \(\displaystyle\min_f\ \sum_{i=1}^n\big(y_i-f(x_i)\big)^2+\lambda\int\big(f''(t)\big)^2dt\); প্রথম পদ data-fit, দ্বিতীয় পদ roughness (বক্রতা) শাস্তি, \(\lambda\ge0\)।
(ক) \(\lambda\to0\)। penalty উধাও ⇒ criterion কেবল data-fit পদ। তাকে minimize (শূন্য) করতে minimizer প্রতিটা বিন্দু ছুঁয়ে যায়: \(f(x_i)=y_i\) সব \(i\)-এর জন্য (residual \(\equiv0\))। এটি interpolating (natural cubic) spline — চরম overfit, উচ্চ variance (data-র noise-ও fit করে, fit বুনোভাবে দোলে)। roughness-এর কোনো নিয়ন্ত্রণ নেই।
(খ) \(\lambda\to\infty\)। roughness-penalty প্রবল ⇒ যেকোনো \(\int f''^2>0\) অসীম শাস্তি পায় ⇒ minimizer বাধ্য হয় \(\int f''^2=0\), অর্থাৎ \(f''(t)\equiv0\) সর্বত্র। \(f''\equiv0\) ⇒ \(f(x)=a+bx\) — একটা সরলরেখা। তখন criterion কার্যত \(\sum_i(y_i-a-bx_i)^2\)-এর OLS minimization, যা ঠিক ৫.১-এর simple linear regression। চরম oversmooth, উচ্চ bias (সব বক্রতা মুছে ফেলে)।
(গ) তাই \(\lambda\) একটা ধারাবাহিক tuning knob: \(\lambda\to0\) প্রান্তে interpolation (high variance), \(\lambda\to\infty\) প্রান্তে linear fit (high bias), মাঝে মসৃণ আপস। এটা bandwidth ও df-এর সাথে একই bias–variance অক্ষ:
| tuning | high-variance প্রান্ত | high-bias প্রান্ত |
|---|---|---|
| bandwidth \(h\) | ছোট \(h\) (কাঁপা) | বড় \(h\) (oversmooth) |
| spline df / knots | বড় df (overfit) | ছোট df (underfit) |
| penalty \(\lambda\) | \(\lambda\to0\) (interpolate) | \(\lambda\to\infty\) (linear) |
তিনটা প্যারামিটার একই tradeoff-এর ভিন্ন প্যারামিটারাইজেশন; মাঝামাঝি মান সর্বোত্তম। চলমান উদাহরণে smoothing spline \(s=13.5\) (একটা মাঝারি penalty-স্তর) MSE-vs-true \(0.0197\) দেয় — interpolation ও linear-এর মাঝখানে data-noise-কে চমৎকার মসৃণ করে। ∎
ঘ · কোডিং (Python)¶
৭.১৩ ★★★ — পূর্ণ nonparametric-regression pipeline¶
নিচের একটিমাত্র runnable script seed-আউটপুট হুবহু পুনরুৎপাদন করে। data-generation-এ random-call-এর ক্রম (আগে x, তারপর noise) canonical সংখ্যার জন্য আবশ্যক।
import numpy as np
import statsmodels.api as sm
from patsy import dmatrix
from scipy.interpolate import splrep, splev
# ---------- canonical dataset (seed-আউটপুট মেলাতে এই ক্রম জরুরি) ----------
rng = np.random.default_rng(20260619)
n = 150
x = np.sort(rng.uniform(0, 1, n)) # 1st random draw: predictor
f_true = np.sin(2 * np.pi * x) # সত্যিকারের f(x)
y = f_true + rng.normal(0, 0.3, n) # 2nd random draw: noise
def mse_true(yhat): # MSE বনাম সত্য f (বাস্তবে অজানা; এখানে সিমুলেশন বলে জানি)
return np.mean((yhat - f_true) ** 2)
# ---- 1. baseline linear OLS ----
X = sm.add_constant(x)
ols = sm.OLS(y, X).fit()
yhat_lin = ols.predict(X)
print(f"1. linear OLS : R2={ols.rsquared:.3f} MSE-vs-true={mse_true(yhat_lin):.4f}")
# -> R2=0.510 MSE-vs-true=0.1995
# ---- 2. Nadaraya-Watson (Gaussian kernel) ----
def nw(xq, x, y, h):
# row i: kernel weights of all x around xq[i]; normalize -> weighted average
K = np.exp(-0.5 * ((xq[:, None] - x[None, :]) / h) ** 2)
return (K @ y) / K.sum(axis=1)
print("2. Nadaraya-Watson MSE-vs-true:")
for h in (0.02, 0.05, 0.20, 0.40):
print(f" h={h:.2f} -> {mse_true(nw(x, x, y, h)):.4f}")
# -> 0.02:0.0095 0.05:0.0077 0.20:0.1228 0.40:0.2865 (U-আকার: 0.05 সেরা)
# ---- 3. LOOCV bandwidth (leave-one-out: প্রতিটা x_i-তে নিজেকে বাদ) ----
def loocv(x, y, h):
K = np.exp(-0.5 * ((x[:, None] - x[None, :]) / h) ** 2)
np.fill_diagonal(K, 0.0) # i নিজে বাদ
pred = (K @ y) / K.sum(axis=1)
return np.mean((y - pred) ** 2)
grid = np.round(np.arange(0.01, 0.301, 0.005), 3)
cv = [loocv(x, y, h) for h in grid]
h_best = grid[int(np.argmin(cv))]
print(f"3. LOOCV-best h = {h_best:.3f}") # -> 0.030
# ---- 4. cubic B-spline (regression spline = OLS on B-spline basis) ----
print("4. cubic B-spline (OLS-on-basis):")
for df in (4, 6, 9):
B = dmatrix(f"bs(x, df={df}, degree=3, include_intercept=True)",
{"x": x}, return_type="dataframe").values
fit = sm.OLS(y, B).fit()
yhat = fit.predict(B)
# effective df = #basis columns = tr(S), S = B (B'B)^{-1} B'
print(f" df={df} (eff df={B.shape[1]}): "
f"R2={fit.rsquared:.3f} MSE-vs-true={mse_true(yhat):.4f}")
# -> df=4 (5): R2=0.808 MSE=0.0051 ; df=6 (7): R2=0.810 MSE=0.0019 ; df=9 (10): R2=0.811 MSE=0.0024
# ---- 5. smoothing spline (roughness penalty via scipy splrep smoothing s) ----
tck = splrep(x, y, s=13.5, k=3)
yhat_ss = splev(x, tck)
print(f"5. smoothing spline s=13.5: MSE-vs-true={mse_true(yhat_ss):.4f}") # -> 0.0197
# ---- 6. comparison ----
print("\n6. তুলনা (MSE-vs-true, ছোট = ভালো):")
print(f" linear OLS : {mse_true(yhat_lin):.4f}")
print(f" NW (h=0.05, সেরা) : {mse_true(nw(x,x,y,0.05)):.4f}")
B6 = dmatrix("bs(x, df=6, degree=3, include_intercept=True)", {"x":x}, return_type="dataframe").values
print(f" B-spline (df=6) : {mse_true(sm.OLS(y,B6).fit().predict(B6)):.4f}")
print(f" smoothing spline : {mse_true(yhat_ss):.4f}")
# spline (0.0019) জিতল; kernel (0.0077) দ্বিতীয়; দুটোই linear (0.1995)-এর চেয়ে নাটকীয়ভাবে ভালো
প্রত্যাশিত আউটপুট (canonical):
| পদ্ধতি | tuning | \(R^2\) | MSE-vs-true |
|---|---|---|---|
| linear OLS | — | \(0.510\) | \(0.1995\) |
| Nadaraya–Watson | \(h=0.02\) | — | \(0.0095\) |
| Nadaraya–Watson | \(h=0.05\) (সেরা) | — | \(\mathbf{0.0077}\) |
| Nadaraya–Watson | \(h=0.20\) | — | \(0.1228\) |
| Nadaraya–Watson | \(h=0.40\) | — | \(0.2865\) |
| Nadaraya–Watson | LOOCV-সেরা | \(h\approx0.03\) | — |
| cubic B-spline | df\(=4\) | \(0.808\) | \(0.0051\) |
| cubic B-spline | df\(=6\) | \(\mathbf{0.810}\) | \(\mathbf{0.0019}\) |
| cubic B-spline | df\(=9\) | \(0.811\) | \(0.0024\) |
| smoothing spline | \(s=13.5\) | — | \(0.0197\) |
মূল পর্যবেক্ষণ। 1. nonparametric >> linear। সরলরেখা (\(0.1995\)) \(\sin(2\pi x)\)-কে ধরতে ব্যর্থ (high bias); সেরা kernel (\(0.0077\)) ও spline (\(0.0019\)) যথাক্রমে প্রায় \(26\times\) ও \(105\times\) ছোট MSE — রূপ অজানা/বাঁকা হলে nonparametric-ই পথ। 2. U-আকার tradeoff। Nadaraya–Watson MSE \(h\)-এর সাথে আগে কমে পরে বাড়ে (\(0.05\) সেরা); B-spline df-এর সাথে তেমন (\(6\) সেরা) — একই bias–variance অক্ষ, ভিন্ন ডায়াল। 3. spline একটু এগিয়ে। মসৃণ \(\sin\)-এ global B-spline basis (df\(=6\), MSE \(0.0019\)) স্থানীয় kernel-এর চেয়ে সামান্য ভালো — boundary-তে স্থিতিশীল, কম coefficient-এ মসৃণ ফাংশন ধরে। 4. tuning কীভাবে বাছব? এখানে MSE-vs-true জানা (simulation); বাস্তবে সত্য \(f\) অজানা, তাই LOOCV-এর held-out error দিয়ে \(h\) (বা df/\(\lambda\)) বাছতে হয় (\(h\approx0.03\)) — এই নীতিনিষ্ঠ পথের পূর্ণ কাঠামো ৫.৮-এ।
(ঐচ্ছিক সম্প্রসারণ: from statsmodels.nonparametric.kernel_regression import KernelReg দিয়ে built-in NW/local-linear ও স্বয়ংক্রিয় bandwidth; bs বনাম cr (natural cubic) basis তুলনা; scipy.interpolate.UnivariateSpline(x, y, s=...) দিয়ে smoothing spline-এর effective df ও penalty-সীমা (\(s\to0\) interpolate, \(s\) বড় → মসৃণ)