Bu konuyla ilgili önceki yazıma bir selam olarak , doğrusal cebirin ve ilgili R fonksiyonlarının arkasındaki fonksiyonların bazı belirsiz (eksik olsa da) keşfini paylaşmak istiyorum. Bunun devam eden bir çalışma olması gerekiyordu.
Fonksiyonların opaklığının bir kısmı, Hanehalkı ayrışmasının "kompakt" formu ile ilgilidir . Hanehalkı ayrışmasının ardındaki fikir, vektörleri aşağıdaki şemada olduğu gibi bir unit-vector tarafından belirlenen bir hiper düzlem boyunca yansıtmak , ancak bu düzlemi orijinal matrisin her sütun vektörünü yansıtmak için maksatlı bir şekilde üzerine standart birim vektörü. Normalize edilmiş norm-2 vektörüu A e 1 1 uQRuAe11u Farklı Hanehalkı dönüşümlerini I - 2 hesaplamak için kullanılabilir .I−2uuTx
Ortaya çıkan projeksiyon şu şekilde ifade edilebilir:
sign(xi=x1)×∥x∥⎡⎣⎢⎢⎢⎢⎢⎢⎢100⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥+⎡⎣⎢⎢⎢⎢⎢⎢⎢x1x2x3⋮xm⎤⎦⎥⎥⎥⎥⎥⎥⎥
vektörü , ayrıştırmak istediğimiz matrisindeki sütun vektörleri ile tarafından belirlenen "ayna" yansımasına karşılık gelen vektörleri arasındaki farkı temsil eder .vxAyu
LAPACK tarafından kullanılan yöntem, ilk girişin Hanehalkı reflektörlerinde 'e dönüştürülerek depolanması ihtiyacını ortadan kaldırır . Bunun yerine vektör normalleştirme için ile , bir dönüştürülür sadece yumruk giriştir ; yine de, bu yeni vektörler - onlara yine de yönlü vektörler olarak kullanılabilir.1vu∥u∥=11w
Yöntemin güzelliği, bir ayrışmasında üst üçgen olması nedeniyle, bu reflektörlerle doldurmak için çaprazın altındaki öğeden gerçekten faydalanabiliriz . Neyse ki, bu vektörlerdeki öncü girişlerin hepsi eşittir, bu da matrisin "tartışmalı" diyagonalinde bir problemi önler: hepsinin olduklarını bilmek, dahil edilmeleri gerekmez ve .RQR0Rw11R
Fonksiyondaki "kompakt QR" matrisi qr()$qr
kabaca " matrisinin ve" değiştirilmiş "reflektörler için alt üçgen" depolama "matrisinin eklenmesi olarak anlaşılabilir .R
Hanehalkı projeksiyonu hala biçiminde olacaktır, ancak ( ) ile değil, bir vektörle , bunlardan sadece ilk girişi olacak şekilde garantilidir veI−2uuTxu∥x∥=1w1
I−2uuTx=I−2w∥w∥wT∥w∥x=I−2wwT∥w∥2x(1) .
Bu reflektörleri , ilk girişi hariç olmak üzere diyagonal veya altında saklamanın ve bir gün olarak adlandırmanın iyi olacağını varsayabiliriz . Ancak işler hiç bu kadar kolay olmamıştı. Bunun yerine, diyagonalin altında depolanan , ile Hanehalkı dönüşümündeki katsayıların (1) olarak ifade edildiği şekilde,
şöyle tanımlanır:wR1qr()$qr
wtau
τ=wTw2=∥w∥2 , yansıtıcılar olarak ifade edilebilir . Bu "reflektör" vektörler, "compact " olarak adlandırılan altında saklananlardır .reflectors=w/τRQR
Şimdi vektörlerinden bir derece uzaktayız ve ilk giriş artık , Bu nedenle , "reflektör" vektörlerinin ilk girişini hariç tutmakta ısrar ettiğimiz için çıktılarını geri yüklemek için anahtarı içermesi gerekecek. herşeyi sığdır . Çıktıda değerlerini görüyor muyuz ? Hayır, bu tahmin edilebilir. Bunun yerine (bu anahtarın depolandığı yerde) .w1qr()
qr()$qr
τqr()$qraux
ρ=∑reflectors22=wTwτ2/2
Aşağıda kırmızıyla çerçevelenmiş olarak , ilk girişleri hariç "reflektörleri" ( ) görüyoruz .w/τ
Tüm kod burada , ancak bu cevap kodlama ve lineer cebirin kesişimi hakkında olduğundan, çıktıyı kolaylıkla yapıştıracağım:
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
Şimdi işlevi House()
şöyle yazdım :
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)
}
Çıkışı R yerleşik işlevleriyle karşılaştıralım. İlk olarak ev yapımı fonksiyon:
(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
R fonksiyonlarına:
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()
manuel hesaplamaları kabul ettiğimi doğruladıktan sonra sorunuza baktım . Sorunuzu çoğaltmadan cevaplamak için farklı bir şey söyleyebilir miyim gerçekten merak ediyorum. Gerçekten kötü bir iş yapmak istemiyorum ... Yazılarınızı size çok fazla saygı gösterecek kadar okudum ... Kavramı kod olmadan ifade etmenin bir yolunu bulursam, sadece kavramsal olarak cebir yoluyla, Ben ona geri döneceğim. Yine de, bir değer meselesini araştırdığımı bulduğunuz için mutluyum. En iyi dileklerimle, Toni.qr.Q(qr(X))
Q%*%z