SVD ও PCA-র গাণিতিক ভিত্তি
এই পাঠে যা শিখবেন
- SVD-র সংজ্ঞা এবং eigendecomposition-এর সাথে এর সম্পর্ক
- PCA-র সম্পূর্ণ গাণিতিক ডেরিভেশন — Lagrange multiplier দিয়ে সর্বোচ্চ-ভেরিয়েন্স দিক খুঁজে বের করা
- Principal component ও explained variance-এর সঠিক সংজ্ঞা
- NumPy-তে
np.linalg.svdও covariance eigendecomposition-এর মধ্যে সামঞ্জস্য যাচাই
১ · Singular Value Decomposition (SVD)
পাঠ ১০-এ আমরা দেখেছি eigendecomposition ($\mathbf{A}=\mathbf{V}\Lambda\mathbf{V}^{-1}$) শুধু বর্গ ম্যাট্রিক্সের জন্য কাজ করে, এবং তাও সব বর্গ ম্যাট্রিক্সের জন্য নয় (diagonalizable হতে হয়)। কিন্তু বাস্তব ডেটা ম্যাট্রিক্স ($m$টি স্যাম্পল, $n$টি ফিচার) সাধারণত বর্গাকার নয়। SVD এই সীমাবদ্ধতা দূর করে — যেকোনো $m\times n$ ম্যাট্রিক্স $\mathbf{A}$-কে ভাঙা যায়:
$$ \mathbf{A} = \mathbf{U}\Sigma\mathbf{V}^T $$যেখানে $\mathbf{U}$ ($m\times m$) ও $\mathbf{V}$ ($n\times n$) হলো অর্থোগোনালOrthogonal Matrixএমন একটি ম্যাট্রিক্স $\mathbf{Q}$ যার $\mathbf{Q}^T\mathbf{Q}=\mathbf{I}$ — এর কলামগুলো পরস্পর লম্ব ও unit-length। ম্যাট্রিক্স ($\mathbf{U}^T\mathbf{U}=\mathbf{I}$, $\mathbf{V}^T\mathbf{V}=\mathbf{I}$ — অর্থাৎ এদের ইনভার্স বের করতে transpose নিলেই চলে, পাঠ ০৯-এর সাধারণ ইনভার্সের চেয়ে অনেক সস্তা), এবং $\Sigma$ ($m\times n$) একটি ডায়াগোনাল ম্যাট্রিক্স যার ডায়াগোনাল এন্ট্রিগুলো ($\sigma_1\geq\sigma_2\geq\cdots\geq0$) — এদের বলা হয় সিঙ্গুলার ভ্যালু (singular values), এবং এরা সবসময় অ-ঋণাত্মক।
$\mathbf{A}$-এর সিঙ্গুলার ভ্যালুগুলো হলো $\mathbf{A}^T\mathbf{A}$-এর আইগেনভ্যালুর বর্গমূল: $\sigma_i=\sqrt{\lambda_i(\mathbf{A}^T\mathbf{A})}$। লক্ষ করুন $\mathbf{A}^T\mathbf{A}$ সবসময় বর্গাকার ও সিমেট্রিক (যেকোনো $\mathbf{A}$-এর জন্য), তাই পাঠ ১০-এর spectral theorem সরাসরি প্রযোজ্য — এর আইগেনভ্যালু সবসময় রিয়েল, এবং আসলে সবসময় অ-ঋণাত্মকও (কারণ $\mathbf{x}^T(\mathbf{A}^T\mathbf{A})\mathbf{x}=\|\mathbf{Ax}\|^2\geq0$ — এই ধারণাটি পরের পাঠে positive semi-definiteness হিসেবে ফিরে আসবে)।
২ · PCA কী সমস্যার সমাধান করে
ধরুন আপনার কাছে $n$-মাত্রিক ডেটা আছে (যেমন হাজার হাজার ফিচার), এবং আপনি চান সবচেয়ে গুরুত্বপূর্ণ কয়েকটি দিকে সেটাকে সংকুচিত করতে — এমনভাবে যাতে যতটা সম্ভব তথ্য (ভেরিয়েন্স) বজায় থাকে। PCAPrincipal Component Analysisএকটি ডেটাসেটের সর্বোচ্চ ভেরিয়েন্সের দিকগুলো খুঁজে বের করার এবং সেই দিকে ডেটা প্রজেক্ট করার একটি পদ্ধতি। ঠিক এই সমস্যার সমাধান — এটি এমন দিক (direction) খুঁজে বের করে যেদিকে ডেটার ভেরিয়েন্স সবচেয়ে বেশি ছড়ানো।
৩ · PCA-র ডেরিভেশন — সর্বোচ্চ ভেরিয়েন্সের দিক
ডেটা মিন-সেন্টার্ড (mean-centered) ধরে নিই ($\mathbb{E}[\mathbf{x}]=\mathbf{0}$)। একটি একক দিক $\mathbf{v}$ ($\|\mathbf{v}\|=1$) বরাবর ডেটা প্রজেক্ট করলে, প্রজেকশনের ভেরিয়েন্স হলো $\mathbf{v}^T\mathbf{C}\mathbf{v}$, যেখানে $\mathbf{C}$ ডেটার কোভেরিয়েন্স ম্যাট্রিক্স (পাঠ ২৭-এ সম্পূর্ণ সংজ্ঞা আসবে; আপাতত এটাকে ডেটার "স্প্রেড" ধরে নিন)। লক্ষ্য: এই ভেরিয়েন্স সর্বোচ্চ করা এমন $\mathbf{v}$ খুঁজে বের করা — কিন্তু $\|\mathbf{v}\|=1$ শর্তসাপেক্ষে (নইলে $\mathbf{v}$ কে অসীম বড় করে ভেরিয়েন্সও অসীম করে ফেলা যেত, যা অর্থহীন)।
$$ \max_{\mathbf{v}} \ \mathbf{v}^T\mathbf{C}\mathbf{v} \quad \text{subject to} \quad \|\mathbf{v}\|^2 = \mathbf{v}^T\mathbf{v} = 1 $$এই ধরনের constrained optimization সমাধানের স্ট্যান্ডার্ড পদ্ধতি হলো Lagrange multiplier। আমরা একটি নতুন ফাংশন বানাই:
$$ \mathcal{L}(\mathbf{v},\lambda) = \mathbf{v}^T\mathbf{C}\mathbf{v} - \lambda(\mathbf{v}^T\mathbf{v}-1) $$$\mathbf{v}$-এর সাপেক্ষে গ্রেডিয়েন্ট নিয়ে শূন্যের সমান বসালে (পাঠ ১৪-এর গ্রেডিয়েন্ট নিয়ম প্রয়োগ করে, $\nabla_\mathbf{v}(\mathbf{v}^T\mathbf{C}\mathbf{v})=2\mathbf{C}\mathbf{v}$ এবং $\nabla_\mathbf{v}(\mathbf{v}^T\mathbf{v})=2\mathbf{v}$):
$$ 2\mathbf{C}\mathbf{v} - 2\lambda\mathbf{v} = 0 \quad\Rightarrow\quad \mathbf{C}\mathbf{v} = \lambda\mathbf{v} $$এই সমীকরণটি চিনতে পারছেন — এটি ঠিক পাঠ ১০-এর আইগেনভ্যালু সমীকরণ! অর্থাৎ, সমাধান $\mathbf{v}$ অবশ্যই $\mathbf{C}$-এর একটি আইগেনভেক্টর হতে হবে। এখন কোন আইগেনভেক্টর? সমীকরণে ফিরে বসাই: $\mathbf{v}^T\mathbf{C}\mathbf{v}=\mathbf{v}^T(\lambda\mathbf{v})=\lambda(\mathbf{v}^T\mathbf{v})=\lambda$ (যেহেতু $\|\mathbf{v}\|=1$)। অর্থাৎ, প্রজেকশনের ভেরিয়েন্স ঠিক $\lambda$-এর সমান — তাই ভেরিয়েন্স সর্বোচ্চ করতে আমাদের সবচেয়ে বড় আইগেনভ্যালু-র আইগেনভেক্টর বেছে নিতে হবে।
প্রথম principal component হলো কোভেরিয়েন্স ম্যাট্রিক্স $\mathbf{C}$-এর সবচেয়ে বড় আইগেনভ্যালুর আইগেনভেক্টর। দ্বিতীয় principal component হলো দ্বিতীয় সর্বোচ্চ আইগেনভ্যালুর আইগেনভেক্টর (যা প্রথমটির সাথে অর্থোগোনাল — spectral theorem, কারণ $\mathbf{C}$ সিমেট্রিক), ইত্যাদি। প্রতিটি আইগেনভ্যালু $\lambda_i$ সরাসরি বলে দেয় সেই দিকে কতটা ভেরিয়েন্স আছে — একেই বলা হয় explained variance।
৪ · SVD থেকে PCA সরাসরি
বাস্তবে, কোভেরিয়েন্স ম্যাট্রিক্স $\mathbf{C}=\frac{1}{n-1}\mathbf{X}^T\mathbf{X}$ (যেখানে $\mathbf{X}$ মিন-সেন্টার্ড ডেটা ম্যাট্রিক্স, প্রতি সারিতে একটি স্যাম্পল) আলাদা করে হিসাব না করে, সরাসরি $\mathbf{X}$-এর SVD নেওয়া হয়। যদি $\mathbf{X}=\mathbf{U}\Sigma\mathbf{V}^T$, তাহলে $\mathbf{X}^T\mathbf{X}=\mathbf{V}\Sigma^T\Sigma\mathbf{V}^T$ — যা $\mathbf{V}$-এর কলামগুলোকেই $\mathbf{X}^T\mathbf{X}$-এর আইগেনভেক্টর হিসেবে প্রকাশ করে, আর $\Sigma$-এর সিঙ্গুলার ভ্যালুর বর্গ ($\sigma_i^2$) হলো (একটি স্কেলিং ফ্যাক্টর $n-1$ বাদে) কোভেরিয়েন্সের আইগেনভ্যালু। তাই বাস্তবে PCA সাধারণত সরাসরি ডেটা ম্যাট্রিক্সের উপর SVD চালিয়ে করা হয় — কোভেরিয়েন্স ম্যাট্রিক্স স্পষ্টভাবে হিসাব করার প্রয়োজন পড়ে না, যা সংখ্যাগতভাবে বেশি স্থিতিশীল।
৫ · কোড দিয়ে যাচাই
নিচে একটি ছোট ডেটাসেটে দুটি পদ্ধতিতেই — কোভেরিয়েন্স ম্যাট্রিক্সের eigendecomposition এবং সরাসরি SVD — principal component বের করে দেখানো হলো, এবং দুটি ফলাফল মিলে যায় তা যাচাই করা হলো।
import numpy as np
# একটি ছোট ডেটাসেট — ৫টি স্যাম্পল, ২টি ফিচার (একটি স্পষ্ট প্রধান দিক-সহ)
X = np.array([
[2.5, 2.4],
[0.5, 0.7],
[2.2, 2.9],
[1.9, 2.2],
[3.1, 3.0],
])
X_centered = X - X.mean(axis=0)
# পদ্ধতি ১: কোভেরিয়েন্স ম্যাট্রিক্সের eigendecomposition
C = np.cov(X_centered, rowvar=False)
eigvals, eigvecs = np.linalg.eigh(C) # C সিমেট্রিক, তাই eigh (দ্রুত ও স্থিতিশীল)
order = np.argsort(eigvals)[::-1] # বড় থেকে ছোট ক্রমে সাজানো
eigvals, eigvecs = eigvals[order], eigvecs[:, order]
print("আইগেনভ্যালু (explained variance):", eigvals)
print("প্রথম principal component:", eigvecs[:, 0])
# পদ্ধতি ২: সরাসরি SVD
U, S, Vt = np.linalg.svd(X_centered)
print("সিঙ্গুলার ভ্যালু:", S)
print("সিঙ্গুলার ভ্যালু^2 / (n-1):", S**2 / (len(X) - 1))
print("SVD থেকে প্রথম principal component:", Vt[0])
S**2 / (n-1) এবং কোভেরিয়েন্সের eigvals প্রায় একই মান দেয় (সাইন/ক্রম ভিন্ন
হতে পারে)। এটিই এই পাঠের কেন্দ্রীয় তথ্যের সরাসরি সংখ্যাগত প্রমাণ — সিঙ্গুলার ভ্যালুর বর্গ ও কোভেরিয়েন্সের
আইগেনভ্যালু একই জিনিস, শুধু ভিন্ন পথে হিসাব করা।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ যদি একটি ডেটাসেটের সব দিকে সমান ভেরিয়েন্স থাকে (যেমন একটি নিখুঁত বৃত্তাকার ছড়ানো ডেটা), তাহলে PCA-র আইগেনভ্যালুগুলো কেমন হবে?
সবগুলো আইগেনভ্যালু প্রায় সমান হবে — কোনো একটি দিক "প্রধান" হয়ে উঠবে না। এক্ষেত্রে PCA আসলে খুব একটা কাজে আসে না, কারণ dimensionality reduction-এর মূল ধারণাই হলো কিছু দিকে বেশি ভেরিয়েন্স, কিছু দিকে কম — যদি সব দিকে সমান ভেরিয়েন্স থাকে, কোনো দিক বাদ দিলেই তথ্য সমানভাবে হারাবে।
প্র ০২ PCA করার আগে ডেটাকে মিন-সেন্টার (mean-center) করা কেন জরুরি?
ডেরিভেশনে ভেরিয়েন্স হিসাব করার সময় ধরে নেওয়া হয়েছিল $\mathbb{E}[\mathbf{x}]=\mathbf{0}$। মিন-সেন্টার না করলে, $\mathbf{X}^T\mathbf{X}$ আসলে ভেরিয়েন্সের বদলে দ্বিতীয়-মোমেন্ট (second moment, গড়ের চারপাশে নয়, শূন্যের চারপাশে ছড়ানো) মাপবে — মিন যদি শূন্য থেকে দূরে থাকে, তাহলে "সবচেয়ে বেশি ছড়ানো দিক" আসলে শুধু ডেটার গড় অবস্থানের দিকে পক্ষপাতদুষ্ট হয়ে যাবে, প্রকৃত স্প্রেড নয়।
প্র ০৩ কেন বাস্তব লাইব্রেরি (যেমন scikit-learn-এর PCA) সাধারণত কোভেরিয়েন্স ম্যাট্রিক্স হিসাব করে eigendecomposition করার বদলে সরাসরি ডেটা ম্যাট্রিক্সে SVD চালায়?
কোভেরিয়েন্স ম্যাট্রিক্স $\mathbf{X}^T\mathbf{X}$ হিসাব করার সময় সংখ্যাগত precision হারানোর ঝুঁকি থাকে (ছোট সিঙ্গুলার ভ্যালু বর্গ করলে আরও ছোট হয়ে যায়, floating-point error-এ হারিয়ে যেতে পারে)। সরাসরি $\mathbf{X}$-এর উপর SVD চালালে এই বর্গ করার ধাপ এড়ানো যায়, তাই এটি সংখ্যাগতভাবে বেশি স্থিতিশীল — বিশেষ করে যখন ফিচার-সংখ্যা অনেক বেশি হয়।
অনুশীলন
-
ধারণা যাচাই করুন: যদি কোভেরিয়েন্স ম্যাট্রিক্স $\mathbf{C}=\begin{pmatrix}4&0\\0&1\end{pmatrix}$ হয়, তাহলে প্রথম principal component কী হবে, এবং এটি কত শতাংশ ভেরিয়েন্স ধারণ করে?
এটি ইতিমধ্যে ডায়াগোনাল, তাই আইগেনভ্যালু সরাসরি $4$ ও $1$, আইগেনভেক্টর $(1,0)$ ও $(0,1)$ (পাঠ ১০-এর প্র ০১ দেখুন)। প্রথম PC $=(1,0)$, আইগেনভ্যালু $4$। মোট ভেরিয়েন্স $4+1=5$, তাই প্রথম PC ধারণ করে $4/5=80\%$ ভেরিয়েন্স।
-
কোড বদলান: উপরের কোড সেলে
X-এর ডেটা পয়েন্টগুলো এমনভাবে বদলান যাতে দুটি ফিচার সম্পূর্ণ uncorrelated হয় (যেমন এলোমেলো, একটি প্যাটার্ন ছাড়া) এবং দেখুন দুটি আইগেনভ্যালু কতটা কাছাকাছি আসে।যদি দুটি ফিচার সত্যিই uncorrelated ও সমান ভেরিয়েন্সের হয়, দুটি আইগেনভ্যালু প্রায় সমান হয়ে যাবে — প্র ০১-এর আলোচনার সাথে সামঞ্জস্যপূর্ণ, কারণ তখন কোনো "প্রধান" দিক নেই।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পরবর্তী পাঠ — পজিটিভ ডেফিনিট ম্যাট্রিক্স ও কোয়াড্রেটিক ফর্ম পাঠ ১২ এই পাঠে ব্যবহৃত $\mathbf{v}^T\mathbf{C}\mathbf{v}$ আকারটাই একটি কোয়াড্রেটিক ফর্ম — এর পরবর্তী তত্ত্ব।
- Machine Learning কোর্স প্রয়োগ দেখুন Dimensionality reduction, ফিচার এক্সট্র্যাকশন ও রিকমেন্ডেশন সিস্টেমে PCA/SVD সরাসরি ব্যবহৃত হয় — এটি এই কোর্সের সবচেয়ে ব্যবহারিক পাঠগুলোর একটি।
- সব AI Courses দেখুন ABCL TECH AI Foundations, Python for AI, Machine Learning, Deep Learning, Math for AI ও আরও অনেক কিছু — সব এক জায়গায়।