このトピックに関する私の以前の投稿のセグエとして、線形代数と関連するR関数の背後にある関数の(不完全ではありますが)暫定的な探索について共有したいと思います。これは進行中の作業になるはずです。
関数の不透明性の一部は、Householder 分解の「コンパクト」形式に関係しています。ハウスホルダ分解の背後にある考え方は、単位ベクトルによって決定超平面を横切るベクトルに反映することであるU下の図のように、しかし、元の行列の各列ベクトル突出するように意図的な方法で、この平面を選ぶAを上にE 1標準単位ベクトル。正規化されたノルム-2 1ベクトルuを使用して、さまざまなハウスホルダー変換I − 2を計算できます。Q Rあなたあe11あなた。私− 2U UTバツ
結果の投影は次のように表すことができます
記号(x私= x1)× ∥ X ∥ ⎡⎣⎢⎢⎢⎢⎢⎢⎢100⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥+ ⎡⎣⎢⎢⎢⎢⎢⎢⎢バツ1バツ2バツ3⋮バツメートル⎤⎦⎥⎥⎥⎥⎥⎥⎥
ベクトルは、分解する行列の列ベクトルと、によって決定される部分空間または「ミラー」全体の反射に対応するベクトル間の差を表します。x A y uvバツあyあなた
LAPACKで使用される方法では、ハウスホルダーリフレクターの最初のエントリーを変換することで、ストレージの必要性を解放します。代わりに、ベクトル正規のすると、それが変換されるだけ拳エントリである。まだ、これらの新しいベクトル-それらをと呼んでも、方向ベクトルとして使用できます。V U ‖ U ‖ = 1 1 wの1vあなた∥ U ∥ = 11w
この方法の美しさは、その与えられたことをされた で分解が上三角で、我々は実際の利点を取ることができますの要素これらとでそれらを埋めるために、対角以下リフレクター。ありがたいことに、これらのベクトルの先頭のエントリはすべてに等しく、行列の「論争のある」対角線の問題を回避します。これらがすべてあることを知っていれば、含める必要はなく、のエントリの対角線を生成できます。。Q R 0 R w 1 1 RRQ R0Rw11R
関数内の「コンパクトQR」行列は、qr()$qr
大まかに行列と「変更された」リフレクターの下三角の「ストレージ」行列の追加として理解できます。R
世帯主の予測は、依然としてI - 2の形式が、我々はで作業することはできません U( ‖ X ‖ = 1)、むしろベクターと Wのみ最初のエントリがあるとguanteedされた、 1、及び私− 2U UTバツあなた∥ X ∥ = 1w1
私− 2U UTx = I − 2w∥ ワット∥wT∥ ワット∥x = I − 2wwT∥ ワット∥2バツ(1)
wR1qr()$qr
wタウ
τ= wTw2= ∥ W ∥2反射板= w / τRQ R
w1qr()
qr()$qr
τqr()$qraux
ρ = ∑ 反射板22= 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)
}
出力をR組み込み関数と比較してみましょう。まず自家製関数:
(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関数に:
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
私のポストに。重複することなくあなたの質問に答えるために私が何か別のことを言うことができるかどうか私は本当に不思議に思います。私は本当に悪い仕事をしたくありません...あなたの投稿をたくさん読んで、あなたに多くの敬意を払っています...コードなしで概念を表現する方法を見つけたら、概念的には線形代数を通して、戻ってきます。しかし、あなたが私の価値ある問題の探求を見つけてくれてうれしいです。トニ、よろしくお願いします。