참고 : 내 웹 사이트 에이 답변의 확장 버전을 게시했습니다 .
실제 R 엔진이 노출 된 상태에서 비슷한 답변을 게시 하시겠습니까?
확실한! 토끼 구멍 아래로 내려갑니다.
첫 번째 계층은 lm
R 프로그래머에게 노출되는 인터페이스입니다. lm
R 콘솔에서 입력하면 소스를 볼 수 있습니다 . 대부분의 프로덕션 레벨 코드와 같은 대부분은 입력 확인, 객체 속성 설정 및 오류 발생으로 바쁩니다. 하지만이 줄은 튀어 나와
lm.fit(x, y, offset = offset, singular.ok = singular.ok,
...)
lm.fit
또 다른 R 함수입니다. 직접 호출 할 수 있습니다. lm
수식 및 데이터 프레임과 편리하게 작동 하지만 lm.fit
행렬을 원하므로 한 수준의 추상화가 제거됩니다. 소스를 확인하고 lm.fit
더 바쁘고 다음과 같은 흥미로운 라인을 확인하십시오.
z <- .Call(C_Cdqrls, x, y, tol, FALSE)
이제 우리는 어딘가로 가고 있습니다. .Call
R의 C 코드 호출 방식입니다. R 소스에 C_Cdqrls라는 C 함수가 있으며이를 찾아야합니다. 여기 있습니다 .
C 함수를 다시 살펴보면 대부분 범위 검사, 오류 정리 및 작업량이 많은 것을 알 수 있습니다. 하지만이 줄은 다릅니다
F77_CALL(dqrls)(REAL(qr), &n, &p, REAL(y), &ny, &rtol,
REAL(coefficients), REAL(residuals), REAL(effects),
&rank, INTEGER(pivot), REAL(qraux), work);
이제 우리는 제 3 언어에 있습니다. R은 포트란을 호출하는 C를 호출했습니다. 포트란 코드는 다음과 같습니다 .
첫 번째 의견은 모든 것을 말해줍니다
c dqrfit is a subroutine to compute least squares solutions
c to the system
c
c (1) x * b = y
(재미있게,이 루틴의 이름이 어느 시점에서 변경된 것처럼 보이지만 누군가 주석을 업데이트하는 것을 잊어 버렸습니다). 그래서 우리는 선형 대수를 할 수있는 지점에 도달했고 실제로 방정식 시스템을 풀었습니다. 이것은 포트란이 정말 잘하는 종류입니다. 왜 우리가 여기에 도달하기 위해 많은 층을 통과했는지 설명합니다.
주석은 또한 코드가 수행 할 작업을 설명합니다.
c on return
c
c x contains the output array from dqrdc2.
c namely the qr decomposition of x stored in
c compact form.
따라서 포트란은 분해 를 찾아 시스템을 해결하려고합니다 .Q R
가장 먼저 발생하는 일은
call dqrdc2(x,n,n,p,tol,k,qraux,jpvt,work)
dqrdc2
입력 행렬 에서 포트란 함수 를 호출합니다 x
. 이게 뭐야?
c dqrfit uses the linpack routines dqrdc and dqrsl.
그래서 우리는 마침내 linpack 으로 만들었습니다 . Linpack은 70 년대부터 사용 된 포트란 선형 대수 라이브러리입니다. 가장 심각한 선형 대수학은 결국에는 압축을 풀 수있는 방법을 찾습니다. 우리의 경우 dqrdc2 함수를 사용하고 있습니다
c dqrdc2 uses householder transformations to compute the qr
c factorization of an n by p matrix x.
실제 작업이 이루어지는 곳입니다. 이 코드가 무엇을하고 있는지 알아내는 데 하루 종일 좋은 시간이 걸릴 것입니다. 그러나 일반적으로 우리는 행렬 가지고 그것을 곱 X = Q R 로 인수 분해하려고합니다. 여기서 Q 는 직교 행렬이고 R 은 상위 삼각 행렬입니다. Q 와 R이 있으면 회귀에 대한 선형 방정식을 풀 수 있기 때문에 이것은 현명한 일입니다.XX=QRQRQR
XtXβ=XtY
아주 쉽게. 과연
XtX=RtQtQ R =Rt아르 자형
그래서 전체 시스템은
R티아르 자형β=R티Q티와이
그러나 은 상부 삼각형이고 X t X 와 같은 순위를 갖습니다 . 따라서 우리의 문제가 잘 제기되는 한, 그것은 전체 순위이며, 우리는 축소 된 시스템을 해결할 수도 있습니다.아르 자형엑스티엑스
아르 자형β=Q티와이
그러나 여기 멋진 것이 있습니다. 은 상부 삼각이므로, 여기서 마지막 선형 방정식은 단지 이므로, β n을 푸는 것은 사소한 것입니다. 그런 다음 행을 하나씩 위로 올라가서 이미 알고 있는 β를 대치 할 때마다 간단한 단일 변수 선형 방정식을 얻을 수 있습니다. 따라서 Q 와 R 이 있으면 모든 것이 거꾸로 치환으로 붕괴됩니다 . 명시적인 작은 예제가 완전히 해결 된 여기 에서 더 자세히 읽을 수 있습니다 .아르 자형constant * beta_n = constant
β엔β큐아르 자형