n벡터는 크기와 방향을 가진 물리량으로 다음과 같이 표현될 수 있다.
좌표계 없이 표현
v : 화살표로 표현
v의 크기 : 화살표의 길이 측정
v의 방향 : 화살표의 방향 측정
좌표계를 도입하여 표현
v : (v1, v2, ..., vn) 좌표계에 수선의 발
v의 크기 : 피타고라스정리로 계산
v의 방향 : 주어진 벡터를 길이로 나눔
두벡터 u와 v에 대한 내적inner product는 다음과 같이 정의된다.
두 벡터 u, v간의 내적이 0이면 두 벡터는 직교orthogonal이다.
두 벡터 u, a가 있을때, 벡터 u를 a 위에 투영한 벡터를 projau라 하고 다음과 같이 구한다.
벡터 u를 a위에 투영하고 남은 보완 벡터complement vector는 u-projau이다.
중요한 것은 u라는 벡터를 두개의 직교하는 벡터w1과 w2로 나눌 수 있다는 것이다.
u = w1 + w2이다.
u라는 벡터를 a상에 떨군다는 것은 수선의 발을 내린다는 것이다.
마지막 결과값은 스칼라값 * 벡터a로 해석할 수 있다. 그 말은 투영은 a벡터를 스케일한 것으로 볼 수 있다.
행렬은 좌표계라는 의미를 저번강의에서 배웠다. 행렬은 각 열벡터가 기저basis를 이루는 좌표계이다.(직교하는 두 벡터의 내적값은 0이다.)
직교행렬orthogonal matrix
주어진 행렬의 모든 열벡터가 서로 직교한다면, 이 행렬을 직교행렬이라 한다. 직교행렬은 직교좌표계를 의미한다.
정규직교행렬orthonomal matrix
주어진 행렬이 직교행렬이고 모든 열벡터의 크기가 1이라면 이 행렬을 정규직교행렬이라고 한다. 정규직교행렬은 정규직교좌표계를 의미한다.
선형시스템 Ax = b에서 행렬 A가 직교행렬이면, 해 x는 역행렬 A^-1의 계산 없이 다음과 같이 구현할 수 있다.
위의 그림을 분석해보면 우리는 이제 행렬의 연산을 좌표계로서 이해를 해야 한다는 것을 알 수 있다. 2차원에서 존재하는 어떤 한 점 v는 표준좌표계에서는 (6,2)라는 상대적 스칼라 값들을 가지지만 어떤 좌표계 A에서는 (x1,x2)라는 상대적인 스칼라값들을 가진다.
여기서 중요한 것은 (6, -2)를 (1, -2)에 투영하는 과정에서 얻는 스칼라 값이 곧 x1이라는 것이다.
왜냐하면 그래프로 보았을때 a1(1, -2)에 투영되는 값에서 a1을 스케일링 하는 스칼라 값은 x1의 정의와 일치하기 때문이다.
선형시스템 Ax = b에서 행렬 A가 정규직교행렬이면, 해 x는 역행렬 A^-1의 계산 없이 다음과 같이 구현할 수 있다.
주어진 행렬을 행렬 분해된 상태로 가지고 있으면 계산이 편한 경우가 많다.
행렬 Q와 R은 그 특성에 따라 (신기하게도)다음과 같이 이루어진다.
QR분해를 이용해 Ax = b 문제를 아래와 같이 나타내면
Ax = b -> (QR)x = b -> Q(Rx) = b -> Qy = b(단, Rx = y)
따라서 선형시스템을 다음과 같이 두 단계로 간단히 해결할 수 있음을 알 수있다.
1. Qb내적으로 y 구하기
2. Ry후방대치법으로 x 구하기
QR분해는 그람-슈미트 과정Gram-Schmidt process을 행렬로 코드화 한 것이다. 엄밀하게 말하자면
QR분해는 다음의 이유로 활용된다.
다만 QR분해에서 Q는 정규직교행렬로서 모든 행렬의 요소가 꽉찬 구조를 가지기 때문에 메모리 사용량이 많다.
임의의 크기 행렬에 대한 행렬분해 특이값분해SVD, Singular Value Division
특이값 분해는 주어진 행렬을 아래의 형태를 가지는 세 행렬의 곱으로 나누는 행렬분해이다. (행렬 자체가 임의의 크기를 가지고 있고, 숫자들이 형태를 가지고 있지 않은 행렬을)
행렬 U, D, T는 다음과 같은 특징을 가진다.
위 그래프를 분석하면
A : 원래의 행렬은 직교하지 않는 행렬이다.
회전행렬V : 처음에 2차원 행렬이 있는데 v로서 전체적인 입력을 회전을 시킨다고 생각(입력 차원인 R^n 공간에서의 회전)
확대축소행렬D : D라는 행렬에서는 회전된 행렬을 x를 4배 y를 1/2^2만큼 확대축소, 축을 증폭을 한다.(입력 차원인 R^n 공간에 대해 축방향으로의 확대축소를 한 후, R^n -> R^m으로 차원 변환)
회전행렬U : 숨어있는 z축을 생각해서 U의 행벡터의 순서대로 z축, y축, x축만큼 회전을 시키면 원래 행렬의 그래프가 되게 된다.(입력 차원인 R^m 공간에서의 회전)
A의 특이값 분해 U, D, V는 각각 열벡터의 순서대로 행렬 A의 열벡터가 어떤 방향으로 강한 응집성을 보이고 있는지를 분석한 것이다. U, D, V의 열벡터를 순서대로 p개 취한다면, 강한 응집성을 가지는 p개의 방향으로 수선의 발을 내린 A의 근사치 A'를 재구성할 수 있다.
강한 주파정보만 취할 수 있다?
위의 그림에서 증폭값 4를 취한다면 V에서는 1번째 행 U에서는 1번째 열만 취하게 된다. 결과적으로 주어진 행렬 A가 아니라 근사치 행렬로 A'를 구할 수 있다. 실제로는 응집성이 높은 부분에 대해서는 정보가 살아 있고 응집성이 낮은 부분은 정보가 사라진다고 말할 수 있다.
첫번째 component만을 취한 것을 그림으로 그려보면 다음과 같다.
V를 통해서 빨간색, 파란섹 두 벡터 모두가 루트 2분의 1만큼 수선의 발을 내렸다는 것을 알 수 있다.
그리고 증폭값이 큰 부분인 4를 취해서 U를 통해서 그 부분을 4배를 한다.
마지막으로 U를 통해서 회전을 한다.
가장 강력하게 응집성을 보이는 축에 대해서만 component를 유지한채 따라갔으므로 두 벡터 모두 같은 방향으로 나아가는 모습을 보인다. 원래의 그래프와는 달리 두 벡터가 아예 같은 방향을 보고 있다.
영상처리에서 많이 사용하는 선택적으로 취하는 방식이다.
주성분분석은 다수의 n차원 데이터에 대해, 데이터의 중심으로부터 데이터의 응집력이 좋은 n개의 직교 방향을 분석하는 방법이다.
주성분분석은 데이터의 공분산행렬covariance matrix에 대한 고유값 분해에 기반을 둔 직교분해이다. K개의 n차원 데이터{x1, x2, ..., xk}가 있을 때, 데이터의 중심 m과 공분산 행렬 C는 다음과 같이 구한다.
임의의 데이터 xi와 중심간의 차이를 가지는 벡터를 외적을 해서 행렬로 차원을 올린다. 이들의 평균을 구하면 공분산 행렬이 된다.
공분산행렬에 대한 주성분분석PCA는 아래와 같다.
SVD와는 다르게 양쪽의 직교행렬이 같은 행렬이지만 왼쪽은 열방향 오른쪽은 행방향으로 나누어진다. D는 그 값이 크게되면 그 방향으로의 데이터 응집성이 큰 것이다.
데이터가 6개 있는 그래프다.(이 부분은 지금 내가 이해하기가 어렵다.)
집합은 임의의 원소element를 수집하여 만듬 모듬이다.
집합이 연산에 닫혀 있다는 개념이 있다. 어떤 연산을 생각한 다음, 집합에서 임의의 원소를 뽑아 연산을 수행한 결과가 여전히 집합의 원소로 있다면, 해당 집합은 연산에 닫혀 있다고 한다.(연산을 한 원소가 여전히 그 집합에 속하는 경우)
공간은 다음의 두 연산에 닫혀 있는 집합니다.
다음과 같이 n벡터의 집합은 모두 공간이다.
앞으로 모든 n벡터 집합 R^n은 n차원 벡터공간이라 부를 수 있다.
행렬 A의 열벡터들에 대한 가능한 모든 선형조합의 결과를 모아 집합으로 구성할 수 있을 것이다. 이 집합을 열공간이라 하고 다음과 같이 표기한다.
파란색으로 그려진 것이 주어진 행렬 A의 열공간column space이다.
Consistent Linear System
선형시스템 Ax = b가 해를 가지면, 다음을 만족한다.
Inconsistent Linear System
선형시스템 Ax = b가 해가 없으면, 다음을 만족한다.
선형시스템 Ax = b에 대한 해가 없음에도 불구하고, 우리가 할 수 있는 최선이 무엇인가를 생각해보자. 행렬 A가 정의하는 열공간에서 우리의 목표 b와 가장 가까운 지점은 b를 열공간에 투영한 저점일 것이다. 즉, 달성가능한 최선의 목표 projwb를 생각할 수 있다.
따라서 Ax = b의 식은 다음과 같이 바뀌게 된다.
이 방법은 목표 b와 달성가능한 목표 b의 차이를 나타내는 벡터 (b - b)의 제곱길이가 될때 비로소 정화한 b_를 구할 수 있게 된다.
주어진 선형시스템의 양변에 전치행렬 A^T를 곱하면 최소제곱법의 해를 구할 수 있다. 위 과정으로 x를 구하는 문제에서 x_를 구하는 문제로 바뀌게 된다. 숫자세계에서는 양변에 같은 값을 곱하면 바뀌는게 없지만 선형시스템에 A^T를 곱하면 문제자체가 바뀌게 된다.
2차원 공간에 m개의 정점이 그림과 같이 있을때, 이를 잘 설명할 수 있는 직선 y = mx + b를 구하는 문제를 생각해 보자. 이를 선형회귀 문제라 한다.
선형시스템 구성 : 직선이 각 정점을 모두 지나간다고 가정하고 선형 시스템 Ax = b 구성(단, 주어진 모든 정점을 지나가는 직선은 존재하지 않으므로 선형시스템의 해는 존재하지 않음)
선형시스템 작성은 아래와 같은 과정을 따른다.
당연히 이것은 inconsistent한 선형시스템이다.
최소제곱법의 적용
양변에 A의 트랜스포스를 곱하는 순간 X_의 행렬은 다른 행렬로 바뀌고 A^Tb또한 다른 행렬로 바뀌어서 해는 다른 것으로 바뀌게 된다.
통계학이란
어떤 사건이 실험이나 관찰로부터 발생한 횟수
표현방법
도수분포표Frequency Distribution Table
막대그래프Bar graph : 질적자료, 수치적인 자료가 아니라 범주로 구분된 자료(남/녀, 소설/시/에세이)
히스토그램Histogram : 양적자료, 수집된 데이터가 숫자인 경우(키)
질적데이터 : 범주의 형태로 구분되어짐
AAAAAAAAAABBBBBBCCCCCCDDDDDDDDDDEEEEEEEGGGGGGGHHHH
도수분포표
막대그래프 : 범주가 명확히 구분되며, x축 순서에 의미가 없음
양적데이터
3.600 1.800 3.333 2.283 4.533 2.883 4.700 3.600 1.950 4.350 1.833 3.917 4.200 1.750 4.700 2.167 1.750
히스토그램 : 데이터가 연속적이며, x축 순서가 중요함
양적 자료를 줄기와 잎으로 구분
양적데이터를 정렬하고 일정한 방식으로 잘라준뒤(여기서는 소수점 3번째자리를 잎 부분으로) 줄기부분과 잎부분으로 나누어서 나열
도수를 전체 원소의 수로 나눈 것, 확률을 계산하는 데에 중요한 역할을 함
n개의 값들을 모두 더한 뒤 n으로 나눈 값
import statistics
statistics.mean(list)
평균의 경우 극단 값의 영향을 많이 받음, 데이터 해석에 영향을 받음
주어진 자료를 높은 쪽 절반과 낮은 쪽 절반으로 나누는 값을 의미
자료를 순서대로 나열했을 때 가운데 있는 값이며
자료의 수가 n일때
예시
편차(값과 평균의 차이)의 제곱의 합을 자료의 수로 나눈 값, 산포의 정도를 알기 위한 값
import statistics
statistics.variance(list)
import scipy.stats
scipy.stats.tvar(list)
분산의 양의 제곱근
#standard deviation
statistics.stdev(list)
#모분산, 모표준편차
statistics.pvariance(list)
statistics.pstdev(list)
import numpy
#모분산, 모표준편차
numpy.var(list)
numpy.std(list)
#표본분산, 표준편자
numpy.var(list, ddof=1)
numpy.std(list, ddof=1)
자료를 정렬하였을 때 가장 큰 값과 가장 작은 값의 차이
인공지능 관련해서 키, 몸무게, 눈동자의 크기 등과 같은 특성들을 수집하면 각각의 값들을 범위를 사용해서 조정하는 데에 쓰인다.
max(list) - min(list)
numpy.max(list) - numpy.min(list)
전체 자료를 정렬했을 때 1/4, 1/2, 3/4 위치에 있는 숫자
범위만 가지고는 극단적인 크기의 자료가 있을 경우 자료들의 대략적인 모양을 그리는데에 어려움이 있을 수 있음
Q1 : 제1사분위수
Q2 : median
Q3 : 제3사분위수
numpy.quantile(list, .25)
numpy.quantile(list, .5)
numpy.quantile(list, .75)
numpy.quantile(list, .60)
numpy.quantile(list, .75) - numpy.quantile(list, .25)
어떤 값이 평균으로부터 몇 표준편차 떨어져 있는지를 의미하는 값
절대적인 편차보다는 표준편차로부터 얼마나 떨어져 있는지가 의미가 있는경우가 많다.(50과 51보다 500과 501이 좀더 덜 떨어져 있다고 볼 수 있기에)
#실행값은 각각의 값들의 z-score를 모집단을 대상으로 계산한 리스트 값이다.
scipy.stats.zscore(list)
#실행값은 각각의 값들의 z-score를 표본을 대상으로 계산한 리스트 값이다.
scipy.stats.zscore(list, ddof=1)