@amoeba के पास PCA प्रश्नों के उत्कृष्ट उत्तर थे, इसमें SVD से PCA के संबंध में एक भी शामिल था । आपके सटीक प्रश्न का उत्तर देते हुए मैं तीन बिंदु बनाऊंगा:
- गणितीय रूप से इस बात से कोई अंतर नहीं है कि आप पीसीए की गणना डेटा मैट्रिक्स पर सीधे करते हैं या उसके सहसंयोजक मैट्रिक्स पर
- अंतर विशुद्ध रूप से संख्यात्मक परिशुद्धता और जटिलता के कारण है। एसवीडी को सीधे डेटा मैट्रिक्स पर लागू करना संवेदी मैट्रिक्स की तुलना में संख्यात्मक रूप से अधिक स्थिर है
- SVD को covariance मैट्रिक्स पर लागू किया जा सकता है ताकि वह PCA कर सके या eigen मान प्राप्त कर सके, वास्तव में, यह स्वदेशी समस्याओं को हल करने का मेरा पसंदीदा तरीका है
यह पता चला है कि एसवीडी विशेष रूप से मशीन लर्निंग के लिए विशिष्ट ईजेनवल्यू डीकंपोजिशन प्रक्रियाओं की तुलना में अधिक स्थिर है। मशीन लर्निंग में अत्यधिक संपीड़ित रजिस्टरों के साथ समाप्त करना आसान है। एसवीडी इन मामलों में बेहतर काम करता है।
यहाँ बिंदु को प्रदर्शित करने के लिए पायथन कोड है। मैंने एक उच्च कोलीनियर डेटा मैट्रिक्स बनाया, इसका सहसंयोजक मैट्रिक्स प्राप्त किया और बाद के आइजेनवल को प्राप्त करने का प्रयास किया। एसवीडी अभी भी काम कर रहा है, जबकि साधारण ईजन अपघटन इस मामले में विफल रहता है।
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
यहां कोड काम करता है। का परीक्षण करने के लिए यादृच्छिक कोवरियन मैट्रिक्स उत्पन्न करने के बजाय, मैं दो वेरिएबल्स के साथ यादृच्छिक डेटा मैट्रिक्स उत्पन्न कर रहा हूं:
जहां - स्वतंत्र वर्दी यादृच्छिक चर। तो, सहसंयोजक मैट्रिक्स
जहाँ - गणवेश का एकरूपता और सहसंबंध गुणांक। उन्हें।यू , वी ( σ 2 1 σ 2 1 + ε ρ σ 1 σ 2 σ 2 1 + ε ρ σ 1 σ 2 σ 2 1 + 2 ε ρ σ 1 σ 2 + ε 2 σ 2 2 σ 2 ) σ 2 1 , σ 2 2
x1=ux2=u+εv
u,v(σ21σ21+ερσ1σ2σ21+ερσ1σ2σ21+2ερσ1σ2+ε2σ22σ2)
σ21,σ22,ρ
इसका सबसे छोटा स्वदेशी:
छोटे ईजेंवल्यू को केवल सीमित परिशुद्धता के कारण सूत्र में को प्लग करके गणना नहीं की जा सकती है , इसलिए आपको टेलर को इसका विस्तार करने की आवश्यकता है:
ελ≈σ 2 2
λ=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
मैं चला रहा हूँ डेटा मैट्रिक्स की वास्तविकताओं के सिमुलेशन, सिम्युलेटेड मैट्रिक्स , और त्रुटियों को प्राप्त करता है ।λ जे ई जे = λ - λ jj=1,…,mλ^jej=λ−λ^j