기본 콘텐츠로 건너뛰기

11월, 2018의 게시물 표시

통계관련 함수와 메서드 사전

A B C d E F G H I K L M N O P Q R S T U V W Z A statsmodels.ap.stats.anova_lm(x) statsmodels.formula.api.ols 에 의해 생성되는 모형 즉, 클래스 인스턴스(x)를 인수로 받아 anova를 실행합니다. np.argsort(x, axis=-1, kind=None) 객체 x를 정렬할 경우 각 값에 대응하는 인덱스를 반환합니다. Axis는 기준 축을 지정하기 위한 매개변수로서 정렬의 방향을 조정할 수 있음(-1은 기본값으로 마지막 축) pandas.Series.autocorr(lag=1) lag에 전달한 지연수에 따른 값들 사이의 자기상관을 계산 B scipy.stats.bernoulli(x, p) 베르누이분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 p: 단일 시행에서의 확률 scipy.stats.binom(x, n, p) 이항분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 n: 총 시행횟수 p: 단일 시행에서의 확률 C scipy.stats.chi2.pdf(x, df, loc=0, scale=1) 카이제곱분포의 확률밀도함수를 계산 $$f(x, k) =\frac{1}{2^{\frac{k}{2}−1}Γ(\frac{k}{2})}x^{k−1}\exp\left(−\frac{x^2}{2}\right)$$ x: 확률변수 df: 자유도 pd.concat(objs, axis=0, join=’outer’, …) 두 개이상의 객체를 결합한 새로운 객체를 반환. objs: Series, DataFrame 객체. Axis=0은 행단위 즉, 열 방향으로 결합, Axis=1은 열단위 즉, 행 방향으

행렬형태의 평균, 분산 그리고 공분산

평균과 공분산  관측값의 샘플을 $p \times N$ 차원의 행렬로 고려합니다. $\left[\begin{array}{rrrr}X_1 & X_2 & \cdots & X_N \end{array}\right]$ X: 열벡터 이 샘플 평균(sample mean, M)은 $M=\frac{1}{M}(X_1+X_2+\cdots+X_N)$ 평균은 모든 관찰값들의 중간(center)를 나타냅니다. 각 값들에 대한 평균과의 차이를 다음과 같이 나타냅니다. $\hat{X}_k = X_k-M \qquad k=1, \cdots, N$ 위 식은 결과적으로 평균을 0로 하기 위해 모든 관찰값들을 평균 만큼 이동시킨 것으로 관찰값들과 동일한 차원의 행렬 B로 생성됩니다. 이 행렬은 평균-편차 형태(mean-deviation form)이라고 합니다. $B=\left[\begin{array}{rrrr}X_1 & X_2 & \cdots & X_N \end{array}\right]$ 정방행렬이 아닌 행렬은 그 행렬의 전치행렬과의 곱으로 생성할 수 있으며 이것은 이차형태 를 나타내는 기본 구조입니다. 이것을 적용하여 샘플 공분산 행렬(sample covariance matrix)는 다음과 같이 $p \times p$ 행렬 S로 정의 됩니다. $S=\frac{1}{N-1} BB^T$ 위 식에서 $BB^T$는 0을 포함하여 항상 양수이므로 semidefinite 이므로 S 역시 semidefinite입니다. >>> import numpy as np >>> import numpy.linalg as LA >>> import pandas as pd >>> from sympy import * >>> np.set_printoptions(precision=4, suppress=True) 1. 다음행렬의 평균과 공분산 행렬? $X_1=\left[\b

가역행렬에 대한 정의

가역행렬의 정의 n × n 차원의 정방행렬 A가 가역행렬(invertible matrix)일 경우 다음은 모두 동치입니다. 1. A의 행렬식은 0이 아닙니다. (det A ≠ 0) numpy.linalg.det() 함수에 의해 계산됩니다. import numpy as np import numpy.linalg as la import sympy as sp A=np.array([[2,3],[6, 8]]); A array([[2, 3], [6, 8]]) round(la.det(A), 4) -2.0 2. 역행렬이 존재합니다. numpy.linalg.inv() 함수에 의해 계산됩니다. Ainv=la.inv(A); Ainv array([[-4. , 1.5], [ 3. , -1. ]]) np.dot(A, Ainv) array([[1., 0.], [0., 1.]]) 3. 가역행렬 A의 전치행렬 A T 역시 가역행렬입니다. 이 두행렬의 행렬식은 같습니다. det(A) = det(A T ) AT=A.T; AT array([[2, 6], [3, 8]]) la.inv(AT) array([[-4. , 3. ], [ 1.5, -1. ]]) round(la.det(AT), 4)==round(la.det(A), 4) True round(la.det(AT), 4) -2.0 4. 행렬방정식 Ax=c에 대해 유일한 해를 가집니다. 식의 해를 계산하기 위해 numpy.linalg.solve() 함수를 적용합니다. 식의 c즉 상수항이 다음 코드의 const라면 A가 가역행렬이므로 변수 x의 해를 계산할 수 있습니다. const=np.array([2,1]).reshape(2,1);const array([[2], [1]]) sol=la.solve(A, const); s

특이값 분해

특이값 분해란? 특이값 특이값 분해 특이값분해(Singular Value Decomposition) 특이값 분해란? 고유 분해 , 스펙트럴 분해 등은 가역적인 정방 행렬 을 대상으로 합니다. 이에 반해 특이값을 이용하는 특이값 분해 (Singular Value Decomposition)는 비정방 행렬 을 정방행렬로 변형하여 분해할 수 있는 방법으로 선형 대수의 계산에서 가장 유용하게 사용되고 있습니다. 비정방행렬은 행렬에 그 행렬의 전치행렬과의 행렬곱으로 정방행렬로 만들 수 있습니다. import numpy as np import numpy.linalg as la import sympy as sp x=np.random.randint(0, 11, (3, 4));x array([[6, 5, 1, 1], [0, 5, 8, 2], [1, 9, 7, 4]]) xx=np.dot(x.T, x); xx array([[ 37, 39, 13, 10], [ 39, 131, 108, 51], [ 13, 108, 114, 45], [ 10, 51, 45, 21]]) 위 결과와 같이 전치행렬과의 행렬곱으로 생성한 정방행렬은 대칭행렬이 됩니다. 이 대칭행렬의 고유행렬은 다음과 같이 전치행렬과 역행렬이 같으므로 정규직교행렬 이 됩니다. 이 결과는 정방행렬이면서 대칭행렬 이므로 행렬의 대각화에 기반을 둔 분해(decomposition)가 가능합니다. 최종적으로 x T x 분해 결과로 부터 x의 분해를 달성할 수 있습니다. d, p=la.eig(xx) np.around(p.T, 6)==np.around(la.inv(p), 6) array([[ True, True, True, True], [ True, True, True, True], [ True, True

원자(Atom) 모형

우리 주변에 존재하는 다양한 물질들은 무엇으로 구성되어 있을까요? 그리고 한 물질이 다른 물질과 다른 이유는 무엇일까요? 이를 이해하기 위해서는 물질을 형성하는 단위 블럭 즉, 원자를 면밀히 관찰해야합니다. 원자는 우주의 모든 구조와 유기체를 형성하는 기본입니다. 행성, 태양, 풀과 나무, 우리가 숨 쉬는 공기, 사람들은 모두 원자의 다른 조합으로 구성됩니다. 원자모형  원자(atom)은 그리스어로 "더이상 분해되지 않은 (indivisble)"의 의미로서 그리스 철학자 Democritus(BC 5세기)에 의해 최초로 창안되었습니다. 현재는 원자가 양전하인 핵을 중심으로 음전하인 전자들에 의해 둘러쌓인 구조라고 알려져 있습니다. 현재의 이러한 원자의 구성이 밝혀지기 전까지는 원자에 대한 다른 모형이 존재해 왔습니다. (전하(electric charge)전기현상을 일으키는 주체적인 원인으로, 어떤물질이 갖고 있는 전기의 양 전자(electron): 음전하를 띠고 있는 기본입자 전기(electricity): 전하를 가지는 물질의 존재 및 흐름에 관계된 모든 물리현상) 정의: 모형(Model) 실제 환경에서 어떤 시스템을 표현합니다. 모형은 시스템들과 그들의 특성을 이해하는데 도움을 줍니다. 예를들어 원자 모형은 우리가 알고있는 원자의 특성들을 기반으로 그 구조를 나타냅니다. 현재 우리가 가지고 있는 지식을 기반을 하기 때문에 원자의 실제의 완전한 모습을 나타낸다고 할 수는 없습니다. 1. Plum pudding model J.J. Thomson (1897)에 전자(electron)를 발견한 후에 사람들은 원자가 이전에 생각해온 것 보다 더 작은 입자들로 구성되어있다는 것을 알게 되었습니다. 그러나 원자핵은 아직 발견되지 않았지요. 그런 상태에서 원자모형으로 plum pudding model(1904)이 창안되었습니다. 이 모형은 다음그림과 같이 양전하(positive charge)의 수프에 음전자(negative elec

윈도우 엣지 글꼴 변경

윈도우 엣지의 글꼴은 레지스트리 편집기를 사용하여 변경합니다.  1. window + r을 실행창을 열고 regedit를 작성하여 레지스트리 편집기를 실행합니다.  2. 레지스트리 편집기에서 다음의 경로에서 기본값을 활성 후에 원하는 값 글꼴 프로그램을 입력합니다.  " 컴퓨터\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"

About Aanaconda

1. 삭제방법 파이썬 아나콘다 사용시 삭제할 필요가 있습니다. 윈도우의 경우 제어판의 프로그램 추가/삭제에서 이 명령을 시행할 수 없기 때문에 설치한 디렉토리로 이동하여 uninstall.exe를 직접 시행하여야 합니다. 일반적으로 이 프로그램은 다음 경로에 존재합니다. "C://사용자/컴퓨터 이름/ Anaconda3/ " : just me 버전으로 설치할 경우의 경로 "C://ProgramData/Anaconda3/": all user 버전으로 설치할 경우의 경로. ProgramData 디렉토리는 숨김폴더 이므로 메뉴에서 보기-숨김항목 표시를 체크 한후 찾을 수 있습니다. 이 디렉토리내에 존재하는 Uninstall_Anaconda3.exe를 실행하여 삭제합니다. 2. spyder upgrade 윈도의 CMD에서 우분투의 터미널에서 다음을 실행 합니다. conda install -c anaconda spyder in unbuntu conda update conda conda update anaconda conda update spyder 3. 우분투에서 anaconda 설치 1) anaconda 홈에서 적합한 설치파일을 다운 2) 터미널에서 anaconda를 다운 받은 디렉토리로 진입 cd home/---/문서 3) 설치 # sha256sum Anaconda3-5.3.1-Linux-x86_64.sh 위 명령은 다운로드 받은 파일의 해시태그를 나타냅니다. 결과인 해시태그가 맞는지 아래의 사이트로 이동하여 확인합니다. http://docs.anaconda.com/anaconda/insstall/hashes/lin-3-64 맞으면 다음과 같이설치합니다. #bash  Anaconda3-5.3.1-Linux-x86_64.sh 4. Jupyter notebook browser 설정 .jupter 폴더 내에 존재하는 jupyter_notebook_config.py 이동 이

turtle로 정오각형 그리기

정오각형 그리기  오각형을 그리는 것 역시 정사각형 , 정삼각형 을 그리는 것과 유사한 과정을 거칩니다. 단지 각 꼭지점의 각도만이 다르지요. 그러면 정오각형의 각 모서리의 각도는 어떻게 될까요? 이를 생각하기에 앞서 각 도형의 내각을 먼저 생각해보죠. 우리는 삼각형의 내각의 합을 알고 있습니다. 이를 이용하면 각 도형에서 삼각형이 몇개가 존재하는지를 알아보고 "삼각형의 갯수×180"로 그 도형의 내각의 합을 구할 수 있을 것입니다. 다음 그림을 볼까요? 위 그림의 사각형은 1개의 대각선으로 2개의 삼각형으로 구성됩니다. 오각형의 경우 2개의 대각선으로 3개의 삼각형으로 구성됩니다. 즉, 다음의 관계를 보이지요. 사각형의 내각 : 삼각형 2개 2×180=360 한각의 값  360/4=90 오각형의 내각 : 삼각형 3개 3×180=540 한각의 값  540/5=108 육각형의 내각 : 삼각형 4개 4×180=720 한각의 값  720/6=120 ... 위 그림에서 내각과 외각의 관계를 보면 위 그림의 검은색은 각 모서리의 내각이고 빨간색은 외각을 나타냅니다. 외각은 내각을 이루는 하나의 선을 연장했을 경우 상대되는 각도이라고 했습니다. 그러므로 오각형의 경우 내각 108도에 대한 외각은 72도입니다. 특이할 사항은 사각형이나 오각형이나 외각의 합은 360입니다. 즉, 모든 도형의 외각의 합은 360도입니다. (삼각형의 외각의 합을 구해보세요.) 그러므로 모든 정다각형에서 하나의 외각은 다음과 같이 계산될 수 있겠지요. 360/변수의 수=다각형에서 하나의 외각 위에서 회전을 할 경우 내각이 아닌 외각을 사용해야 함을 알았습니다. 그러므로 오각형을 그리는 계획은 다음과 같이 작성할 수 있겠죠. 1) 지정한 길이만큼 앞으로 이동합니다. 2) 오른쪽 또는 왼쪽으로 72도를 회전합니다. 3) 앞으로 동일한 길이만큼 이동합니다. 4) 오른쪽 또는 왼쪽으로 72도 만큼 이동합니다. 5)1번부터 4번 두변을 그리는 명

turtle로 정삼각형 그리기

정삼각형 그리기  turtle로 그림 그리기준비 참조 정삼각형은 세변의 길이와 세 각이 모두 같은 삼각형이지요. 그러므로 다음과 같이 실행하면 되겠지요. 1) 일정 길이 만큼 앞으로 이동 2) 오른쪽(또는 왼쪽)으로 60도 회전 3) 위 1)과 2)의 과정을 3번 반복 >> for i in range(3): ...:     t.fd(100) ...:     t.left(60) 위의 결과는 예상하는 것과는 다르지요. 왜 그럴까요? 처음 시각후 회전하는 각도가 우리가 예산한 것과는 다르기 때문이지요. 분명히 왼쪽으로 60도 회전인데 결과는 이보다 훨씬 큰 각도로 회전하였습니다. 다음 그림을 봅시다. 위의 정삼각형의 내각은 각각 60도이죠. 내각의 각각의 선을 연장하면 각 내각의 반대각은 120도(=180-60)입니다. 위 그림의 빨간색으로 나타낸 것으로 이것을 각 내각에 대응하는 외각이라고 합니다. 삼각형의 내각의 합은 180도 인데 반해 외각의 합은 360도이지요. 사실 터틀을 사용해 그림을 그릴때 회전은 내각을 기준으로 하지요. 예를들어 left(60)인 경우 터틀의 회전각도는 왼쪽으로 60도이므로 실제로 그려지는 것은 120도 회전된 선이 그려지는 것입니다. 그러므로 다음을 기억해야 합니다. left(), right()에 전달하는 각도는 내각이 아니라 외각입니다. 삼각형을 그리기위해서는 위의 코드는 다음과 같이 변경되어야 합니다. >> for i in range(3): ...:     t.fd(100) ...:     t.left(180-60) 정삼각형을 그리는 함수를 작성해 보죠. 위 코드에서 정삼각형의 길이만이 변할 수 있는 수이지요. 그러므로 아래 함수에서 인수는 길이입니다. def EquitriangleS(t, length):     for i in range(3):         t.fd(length)         t.left(180-60) >>> Equit

turtle로 정사각형 그리기

정사각형 그리기   turtle로 그림 그리기준비 사각형의 각 꼭지점의 각이 90도라는 것을 사용하여 다음 순서로 그립니다.  1) 시작점에서 앞으로 이동 2) 1)의 끝점에서 펜을 오른쪽으로 90도 회전 3) 다시 앞으로 이동 4) 3)의 끝점에서 펜을 오른쪽으로 90도 회전 위의 과정은 모서리 한개를 기준으로 양쪽의 선을 만든것으로 “ㄱ”와 같은 모양입니다. 사각형이 완성이 되기 위해서는 위의 과정을 한번더 반복해야 겠지요. >>> t=Turtle() >>> t.fd(100) >>> t.right(90) >>> t.fd(100) >>> t.right(90) >>> t.fd(100) >>> t.right(90) >>> t.fd(100) >>> t.right(90) >>> t.hideturtle() 위 코드는 같은 명령이 반복되지요. 즉, 앞으로 이동하고 터틀을 90도 회전하는 명령이 4번 반복합니다. 번거롭지요. 동일한 명령을 여러번 반복하는 것은 컴퓨터가 매우 빠르고 정확하게 처리할 수 있는 일들 중의 하나입니다. 그러나 컴퓨터에 그러한 명령을 전달하기 위해서는 컴퓨터가 인식할 수 있게 전달해야 하지요. 뭐 특별한 방법이 아니라 일정한 형식을 맞추기 만하면 됩니다. 이러한 형식을 반복문 (looping)이라고 해요. 또는 회돌이라는 용어로 언급되기도 하죠.  반복문의 형식은 몇가지가 있는데 우선은 위 코드에 적합한 for 문에 대해 살펴보지요. 위 코드를 for 문으로 작성해 보면 다음과 같습니다. for i in range(4): #(1)     t.fd(100) #(2)     t.right(90) #(3) 코드를 작성할 경우 각 명령에 설명을 적을 경우 '#' 기호를 사용합니다. 일반적으로 이 기호 뒤에 첨부되는 설명을 주

turtle로 그림그리기 준비

 도화지와 펜 만들기 그림을 그릴 때 펜 또는 붓, 도화지가 그리고 물감등이 반드시 필요하지요. turtle을 사용하여 그림을 그리는 경우도 같습니다. 다음 코드를 볼까요? >>> from turtle import Turtle >>> t=Turtle() 처음 코드에 의해 turtle의 Turtle 클래스의 사용을 알립니다. 두번째 코드로 그림을 그리기 위한 도화지(캔버스)를 생성하죠. 위 코드에서는 도화지의 이름을 t라고 하였습니다. 위의 코드로 다음과 같은 결과가 나타나지요. 위 결과는 turtle로 그림을 그리위한 도화지와 가운데 검은 물체가 펜입니다. 이 펜을 “터틀”이라고 합니다.  우리가 그림을 그릴 때 손 동작이 어떠한 규칙없이 사용하는 것 같지만 자세히 관찰해 보면 직선과 직선의 방향을 변경하여 어떠한 모양을 그리는 것을 알 수 있습니다. 터틀 역시 마찬가지로 직선 즉, 터틀을 방향변경없이 앞으로 이동하는 것과 방향을 변경하는 것으로 구성되지요. 다음을 볼까요. >>> t.fd(100) >>> t.right(90) >>> t.fd(100) 위 코드는 다음과 같습니다. 1) 앞으로 100만큼 이동 2) 90도 회전 3) 앞으로 100만큼 이동 이 코드의 결과는 다음 그림과 같죠. 1번 그림은 단순히 처음 어떤 점으로 부터 100만큼 이동한 것이고 2번 그림에서 터틀(펜)의 방향이 오른쪽으로 90도 회전한 것을 나타냅니다. 이 상태에서 앞으로 100만큼 이동하면 1번 선과 90도 각도로 회전한 것이 되지요. 위의 코드를 좀 자세히 살펴볼까요? forward(거리) 또는 fd(거리): 지정된 거리 만큼 앞으로 이동하기 위해 사용하는 함수(메소드)입니다. 함수란 미리 작성해 명령을 실행하는 변환기 입니다. 필요한 부분을 어떤 함수에 전달하면 그 함수는 미리 약속된 명령을 실행하여 결과를 내놓지요. 위에서 “앞으로

이차형태(Quadratic forms)

행렬에서 각 값을 제곱하는 형태는 전치행렬과의 행렬곱으로 이루어집니다. $X^TX$ 위 식으로 부터의 값들의 합과 일반적인 형태는 공학, 통계학, 경제학, 미분기하학등에서 많이 사용되는 것으로 이차 형태(Quadratic forms)라고 합니다. $R^n$차원에서 이차형태는 함수 Q로 정의되며 벡터 x에 대해 다음과 같이 표현됩니다. $Q(x)=x^TAx$ A : 이차형태의 행렬로서 $n \times n $차원의 대칭행렬 가장 간단한 이차형태는 $Q(x)=x^TIx=||x||^2$입니다. >>> import numpy as np >>> import numpy.linalg as LA >>> import pandas as pd >>> from sympy import * >>> np.set_printoptions(precision=4, suppress=True) 1. 벡터 x의 Q(x)? $x=\left[\begin{array}{r}x_1 \\x_2 \end{array}\right]$ >>>x1, x2=symbols("x1, x2") >>> x=Matrix(2,1, [x1, x2]); x Matrix([ [x1], [x2]]) 1) >>> A=Matrix([[4,0],[0, 3]]); A Matrix([ [4, 0], [0, 3]]) >>> QA=x.T*A*x; QA Matrix([[4*x1**2 + 3*x2**2]]) 2) >>> B=Matrix([[3,-2],[-2,7]]); B Matrix([ [ 3, -2], [-2,  7]]) >>> QB=x.T*B*x; QB Matrix([[x1*(3*x1 - 2*x2) + x2*(-2*x1 + 7*x2)]]) >>> expand(QB) Matrix([

대칭행렬의 대각화와 스펙트럴 분해

대칭행렬의 대각화  대칭행렬은 다음의 관계가 성립합니다. $A^T =A$ 대칭행렬은 정방행렬이어야 하며 대각원소를 중심으로 위와 아래의 원소값이 같습니다. $\left[\begin{array}{rr}1&0\\0&-3\end{array}\right], \; \left[\begin{array}{rrr}0&-1&0\\-1&5&8\\0&8&-7\end{array}\right]$ 이러한 대칭행렬 역시 고유값을 사용하여 대각화를 적용하여 유사변환 형태로 분해할 수 있습니다.( 유사변환과 대각화 참조) >>> import numpy as np >>> import numpy.linalg as LA >>> from sympy import * >>> np.set_printoptions(precision=4) 1. 행렬 A의 대각화? >>> A=np.array([[6,-2,-1],[-2,6,-1],[-1,-1,5]]);A array([[ 6, -2, -1],        [-2,  6, -1],        [-1, -1,  5]]) $A=PDP^{-1}$ >>> d1,p=LA.eig(A) >>> d1 array([ 3.,  8.,  6.]) >>> p array([[ 0.5774,  0.7071, -0.4082],        [ 0.5774, -0.7071, -0.4082],        [ 0.5774, -0.    ,  0.8165]]) >>> d=np.eye(3) >>> >>> for i in range(len(d)): ...       d[i,i]=d1[i] ... >>> d array([[ 3.,  0.,  0.],        [ 0.,  8.,  0.],  

최소제곱법의 응용

y=f(x)를 따르는 데이터에 대해 생각해 봅니다. $(x_1, y_2),\, (x_2, y_2), \, \cdot, \, (x_n, y_n)$ 위 데이터의 패턴을 찾는 것은 f(x)의 함수를 찾는 것과 같습니다. 이러한 함수를 수학적 모형이라 합니다. 이러한 함수의 몇가지 예를 나타내면 다음과 같습니다. 1) 직선: y=ax+b 2) 2차 다항식: y=a+bx+cx 2 3) 3차 다항식: y=a+bx+cx 2 +dx 3  실험적으로 획득한 데이터들에 대해 가장 간단한 모형인 직선을 고려해 봅니다. 실험 데이터 $(x_1, y_1), (x_2, y_2), \cdots , (x_n, y_n)$ 이 데이터들의 패턴으로 직선을 고려한다면 각 점들에 대해 다음과 같이 나타낼 수 있습니다. $a+bx_1=\hat{y_1}, a+bx_2=\hat{y_2}, \cdots, a+bx_n=\hat{y_n}$ 위 식에서 각 식의 결과들을 y가 아닌 $\hat{y}$로 나타낸 것은 실험 결과에 의한 자료가 이론적으로 생성한 모형과 완전히 일치하는 경우가 거의 불가능하기 때문입니다. 위 식을 행렬의 선형시스템의 형식으로 정리하여 보면 다음과 같습니다. $\left[\begin{array}{rr}1&x_1\\1&x_2\\\vdots&\vdots\\1&x_n\end{array}\right]\left[\begin{array}{r}a\\b\end{array}\right]=\left[\begin{array}{r}y_1\\y_2\\\vdots\\y_n\end{array}\right] \rightarrow Mv=y$ 만약 위의 식을 Mv=$\hat{y}$로 나타냈다면 이 식은 유일한 해를 가지며 선형독립이 될 것입니다. 이것은 M을 구성하는 각 열벡터들은 $\hat{y}$에 대한 직교기저 가 됩니다. 그러나 계산의 대상은 실제 값 y이므로 M의 열벡터들은 직교기저가 아닙니다. 즉, y와 $\hat{y}$ 사이에 오차가 존재하므로 정확한

최소제곱해(Least Square solution)

행렬방정식 Ax=b의 해가 없는 모순 시스템(inconsistent system)에서 이 식에 가장 적합한 근사해를 찾는 방법으로 최소자승방법을 사용합니다. 이 식을 만족하는 해는 없습니다. 이 상태에서 가장 적합한 근사해는 Ax와 b와의 거리가 가장 작은 경우를 생각할 수 있습니다. 즉, ||b-Ax|| ≈0 $m \times n$ 차원의 행렬 A와 b가 $R^m$에 존재한다면 Ax=b의 최소자승해(least-square solution)은 다음 식을 만족하는 $\hat{x}$가 됩니다. 이식의 해공간의 차원은 n이므로 $R^n$ 공간에 존재합니다. $||b-A \hat{x}|| \leq ||b-Ax||$ 이 최소해를 찾는 과정에서 가장 중요한 점은 x는 A의 열공간(Col A)내에 존재하는 모든 값이 된다는 것입니다. 위 그림에서 Ax가 d의 직교 투영이 아니라는 것은 A의 열벡터들이 b에 대한 직교기저 집합이 아니라는 의미입니다. 이 경우 b와 공간 Col A와 가장 가까운 점은 b의 직교 투영인 지점이 됩니다.( 직교투영 참조) $A \hat{x}=\hat{b}$라고 하면 $\hat{b}=b_{proj, Col\,A}$라고 할 수 있습니다. $\hat{b}$는 Col A 공간내에 존재하기 때문에 다음 식은 모순되지 않은 시스템(consistent system)이 됩니다.  $$A \hat{x}=\hat{b}$$ $\hat{b}$가 Col A에 가장 가까운 점이므로 Ax=b의 최소자승해가 됩니다. 그러므로 다음 식이 성립합니다.  $b =\hat{b}+ b-A \hat{x}$ (다음 그림 참조) 위 그림과 같이 $b-A \hat{x}$ 역시 Col A와 직교입니다. 그러므로 Col A 공간에 존재하는 행렬 A와 $b-A \hat{x}$ 의 내적은 0이 됩니다. ( 내적과 직교성 에서 직교벡터 참조) $A \cdot (b-A \hat{x}) = 0 \Leftrightarrow A^T \cdot (b-A \