অ্যামিবার কাছে পিসিএ প্রশ্নগুলির দুর্দান্ত উত্তর ছিল, এতে পিসিএর সাথে এসভিডি সম্পর্ক সম্পর্কিত একটি রয়েছে । আপনার সঠিক প্রশ্নের উত্তরে আমি তিনটি পয়েন্ট করব:
- গাণিতিকভাবে আপনি সরাসরি ডেটা ম্যাট্রিক্সে বা এর কোভারিয়েন্স ম্যাট্রিক্সে পিসিএ গণনা করেন কিনা তাতে কোনও পার্থক্য নেই
- পার্থক্যটি সংখ্যার নির্ভুলতা এবং জটিলতার কারণে pure ডেভিড ম্যাট্রিক্সে সরাসরি এসভিডি প্রয়োগ করা কোভেরিয়েন্স ম্যাট্রিক্সের চেয়ে সংখ্যাগতভাবে আরও স্থিতিশীল
- এসভিডি পিসিএ সম্পাদন করতে বা ইগেন মানগুলি অর্জনের জন্য কোভারিয়েন্স ম্যাট্রিক্সে প্রয়োগ করা যেতে পারে, বাস্তবে, ইগেন সমস্যা সমাধানের এটি আমার প্রিয় পদ্ধতি
এটি দেখা গেছে যে বিশেষত মেশিন লার্নিংয়ের জন্য, এসিভিডি টিপিক্যাল ইগেনুয়ালু ডেকোপজিশন পদ্ধতির চেয়ে বেশি স্থিতিশীল। মেশিন লার্নিংয়ে অত্যন্ত কোলাইনারি রেজিস্ট্রার দিয়ে শেষ করা সহজ। এসভিডি এই ক্ষেত্রে আরও ভাল কাজ করে।
পয়েন্টটি ডেমো করতে এখানে পাইথন কোড। আমি একটি উচ্চ কোলাইনার ডেটা ম্যাট্রিক্স তৈরি করেছি, এর কোভেরিয়েন্স ম্যাট্রিক্স পেয়েছি এবং পরবর্তীগুলির ইউজনালগুলি অর্জন করার চেষ্টা করেছি। এসভিডি এখনও কাজ করছে, যখন সাধারণ এগ্রেন পচন এই ক্ষেত্রে ব্যর্থ হয়।
import numpy as np
import math
from numpy import linalg as LA
np.random.seed(1)
# create the highly collinear series
T = 1000
X = np.random.rand(T,2)
eps = 1e-11
X[:,1] = X[:,0] + eps*X[:,1]
C = np.cov(np.transpose(X))
print('Cov: ',C)
U, s, V = LA.svd(C)
print('SVDs: ',s)
w, v = LA.eig(C)
print('eigen vals: ',w)
আউটপুট:
Cov: [[ 0.08311516 0.08311516]
[ 0.08311516 0.08311516]]
SVDs: [ 1.66230312e-01 5.66687522e-18]
eigen vals: [ 0. 0.16623031]
হালনাগাদ
ফেডেরিকো পোলোনির মন্তব্যের জবাবে, উপরে একই ম্যাট্রিক্সের 1000 এলোমেলো নমুনায় এসভিডি বনাম আইগের স্থায়িত্ব পরীক্ষার কোড এখানে। অনেক ক্ষেত্রে আইগ 0 ছোট আইগেন মান দেখায়, যা ম্যাট্রিক্সের এককতার দিকে নিয়ে যায় এবং এসভিডি এটি এখানে করে না। এসভিডি একটি ছোট এগেন মান নির্ধারণের চেয়ে প্রায় দ্বিগুণ নির্ভুল, যা আপনার সমস্যার উপর নির্ভর করে গুরুত্বপূর্ণ হতে পারে বা নাও পারে।
import numpy as np
import math
from scipy.linalg import toeplitz
from numpy import linalg as LA
np.random.seed(1)
# create the highly collinear series
T = 100
p = 2
eps = 1e-8
m = 1000 # simulations
err = np.ones((m,2)) # accuracy of small eig value
for j in range(m):
u = np.random.rand(T,p)
X = np.ones(u.shape)
X[:,0] = u[:,0]
for i in range(1,p):
X[:,i] = eps*u[:,i]+u[:,0]
C = np.cov(np.transpose(X))
U, s, V = LA.svd(C)
w, v = LA.eig(C)
# true eigen values
te = eps**2/2 * np.var(u[:,1])*(1-np.corrcoef(u,rowvar=False)[0,1]**2)
err[j,0] = s[p-1] - te
err[j,1] = np.amin(w) - te
print('Cov: ',C)
print('SVDs: ',s)
print('eigen vals: ',w)
print('true small eigenvals: ',te)
acc = np.mean(np.abs(err),axis=0)
print("small eigenval, accuracy SVD, Eig: ",acc[0]/te,acc[1]/te)
আউটপুট:
Cov: [[ 0.09189421 0.09189421]
[ 0.09189421 0.09189421]]
SVDs: [ 0.18378843 0. ]
eigen vals: [ 1.38777878e-17 1.83788428e-01]
true small eigenvals: 4.02633695086e-18
small eigenval, accuracy SVD, Eig: 2.43114702041 3.31970128319
এখানে কোড কোড কাজ করে। রুটিনগুলি পরীক্ষা করার জন্য এলোমেলো কোভারিয়েন্স ম্যাট্রিক্স উত্পন্ন করার পরিবর্তে, আমি দুটি ভেরিয়েবলের সাথে এলোমেলো ডেটা ম্যাট্রিক্স উত্পন্ন করছি:
যেখানে - স্বতন্ত্র ইউনিফর্ম র্যান্ডম ভেরিয়েবলগুলি। সুতরাং, কোভেরিয়েন্স ম্যাট্রিক্স হ'ল
যেখানে ig সিগমা_2 ho র - সংযোগের সংখ্যার বৈচিত্রসমূহ তাদের।
x1=ux2=u+εv
u,v(σ21σ21+ερσ1σ2σ21+ερσ1σ2σ21+2ερσ1σ2+ε2σ22σ2)
σ21,σ22,ρ
এর সর্বনিম্ন ইগেনুয়ালু:
সীমিত নির্ভুলতার কারণে কেবলমাত্র সূত্রে করে
ছোট এগেনভ্যালু গণনা করা যায় না , তাই আপনাকে টেলর এটি প্রসারিত করতে হবে:
λ=12(σ22ε2−σ42ε4+4σ32ρσ1ε3+8σ22ρ2σ21ε2+8σ2ρσ31ε+4σ41−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√+2σ2ρσ1ε+2σ21)
ελ≈σ22ε2(1−ρ2)/2
আমি ডেটা ম্যাট্রিক্সের উপলব্ধির , সিমুলেটেড ম্যাট্রিক্স এবং ত্রুটিগুলি ।λ ঞ ই ঞ = λ - λ ঞj=1,…,mλ^jej=λ−λ^j