이 주제에 대한 나의 이전 포스트 의 전언으로 , 선형 대수 뒤의 함수와 관련 R 함수에 대한 잠정적 인 탐구 (완전하지는 않지만)를 공유하고 싶습니다. 이 작업은 진행 중입니다.
함수의 불투명도의 일부는 가정용 인 분해 의 "소형"형태와 관련이 있습니다. 가계 분해의 기본 개념은 아래 다이어그램에서와 같이 단위 벡터 의해 결정된 초평면을 가로 질러 벡터를 반영 하지만, 원래의 행렬 의 모든 열 벡터를 투영하도록 목적에 따라이 평면을 선택 에 표준 단위 벡터를. 정규화 된 norm-2 벡터 는 다른 가계 변환 변환 를 계산하는 데 사용될 수 있습니다 .u A e 1 1 u I − 2QRuAe11uI−2uuTx
결과 투영은 다음과 같이 표현 될 수 있습니다
sign(xi=x1)×∥x∥⎡⎣⎢⎢⎢⎢⎢⎢⎢100⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥+⎡⎣⎢⎢⎢⎢⎢⎢⎢x1x2x3⋮xm⎤⎦⎥⎥⎥⎥⎥⎥⎥
벡터 는 우리가 분해하려는 행렬 의 열 벡터 와 의해 결정된 "공간"또는 "공간"에 대한 반사에 대응하는 벡터 사이의 차이를 나타냅니다 .vxAyu
LAPACK에서 사용하는 방법으로 돌려서 집주인 반사기의 첫 번째 항목의 저장을위한 필요성 해방 '들. 대신 벡터 정규화 에 와 , 그것으로 변환되기 바로 주먹 엔트리 인 ; 그러나 이러한 새로운 벡터는 라고 여전히 방향 벡터로 사용될 수 있습니다.1vu∥u∥=11w
이 방법의 장점은 분해 에서 이 상부 삼각형 이라는 것을 감안할 때 , 대각선 아래의 에서 요소 를 이용하여 이러한 반사기 로 채울 수 있다는 것입니다 . 다행히,이 벡터의 주요 항목 모두 동일 , 행렬의 "논쟁"대각선에서 문제를 방지 : 그들은 모든 것을 알고 가에 포함 할 필요가 없습니다, 그리고 항목에 대각선을 얻을 수 .RQR0Rw11R
함수의 "소형 QR"매트릭스 는 "수정 된"리플렉터 qr()$qr
에 대한 매트릭스 및 하부 삼각 "스토리지"매트릭스 의 대략적인 추가로 이해 될 수 있습니다 .R
가계 계획은 여전히 이지만 ( )와 함께 작동하지 않고 벡터와 함께 작동합니다 첫 번째 엔트리가되고있는 guanteed가되어야 , 및I−2uuTxu∥x∥=1w1
I−2uuTx=I−2w∥w∥wT∥w∥x=I−2wwT∥w∥2x(1) .
이 리플렉터를 대각선 또는 아래 에 의 첫 번째 항목을 제외하고 저장 하고 하루라고 부르는 것이 좋다고 가정합니다. 그러나 결코 쉬운 일이 아닙니다. 대신 대각선 아래에 저장되는 것은 와 (1)로 표현 된 가계 변환의 계수 의 조합으로 ,
를 다음과 같이 정의 .wR1qr()$qr
wtau
τ=wTw2=∥w∥2 이면 리플렉터는 로 표현 될 수 있습니다. . 이러한 "반사기"벡터는 소위 "compact " 에서 바로 아래에 저장된 것 입니다.reflectors=w/τRQR
이제 우리는 하나 명 정도의 거리에서없는 벡터, 첫 번째 항목은 더 이상 따라서의 출력, 우리는에 "반사"벡터의 첫 번째 항목을 제외한 주장 때문에 의지의 필요를 복원 키를 포함 에 모든 것을 맞습니다 . 출력에서 값을 볼 수 있습니까? 글쎄요, 그건 예측할 수 없습니다. 대신 (이 키가 저장된) 출력에서 .w1qr()
qr()$qr
τqr()$qraux
ρ=∑reflectors22=wTwτ2/2
아래 빨간색 프레임으로 , 첫 번째 항목을 제외한 "반사기"( )가 표시됩니다.w/τ
모든 코드는 here 이지만이 답변은 코딩과 선형 대수의 교차점에 관한 것이므로 출력을 쉽게 붙여 넣습니다.
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
내 게시물에. 중복없이 귀하의 질문에 대답하기 위해 다른 것을 말할 수 있는지 정말로 궁금합니다. 난 정말 나쁜 일을하고 싶지 않아 ... 난 당신을 존경 할만큼 충분히 글을 읽었 어 ... 개념적으로 선형 대수를 통해 다시 올게요 그러나 나는 당신이 어떤 가치의 문제에 대한 나의 탐구를 발견하게 된 것을 기쁘게 생각합니다. 소원, 토니