इस विषय पर अपनी पूर्व पोस्ट के लिए एक तर्क के रूप में मैं कुछ अस्थायी (यद्यपि अपूर्ण) रैखिक बीजगणित और संबंधित आर कार्यों के पीछे कार्यों की खोज को साझा करना चाहता हूं। यह कार्य प्रगति पर होना चाहिए।
QRuAe11uI−2uuTx
परिणामी प्रक्षेपण के रूप में व्यक्त किया जा सकता है
sign(xi=x1)×∥x∥⎡⎣⎢⎢⎢⎢⎢⎢⎢100⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥+⎡⎣⎢⎢⎢⎢⎢⎢⎢x1x2x3⋮xm⎤⎦⎥⎥⎥⎥⎥⎥⎥
वेक्टर मैट्रिक्स में कॉलम वैक्टर बीच के अंतर को दर्शाता है जिसे हम विघटित करना चाहते हैं और वैक्टर , जो " " द्वारा निर्धारित उप-भाग या "दर्पण" के प्रतिबिंब के अनुरूप है ।एक्स ए वाई यूvxAyu
LAPACK द्वारा उपयोग की गई विधि हाउसहोल्डर रिफ्लेक्टरों में पहली प्रविष्टि के भंडारण की आवश्यकता को में बदलकर उन्हें मुक्त करती है । सदिश से को साथ सामान्य करने के बजाय , यह सिर्फ मुट्ठी प्रविष्टि है जिसे में परिवर्तित किया जाता है ; फिर भी, ये नए वैक्टर - उन्हें हैं, अभी भी एक दिशात्मक वैक्टर के रूप में उपयोग किया जा सकता है।वी यू ‖ यू ‖ = 1 1 w1vu∥u∥=11w
विधि की सुंदरता यह है कि उस को a अपघटन में दिए जाने पर ऊपरी त्रिकोणीय है, हम वास्तव में इन रिफ्लेक्टर्स के साथ भरने के लिए विकर्ण के नीचे में तत्वों का लाभ उठा सकते हैं । शुक्र है, इन वैक्टरों में अग्रणी प्रविष्टियाँ सभी बराबर , मैट्रिक्स के "विवादित" विकर्ण में एक समस्या को रोकती हैं: यह जानते हुए कि वे सभी उन्हें शामिल करने की आवश्यकता नहीं है, और की प्रविष्टियों के लिए विकर्ण उत्पन्न कर सकते हैं ।RQR0Rw11R
फ़ंक्शन में "कॉम्पैक्ट क्यूआर" मैट्रिक्स को "संशोधित" रिफ्लेक्टर के लिए qr()$qr
मोटे तौर पर मैट्रिक्स और निचले त्रिकोणीय "भंडारण" मैट्रिक्स के अतिरिक्त के रूप में समझा जा सकता है ।R
हाउसहोल्डर प्रोजेक्शन में अभी भी फॉर्म , लेकिन हम ( ) के साथ काम नहीं करेंगे , बल्कि एक वेक्टर के साथ , जिनमें से केवल पहली प्रविष्टि होना दोषी है , औरI−2uuTxu∥x∥=1w1
I−2uuTx=I−2w∥w∥wT∥w∥x=I−2wwT∥w∥2x(1) ।
एक यह मान लेगा कि विकर्ण या नीचे इन परावर्तकों को स्टोर करना ठीक रहेगा , की पहली प्रविष्टि को छोड़कर , और इसे एक दिन कहें। हालांकि, चीजें कभी इतनी आसान नहीं होती हैं। इसके बजाय जो विकर्ण के नीचे संग्रहीत किया जाता है, वह का संयोजन है और हाउसहोल्डर परिवर्तन में गुणांकों (1) के रूप में व्यक्त किया गया है, जैसे कि,
को परिभाषित करना :wR1qr()$qr
wtau
रिफ्लेक्टर=w/τRQRτ=wTw2=∥w∥2 , रिफ्लेक्टरों को रूप में व्यक्त किया जा सकता है। । ये "परावर्तक" वैक्टर तथाकथित "कॉम्पैक्ट " में ठीक नीचे संग्रहीत होते हैं ।reflectors=w/τRQR
अब हम vectors से एक डिग्री दूर हैं , और पहली प्रविष्टि अब नहीं है , इसलिए "रिफ़्लेक्टर" वैक्टर की पहली प्रविष्टि को बाहर करने पर जोर देने के बाद आउटपुट को उन्हें पुनर्स्थापित करने के लिए कुंजी को शामिल करना होगा। में सब कुछ फिट । तो क्या हम आउटपुट में मान देख रहे हैं ? खैर, ऐसा नहीं है कि यह अनुमान के मुताबिक होगा। इसके बजाय (जहाँ यह कुंजी संग्रहीत है) के आउटपुट में हम ।1 τw1qr()
qr()$qr
τqr()$qraux
ρ=∑reflectors22=wTwτ2/2
तो नीचे लाल रंग में तैयार, हम "रिफ्लेक्टर" ( ) देखते हैं, उनकी पहली प्रविष्टि को छोड़कर।w/τ
सभी कोड यहाँ है , लेकिन चूंकि यह उत्तर कोडिंग और रैखिक बीजगणित के प्रतिच्छेदन के बारे में है, इसलिए मैं आउटपुट को पेस्ट करूँगा:
options(scipen=999)
set.seed(13)
(X = matrix(c(rnorm(16)), nrow=4, byrow=F))
[,1] [,2] [,3] [,4]
[1,] 0.5543269 1.1425261 -0.3653828 -1.3609845
[2,] -0.2802719 0.4155261 1.1051443 -1.8560272
[3,] 1.7751634 1.2295066 -1.0935940 -0.4398554
[4,] 0.1873201 0.2366797 0.4618709 -0.1939469
अब मैंने फंक्शन House()
को इस प्रकार लिखा है:
House = function(A){
Q = diag(nrow(A))
reflectors = matrix(0,nrow=nrow(A),ncol=ncol(A))
for(r in 1:(nrow(A) - 1)){
# We will apply Householder to progressively the columns in A, decreasing 1 element at a time.
x = A[r:nrow(A), r]
# We now get the vector v, starting with first entry = norm-2 of x[i] times 1
# The sign is to avoid computational issues
first = (sign(x[1]) * sqrt(sum(x^2))) + x[1]
# We get the rest of v, which is x unchanged, since e1 = [1, 0, 0, ..., 0]
# We go the the last column / row, hence the if statement:
v = if(length(x) > 1){c(first, x[2:length(x)])}else{v = c(first)}
# Now we make the first entry unitary:
w = v/first
# Tau will be used in the Householder transform, so here it goes:
t = as.numeric(t(w)%*%w) / 2
# And the "reflectors" are stored as in the R qr()$qr function:
reflectors[r: nrow(A), r] = w/t
# The Householder tranformation is:
I = diag(length(r:nrow(A)))
H.transf = I - 1/t * (w %*% t(w))
H_i = diag(nrow(A))
H_i[r:nrow(A),r:ncol(A)] = H.transf
# And we apply the Householder reflection - we left multiply the entire A or Q
A = H_i %*% A
Q = H_i %*% Q
}
DECOMPOSITION = list("Q"= t(Q), "R"= round(A,7),
"compact Q as in qr()$qr"=
((A*upper.tri(A,diag=T))+(reflectors*lower.tri(reflectors,diag=F))),
"reflectors" = reflectors,
"rho"=c(apply(reflectors[,1:(ncol(reflectors)- 1)], 2,
function(x) sum(x^2) / 2), A[nrow(A),ncol(A)]))
return(DECOMPOSITION)
}
आइए ouput की तुलना आर-निर्मित कार्यों से करें। पहले घर का बना समारोह:
(H = House(X))
$Q
[,1] [,2] [,3] [,4]
[1,] -0.29329367 -0.73996967 0.5382474 0.2769719
[2,] 0.14829152 -0.65124800 -0.5656093 -0.4837063
[3,] -0.93923665 0.13835611 -0.1947321 -0.2465187
[4,] -0.09911084 -0.09580458 -0.5936794 0.7928072
$R
[,1] [,2] [,3] [,4]
[1,] -1.890006 -1.4517318 1.2524151 0.5562856
[2,] 0.000000 -0.9686105 -0.6449056 2.1735456
[3,] 0.000000 0.0000000 -0.8829916 0.5180361
[4,] 0.000000 0.0000000 0.0000000 0.4754876
$`compact Q as in qr()$qr`
[,1] [,2] [,3] [,4]
[1,] -1.89000649 -1.45173183 1.2524151 0.5562856
[2,] -0.14829152 -0.96861050 -0.6449056 2.1735456
[3,] 0.93923665 -0.67574886 -0.8829916 0.5180361
[4,] 0.09911084 0.03909742 0.6235799 0.4754876
$reflectors
[,1] [,2] [,3] [,4]
[1,] 1.29329367 0.00000000 0.0000000 0
[2,] -0.14829152 1.73609434 0.0000000 0
[3,] 0.93923665 -0.67574886 1.7817597 0
[4,] 0.09911084 0.03909742 0.6235799 0
$rho
[1] 1.2932937 1.7360943 1.7817597 0.4754876
आर कार्यों के लिए:
qr.Q(qr(X))
[,1] [,2] [,3] [,4]
[1,] -0.29329367 -0.73996967 0.5382474 0.2769719
[2,] 0.14829152 -0.65124800 -0.5656093 -0.4837063
[3,] -0.93923665 0.13835611 -0.1947321 -0.2465187
[4,] -0.09911084 -0.09580458 -0.5936794 0.7928072
qr.R(qr(X))
[,1] [,2] [,3] [,4]
[1,] -1.890006 -1.4517318 1.2524151 0.5562856
[2,] 0.000000 -0.9686105 -0.6449056 2.1735456
[3,] 0.000000 0.0000000 -0.8829916 0.5180361
[4,] 0.000000 0.0000000 0.0000000 0.4754876
$qr
[,1] [,2] [,3] [,4]
[1,] -1.89000649 -1.45173183 1.2524151 0.5562856
[2,] -0.14829152 -0.96861050 -0.6449056 2.1735456
[3,] 0.93923665 -0.67574886 -0.8829916 0.5180361
[4,] 0.09911084 0.03909742 0.6235799 0.4754876
$qraux
[1] 1.2932937 1.7360943 1.7817597 0.4754876
qr.qy()
केqr.Q(qr(X))
बाद की मैन्युअल गणनाओं से सहमत हैंQ%*%z
। मुझे वास्तव में आश्चर्य होता है कि क्या मैं आपके प्रश्न का उत्तर दोहराए बिना कुछ अलग कह सकता हूं। मैं वास्तव में एक बुरा काम नहीं करना चाहता ... मैंने आपके लिए बहुत सम्मान करने के लिए आपके पोस्ट पढ़े हैं ... अगर मुझे कोड के बिना अवधारणा को व्यक्त करने का एक तरीका मिल जाए, तो बस वैचारिक रूप से रैखिक बीजगणित के माध्यम से, मैं इसमें वापस आता हूँ। हालांकि, मुझे खुशी है कि आपने कुछ मूल्य के मुद्दे की मेरी खोज की। शुभकामनाएं, टोनी।