Skip to content

সমাধান — অধ্যায় ৫.৭ · Nonparametric Regression: Kernels & Splines

অধ্যায় part-5-modeling/05-07-nonparametric-regression.md-এর section ৭-এর সব অনুশীলনীর পূর্ণ সমাধান। চলমান dataset — seed np.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\) বড় → মসৃণ)